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 &&