Mercurial > hg > xemacs-beta
comparison src/ExternalClient.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | b8cc9ab3f761 |
children |
comparison
equal
deleted
inserted
replaced
411:12e008d41344 | 412:697ef44129c6 |
---|---|
44 | 44 |
45 #include "ExternalClientP.h" | 45 #include "ExternalClientP.h" |
46 #include "extw-Xt.h" | 46 #include "extw-Xt.h" |
47 | 47 |
48 #ifdef TOOLTALK | 48 #ifdef TOOLTALK |
49 #include TT_C_H_FILE | 49 #include TT_C_H_PATH |
50 #endif | 50 #endif |
51 | 51 |
52 /* This is the client widget, used to communicate with an ExternalShell | 52 /* This is the client widget, used to communicate with an ExternalShell |
53 widget. */ | 53 widget. */ |
54 | 54 |
75 static int my_error_handler(Display *display, XErrorEvent *xev); | 75 static int my_error_handler(Display *display, XErrorEvent *xev); |
76 static int (*error_old_handler)(Display *, XErrorEvent *); | 76 static int (*error_old_handler)(Display *, XErrorEvent *); |
77 | 77 |
78 static XtResource resources[] = { | 78 static XtResource resources[] = { |
79 #define offset(field) XtOffset(ExternalClientWidget, externalClient.field) | 79 #define offset(field) XtOffset(ExternalClientWidget, externalClient.field) |
80 { XtNshellTimeout, XtCShellTimeout, | 80 { XtNshellTimeout, XtCShellTimeout, XtRInt, sizeof(int), |
81 XtRInt, sizeof (int), | 81 offset(shell_timeout), XtRImmediate,(XtPointer)DEFAULT_WM_TIMEOUT}, |
82 offset(shell_timeout), XtRImmediate,(XtPointer)DEFAULT_WM_TIMEOUT }, | 82 { XtNdeadShell, XtCDeadShell, XtRBoolean, sizeof(Boolean), |
83 { XtNdeadShell, XtCDeadShell, | 83 offset(dead_shell), XtRImmediate, (XtPointer)False}, |
84 XtRBoolean, sizeof (Boolean), | 84 #ifdef EXTW_USES_MOTIF |
85 offset(dead_shell), XtRImmediate, (XtPointer)False }, | 85 { XmNnavigationType, XmCNavigationType, XmRNavigationType, |
86 #ifdef EXTW_USES_MOTIF | 86 sizeof(XmNavigationType), XtOffset(ExternalClientWidget, |
87 { XmNnavigationType, XmCNavigationType, | 87 primitive.navigation_type), XtRImmediate, |
88 XmRNavigationType, sizeof (XmNavigationType), | 88 (XtPointer)XmTAB_GROUP}, |
89 XtOffset (ExternalClientWidget, primitive.navigation_type), | 89 #endif |
90 XtRImmediate, (XtPointer)XmTAB_GROUP }, | 90 { XtNemacsProcID, XtCEmacsProcID, XtRString, sizeof(String), |
91 #endif | 91 offset(emacs_procid), XtRImmediate, (XtPointer)NULL}, |
92 { XtNemacsProcID, XtCEmacsProcID, | 92 { XtNshellReadyCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), |
93 XtRString, sizeof (String), | 93 offset(shell_ready_callback), XtRImmediate, (XtPointer)NULL}, |
94 offset(emacs_procid), XtRImmediate, (XtPointer)NULL }, | 94 { XtNshellName, XtCShellName, XtRString, sizeof(String), |
95 { XtNshellReadyCallback, XtCCallback, | 95 offset(shell_name), XtRImmediate, (XtPointer)NULL}, |
96 XtRCallback, sizeof (XtCallbackList), | 96 { XtNuseToolTalk, XtCUseToolTalk, XtRBoolean, sizeof(Boolean), |
97 offset(shell_ready_callback), XtRImmediate, (XtPointer)NULL }, | 97 offset(use_tooltalk), XtRImmediate, (XtPointer)False} |
98 { XtNshellName, XtCShellName, | |
99 XtRString, sizeof (String), | |
100 offset(shell_name), XtRImmediate, (XtPointer)NULL }, | |
101 { XtNuseToolTalk, XtCUseToolTalk, | |
102 XtRBoolean, sizeof (Boolean), | |
103 offset(use_tooltalk), XtRImmediate, (XtPointer)False } | |
104 }; | 98 }; |
105 | 99 |
106 static XtActionsRec actions[] = { | 100 static XtActionsRec actions[] = { |
107 {"focusIn", ExternalClientFocusIn}, | 101 {"focusIn", ExternalClientFocusIn}, |
108 {"focusOut", ExternalClientFocusOut}, | 102 {"focusOut", ExternalClientFocusOut}, |
118 /* superclass */ (WidgetClass) &xmPrimitiveClassRec, | 112 /* superclass */ (WidgetClass) &xmPrimitiveClassRec, |
119 #else | 113 #else |
120 /* superclass */ (WidgetClass) &coreClassRec, | 114 /* superclass */ (WidgetClass) &coreClassRec, |
121 #endif | 115 #endif |
122 /* class_name */ "ExternalClient", | 116 /* class_name */ "ExternalClient", |
123 /* size */ sizeof (ExternalClientRec), | 117 /* size */ sizeof(ExternalClientRec), |
124 /* Class Initializer */ NULL, | 118 /* Class Initializer */ NULL, |
125 /* class_part_initialize*/ NULL, /* XtInheritClassPartInitialize, */ | 119 /* class_part_initialize*/ NULL, /* XtInheritClassPartInitialize, */ |
126 /* Class init'ed ? */ FALSE, | 120 /* Class init'ed ? */ FALSE, |
127 /* initialize */ externalClientInitialize, | 121 /* initialize */ externalClientInitialize, |
128 /* initialize_notify */ NULL, | 122 /* initialize_notify */ NULL, |
129 /* realize */ externalClientRealize, | 123 /* realize */ externalClientRealize, |
130 /* actions */ actions, | 124 /* actions */ actions, |
131 /* num_actions */ XtNumber (actions), | 125 /* num_actions */ XtNumber (actions), |
132 /* resources */ resources, | 126 /* resources */ resources, |
133 /* resource_count */ XtNumber (resources), | 127 /* resource_count */ XtNumber (resources), |
134 /* xrm_class */ NULLQUARK, | 128 /* xrm_class */ NULLQUARK, |
138 /* visible_interest */ TRUE, | 132 /* visible_interest */ TRUE, |
139 /* destroy */ Destroy, /* XtInheritDestroy, */ | 133 /* destroy */ Destroy, /* XtInheritDestroy, */ |
140 /* resize */ XtInheritResize, | 134 /* resize */ XtInheritResize, |
141 /* expose */ NULL, | 135 /* expose */ NULL, |
142 /* set_values */ NULL, /* XtInheritSetValues, */ | 136 /* set_values */ NULL, /* XtInheritSetValues, */ |
143 /* set_values_hook */ NULL, | 137 /* set_values_hook */ NULL, |
144 /* set_values_almost */ XtInheritSetValuesAlmost, | 138 /* set_values_almost */ XtInheritSetValuesAlmost, |
145 /* get_values_hook */ NULL, | 139 /* get_values_hook */ NULL, |
146 /* accept_focus */ NULL, | 140 /* accept_focus */ NULL, |
147 /* intrinsics version */ XtVersion, | 141 /* intrinsics version */ XtVersion, |
148 /* callback offsets */ NULL, | 142 /* callback offsets */ NULL, |
149 /* tm_table */ "", /* MUST NOT BE NULL or | 143 /* tm_table */ "", /* MUST NOT BE NULL or |
150 XtInheritTranslations in Motif!!!!! | 144 XtInheritTranslations in Motif!!!!! |
190 provide a proper inheritance mechanism for translations. | 184 provide a proper inheritance mechanism for translations. |
191 | 185 |
192 -- BPW | 186 -- BPW |
193 | 187 |
194 */ | 188 */ |
195 | 189 |
196 XtOverrideTranslations (new, | 190 XtOverrideTranslations (new, |
197 XtParseTranslationTable ("None<Key>Tab:\n" | 191 XtParseTranslationTable ("None<Key>Tab:\n" |
198 "<FocusIn>:focusIn()\n" | 192 "<FocusIn>:focusIn()\n" |
199 "<FocusOut>:focusOut()\n" | 193 "<FocusOut>:focusOut()\n" |
200 "<Enter>:enter()\n" | 194 "<Enter>:enter()\n" |
201 "<Leave>:leave()\n")); | 195 "<Leave>:leave()\n")); |
202 | 196 |
203 #endif | 197 #endif |
204 | 198 |
205 XtAddEventHandler (new, 0, TRUE, EventHandler, (XtPointer) NULL); | 199 XtAddEventHandler (new, 0, TRUE, EventHandler, (XtPointer) NULL); |
206 | 200 |
207 ecw->externalClient.shell_ready = False; | 201 ecw->externalClient.shell_ready = False; |
208 ecw->externalClient.has_focus = False; | 202 ecw->externalClient.has_focus = False; |
209 | 203 |
218 #ifdef TOOLTALK | 212 #ifdef TOOLTALK |
219 static Tt_callback_action | 213 static Tt_callback_action |
220 tt_callback(Tt_message m, Tt_pattern p) | 214 tt_callback(Tt_message m, Tt_pattern p) |
221 { | 215 { |
222 ExternalClientWidget ecw = (ExternalClientWidget)tt_message_user (m, 0); | 216 ExternalClientWidget ecw = (ExternalClientWidget)tt_message_user (m, 0); |
223 | 217 |
224 switch (tt_message_state(m)) | 218 switch (tt_message_state(m)) |
225 { | 219 { |
226 case TT_FAILED: | 220 case TT_FAILED: |
227 /* handle errors here */ | 221 /* handle errors here */ |
228 break; | 222 break; |
230 ecw->externalClient.shell_name = tt_message_arg_val (m, 2); | 224 ecw->externalClient.shell_name = tt_message_arg_val (m, 2); |
231 XtCallCallbackList ((Widget) ecw, | 225 XtCallCallbackList ((Widget) ecw, |
232 ecw->externalClient.shell_ready_callback, NULL); | 226 ecw->externalClient.shell_ready_callback, NULL); |
233 break; | 227 break; |
234 } | 228 } |
235 | 229 |
236 tt_message_destroy (m); | 230 tt_message_destroy (m); |
237 return TT_CALLBACK_PROCESSED; | 231 return TT_CALLBACK_PROCESSED; |
238 } | 232 } |
239 | 233 |
240 static void | 234 static void |
245 tt_message_op_set (m, "emacs-make-client-screen"); | 239 tt_message_op_set (m, "emacs-make-client-screen"); |
246 tt_message_scope_set (m, TT_SESSION); | 240 tt_message_scope_set (m, TT_SESSION); |
247 tt_message_class_set (m, TT_REQUEST); | 241 tt_message_class_set (m, TT_REQUEST); |
248 tt_message_arg_add (m, TT_IN, "string", name); | 242 tt_message_arg_add (m, TT_IN, "string", name); |
249 tt_message_iarg_add (m, TT_IN, "int", win); | 243 tt_message_iarg_add (m, TT_IN, "int", win); |
250 tt_message_arg_add (m, TT_OUT, "string", NULL); | 244 tt_message_arg_add (m, TT_OUT, "string", NULL); |
251 tt_message_user_set (m, 0, (void *)ecw); | 245 tt_message_user_set (m, 0, (void *)ecw); |
252 tt_message_callback_add (m, tt_callback); | 246 tt_message_callback_add (m, tt_callback); |
253 if (ecw->externalClient.emacs_procid) | 247 if (ecw->externalClient.emacs_procid) |
254 { | 248 { |
255 tt_message_address_set (m, TT_HANDLER); | 249 tt_message_address_set (m, TT_HANDLER); |
265 | 259 |
266 static void | 260 static void |
267 externalClientRealize (Widget w, XtValueMask *vm, XSetWindowAttributes *attrs) | 261 externalClientRealize (Widget w, XtValueMask *vm, XSetWindowAttributes *attrs) |
268 { | 262 { |
269 ExternalClientWidget ecw = (ExternalClientWidget)w; | 263 ExternalClientWidget ecw = (ExternalClientWidget)w; |
270 | 264 |
271 #ifdef EXTW_USES_MOTIF | 265 #ifdef EXTW_USES_MOTIF |
272 (*xmPrimitiveWidgetClass->core_class.realize) (w, vm, attrs); | 266 (*xmPrimitiveWidgetClass->core_class.realize) (w, vm, attrs); |
273 #else | 267 #else |
274 (*coreWidgetClass->core_class.realize) (w, vm, attrs); | 268 (*coreWidgetClass->core_class.realize) (w, vm, attrs); |
275 #endif | 269 #endif |
276 | 270 |
282 if (ecw->externalClient.use_tooltalk) | 276 if (ecw->externalClient.use_tooltalk) |
283 { | 277 { |
284 XSync (XtDisplay (w), False); | 278 XSync (XtDisplay (w), False); |
285 send_tooltalk_handshake (ecw, XtWindow (w), XtName (w)); | 279 send_tooltalk_handshake (ecw, XtWindow (w), XtName (w)); |
286 } | 280 } |
287 #endif | 281 #endif |
288 } | 282 } |
289 | 283 |
290 | 284 |
291 /***********************************************************************/ | 285 /***********************************************************************/ |
292 | 286 |
318 static Widget | 312 static Widget |
319 remove_ww (Window win) | 313 remove_ww (Window win) |
320 { | 314 { |
321 struct ww_list *w1, *w2; | 315 struct ww_list *w1, *w2; |
322 Widget wid = 0; | 316 Widget wid = 0; |
323 | 317 |
324 for (w1=ww_list, w2=w1->next; w2; w1=w2, w2=w2->next) | 318 for (w1=ww_list, w2=w1->next; w2; w1=w2, w2=w2->next) |
325 if (w2->win == win) | 319 if (w2->win == win) |
326 { | 320 { |
327 w1->next = w2->next; | 321 w1->next = w2->next; |
328 wid = w2->wid; | 322 wid = w2->wid; |
370 end_connection (ExternalClientWidget w) | 364 end_connection (ExternalClientWidget w) |
371 { | 365 { |
372 XSetWindowAttributes xswa; | 366 XSetWindowAttributes xswa; |
373 XtValueMask mask; | 367 XtValueMask mask; |
374 Widget wid = (Widget) w; | 368 Widget wid = (Widget) w; |
375 | 369 |
376 w->externalClient.shell_ready = False; | 370 w->externalClient.shell_ready = False; |
377 XtRemoveEventHandler (wid, w->externalClient.event_mask, | 371 XtRemoveEventHandler (wid, w->externalClient.event_mask, |
378 FALSE, MaskableEventHandler, (XtPointer) NULL); | 372 FALSE, MaskableEventHandler, (XtPointer) NULL); |
379 ComputeWindowAttributes (wid, &mask, &xswa); | 373 ComputeWindowAttributes (wid, &mask, &xswa); |
380 XChangeWindowAttributes (XtDisplay (wid), XtWindow (wid), mask, &xswa); | 374 XChangeWindowAttributes (XtDisplay (wid), XtWindow (wid), mask, &xswa); |
383 | 377 |
384 static int | 378 static int |
385 my_error_handler (Display *display, XErrorEvent *xev) | 379 my_error_handler (Display *display, XErrorEvent *xev) |
386 { | 380 { |
387 Widget wid; | 381 Widget wid; |
388 | 382 |
389 if (xev->error_code != BadWindow) | 383 if (xev->error_code != BadWindow) |
390 goto call_old; | 384 goto call_old; |
391 wid = remove_ww (xev->resourceid); | 385 wid = remove_ww (xev->resourceid); |
392 if (wid) | 386 if (wid) |
393 { | 387 { |
394 end_connection ((ExternalClientWidget) wid); | 388 end_connection ((ExternalClientWidget) wid); |
395 return 0; | 389 return 0; |
396 } | 390 } |
397 | 391 |
398 call_old: | 392 call_old: |
399 return error_old_handler (display, xev); | 393 return error_old_handler (display, xev); |
400 } | 394 } |
401 | 395 |
402 static void | 396 static void |
403 MaskableEventHandler (Widget wid, XtPointer closure, XEvent *event, | 397 MaskableEventHandler (Widget wid, XtPointer closure, XEvent *event, |
404 Boolean *continue_to_dispatch) | 398 Boolean *continue_to_dispatch) |
405 /* closure and continue_to_dispatch unused */ | 399 /* closure and continue_to_dispatch unused */ |
406 { | 400 { |
407 ExternalClientWidget w = (ExternalClientWidget) wid; | 401 ExternalClientWidget w = (ExternalClientWidget) wid; |
408 | 402 |
409 if (w->externalClient.shell_ready) | 403 if (w->externalClient.shell_ready) |
410 { | 404 { |
411 if (event->type == KeyPress || event->type == KeyRelease || | 405 if (event->type == KeyPress || event->type == KeyRelease || |
412 event->type == ButtonPress || event->type == ButtonRelease || | 406 event->type == ButtonPress || event->type == ButtonRelease || |
413 event->type == MotionNotify) | 407 event->type == MotionNotify) |
425 XSendEvent (XtDisplay (wid), w->externalClient.event_window, FALSE, 0, | 419 XSendEvent (XtDisplay (wid), w->externalClient.event_window, FALSE, 0, |
426 event); | 420 event); |
427 XSync (XtDisplay (wid), 0); /* make sure that any BadWindow errors | 421 XSync (XtDisplay (wid), 0); /* make sure that any BadWindow errors |
428 (meaning the server died) get handled | 422 (meaning the server died) get handled |
429 before XSendEvent is called again. */ | 423 before XSendEvent is called again. */ |
430 | 424 |
431 } | 425 } |
432 } | 426 } |
433 | 427 |
434 static void | 428 static void |
435 EventHandler (Widget wid, XtPointer closure, XEvent *event, | 429 EventHandler (Widget wid, XtPointer closure, XEvent *event, |
436 Boolean *continue_to_dispatch) | 430 Boolean *continue_to_dispatch) |
437 /* closure and continue_to_dispatch unused */ | 431 /* closure and continue_to_dispatch unused */ |
438 { | 432 { |
439 ExternalClientWidget w = (ExternalClientWidget) wid; | 433 ExternalClientWidget w = (ExternalClientWidget) wid; |
440 | 434 |
441 if (w->core.window != event->xany.window) | 435 if (w->core.window != event->xany.window) |
442 { | 436 { |
443 XtAppErrorMsg (XtWidgetToApplicationContext (wid), | 437 XtAppErrorMsg (XtWidgetToApplicationContext (wid), |
444 "invalidWindow","eventHandler",XtCXtToolkitError, | 438 "invalidWindow","eventHandler",XtCXtToolkitError, |
445 "Event with wrong window", | 439 "Event with wrong window", |
446 (String *)NULL, (Cardinal *)NULL); | 440 (String *)NULL, (Cardinal *)NULL); |
447 return; | 441 return; |
448 } | 442 } |
449 | 443 |
450 if (event->type == ClientMessage && | 444 if (event->type == ClientMessage && |
451 event->xclient.message_type == a_EXTW_NOTIFY && | 445 event->xclient.message_type == a_EXTW_NOTIFY && |
452 event->xclient.data.l[0] == extw_shell_send) | 446 event->xclient.data.l[0] == extw_shell_send) |
453 switch (event->xclient.data.l[1]) | 447 switch (event->xclient.data.l[1]) |
454 { | 448 { |
455 | 449 |
456 case extw_notify_qg: | 450 case extw_notify_qg: |
457 /* shell is alive again. */ | 451 /* shell is alive again. */ |
458 | 452 |
459 w->externalClient.dead_shell = False; | 453 w->externalClient.dead_shell = False; |
460 break; | 454 break; |
461 | 455 |
462 case extw_notify_gm: | 456 case extw_notify_gm: |
463 { | 457 { |
464 XtWidgetGeometry xwg, xwg_return; | 458 XtWidgetGeometry xwg, xwg_return; |
465 XtGeometryResult result; | 459 XtGeometryResult result; |
466 | 460 |
467 extw_get_geometry_value (XtDisplay (wid), XtWindow (wid), | 461 extw_get_geometry_value (XtDisplay (wid), XtWindow (wid), |
468 a_EXTW_GEOMETRY_MANAGER, &xwg); | 462 a_EXTW_GEOMETRY_MANAGER, &xwg); |
469 result = XtMakeGeometryRequest (wid, &xwg, &xwg_return); | 463 result = XtMakeGeometryRequest (wid, &xwg, &xwg_return); |
470 | 464 |
471 extw_send_geometry_value (XtDisplay (wid), XtWindow (wid), | 465 extw_send_geometry_value (XtDisplay (wid), XtWindow (wid), |
472 a_EXTW_GEOMETRY_MANAGER, extw_notify_gm, | 466 a_EXTW_GEOMETRY_MANAGER, extw_notify_gm, |
473 result == XtGeometryAlmost ? &xwg_return : | 467 result == XtGeometryAlmost ? &xwg_return : |
474 NULL, result); | 468 NULL, result); |
475 break; | 469 break; |
476 } | 470 } |
477 | 471 |
478 case extw_notify_init: | 472 case extw_notify_init: |
479 w->externalClient.shell_ready = True; | 473 w->externalClient.shell_ready = True; |
480 w->externalClient.event_window = event->xclient.data.l[2]; | 474 w->externalClient.event_window = event->xclient.data.l[2]; |
481 w->externalClient.event_mask = event->xclient.data.l[3]; | 475 w->externalClient.event_mask = event->xclient.data.l[3]; |
482 add_ww (w->externalClient.event_window, (Widget) w); | 476 add_ww (w->externalClient.event_window, (Widget) w); |
483 | 477 |
484 XtAddEventHandler (wid, w->externalClient.event_mask, | 478 XtAddEventHandler (wid, w->externalClient.event_mask, |
485 FALSE, MaskableEventHandler, (XtPointer) NULL); | 479 FALSE, MaskableEventHandler, (XtPointer) NULL); |
486 #ifdef EXTW_USES_MOTIF | 480 #ifdef EXTW_USES_MOTIF |
487 NOTIFY (w, extw_notify_init, | 481 NOTIFY (w, extw_notify_init, |
488 EXTW_TYPE_MOTIF, | 482 EXTW_TYPE_MOTIF, |
491 NOTIFY (w, extw_notify_init, | 485 NOTIFY (w, extw_notify_init, |
492 EXTW_TYPE_XT, | 486 EXTW_TYPE_XT, |
493 0, 0); | 487 0, 0); |
494 #endif | 488 #endif |
495 break; | 489 break; |
496 | 490 |
497 case extw_notify_end: | 491 case extw_notify_end: |
498 end_connection (w); | 492 end_connection (w); |
499 remove_ww (w->externalClient.event_window); | 493 remove_ww (w->externalClient.event_window); |
500 break; | 494 break; |
501 | 495 |
502 case extw_notify_set_focus: | 496 case extw_notify_set_focus: |
503 #ifdef EXTW_USES_MOTIF | 497 #ifdef EXTW_USES_MOTIF |
504 XmProcessTraversal (wid, XmTRAVERSE_CURRENT); | 498 XmProcessTraversal (wid, XmTRAVERSE_CURRENT); |
505 #else | 499 #else |
506 XtSetKeyboardFocus (wid, None); | 500 XtSetKeyboardFocus (wid, None); |
507 #endif | 501 #endif |
508 break; | 502 break; |
509 | 503 |
510 } | 504 } |
511 } | 505 } |
512 | 506 |
513 static void Destroy(wid) | 507 static void Destroy(wid) |
514 Widget wid; | 508 Widget wid; |
515 { | 509 { |
516 ExternalClientWidget w = (ExternalClientWidget)wid; | 510 ExternalClientWidget w = (ExternalClientWidget)wid; |
517 | 511 |
518 NOTIFY(w, extw_notify_end, 0, 0, 0); | 512 NOTIFY(w, extw_notify_end, 0, 0, 0); |
519 } | 513 } |
520 | 514 |
521 static XtGeometryResult QueryGeometry(gw, request, reply) | 515 static XtGeometryResult QueryGeometry(gw, request, reply) |
522 Widget gw; | 516 Widget gw; |
525 ExternalClientWidget w = (ExternalClientWidget)gw; | 519 ExternalClientWidget w = (ExternalClientWidget)gw; |
526 XEvent event; | 520 XEvent event; |
527 unsigned long request_num; | 521 unsigned long request_num; |
528 Display *display = XtDisplay(gw); | 522 Display *display = XtDisplay(gw); |
529 XtWidgetGeometry req = *request; /* don't modify caller's structure */ | 523 XtWidgetGeometry req = *request; /* don't modify caller's structure */ |
530 | 524 |
531 if (!XtIsRealized((Widget)w) || !w->externalClient.shell_ready) | 525 if (!XtIsRealized((Widget)w) || !w->externalClient.shell_ready) |
532 return XtGeometryYes; | 526 return XtGeometryYes; |
533 | 527 |
534 if (w->externalClient.dead_shell == TRUE) | 528 if (w->externalClient.dead_shell == TRUE) |
535 /* The shell is sick. */ | 529 /* The shell is sick. */ |
536 return XtGeometryNo; | 530 return XtGeometryNo; |
537 | 531 |
538 req.sibling = None; | 532 req.sibling = None; |
539 req.request_mode &= ~CWSibling; | 533 req.request_mode &= ~CWSibling; |
540 request_num = NextRequest(display); | 534 request_num = NextRequest(display); |
541 extw_send_geometry_value(XtDisplay(gw), XtWindow(gw), a_EXTW_QUERY_GEOMETRY, | 535 extw_send_geometry_value(XtDisplay(gw), XtWindow(gw), a_EXTW_QUERY_GEOMETRY, |
542 extw_notify_qg, &req, 0); | 536 extw_notify_qg, &req, 0); |
558 | 552 |
559 static void ExternalClientFocusIn (Widget w, XEvent *event, String *params, | 553 static void ExternalClientFocusIn (Widget w, XEvent *event, String *params, |
560 Cardinal *num_params) | 554 Cardinal *num_params) |
561 { | 555 { |
562 ExternalClientWidget ecw = (ExternalClientWidget) w; | 556 ExternalClientWidget ecw = (ExternalClientWidget) w; |
563 | 557 |
564 if (event->xfocus.send_event && !ecw->externalClient.has_focus) { | 558 if (event->xfocus.send_event && !ecw->externalClient.has_focus) { |
565 ecw->externalClient.has_focus = True; | 559 ecw->externalClient.has_focus = True; |
566 NOTIFY(ecw, extw_notify_focus_in, 0, 0, 0); | 560 NOTIFY(ecw, extw_notify_focus_in, 0, 0, 0); |
567 } | 561 } |
568 #ifdef EXTW_USES_MOTIF | 562 #ifdef EXTW_USES_MOTIF |
572 | 566 |
573 static void ExternalClientFocusOut (Widget w, XEvent *event, String *params, | 567 static void ExternalClientFocusOut (Widget w, XEvent *event, String *params, |
574 Cardinal *num_params) | 568 Cardinal *num_params) |
575 { | 569 { |
576 ExternalClientWidget ecw = (ExternalClientWidget) w; | 570 ExternalClientWidget ecw = (ExternalClientWidget) w; |
577 | 571 |
578 if (event->xfocus.send_event && ecw->externalClient.has_focus) { | 572 if (event->xfocus.send_event && ecw->externalClient.has_focus) { |
579 ecw->externalClient.has_focus = False; | 573 ecw->externalClient.has_focus = False; |
580 NOTIFY(ecw, extw_notify_focus_out, 0, 0, 0); | 574 NOTIFY(ecw, extw_notify_focus_out, 0, 0, 0); |
581 } | 575 } |
582 #ifdef EXTW_USES_MOTIF | 576 #ifdef EXTW_USES_MOTIF |
586 | 580 |
587 static void ExternalClientEnter (Widget w, XEvent *event, String *params, | 581 static void ExternalClientEnter (Widget w, XEvent *event, String *params, |
588 Cardinal *num_params) | 582 Cardinal *num_params) |
589 { | 583 { |
590 ExternalClientWidget ecw = (ExternalClientWidget) w; | 584 ExternalClientWidget ecw = (ExternalClientWidget) w; |
591 | 585 |
592 if ( | 586 if ( |
593 #ifdef EXTW_USES_MOTIF | 587 #ifdef EXTW_USES_MOTIF |
594 _XmGetFocusPolicy (w) != XmEXPLICIT && | 588 _XmGetFocusPolicy (w) != XmEXPLICIT && |
595 #endif | 589 #endif |
596 !ecw->externalClient.has_focus && | 590 !ecw->externalClient.has_focus && |
605 | 599 |
606 static void ExternalClientLeave (Widget w, XEvent *event, String *params, | 600 static void ExternalClientLeave (Widget w, XEvent *event, String *params, |
607 Cardinal *num_params) | 601 Cardinal *num_params) |
608 { | 602 { |
609 ExternalClientWidget ecw = (ExternalClientWidget) w; | 603 ExternalClientWidget ecw = (ExternalClientWidget) w; |
610 | 604 |
611 if ( | 605 if ( |
612 #ifdef EXTW_USES_MOTIF | 606 #ifdef EXTW_USES_MOTIF |
613 _XmGetFocusPolicy (w) != XmEXPLICIT && | 607 _XmGetFocusPolicy (w) != XmEXPLICIT && |
614 #endif | 608 #endif |
615 ecw->externalClient.has_focus && | 609 ecw->externalClient.has_focus && |