Mercurial > hg > xemacs-beta
annotate src/ExternalClient-Xlib.c @ 5553:62edcc6a11ec
Add an assertion about argument order to #'apply-partially compiler macro
lisp/ChangeLog addition:
2011-08-24 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (apply-partially):
Add an assertion to this compiler macro, requiring that the order
of the placeholders corresponding to the arguments in the
constants vector of the constructed compiled function be the same
as the order of the arguments to #'apply-partially.
tests/ChangeLog addition:
2011-08-24 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Add a test of apply partially that depends on the relative order
of its arguments.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Wed, 24 Aug 2011 11:06:41 +0100 |
| parents | 2aa9cd456ae7 |
| children | 5d5aeb79edb4 |
| rev | line source |
|---|---|
| 0 | 1 /* External client, raw Xlib version. |
| 2 Copyright (C) 1993, 1994 Sun Microsystems, Inc. | |
| 3 | |
|
5405
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
4 This library is free software: you can redistribute it and/or modify it |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
5 under the terms of the GNU General Public License as published by the |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
6 Free Software Foundation, either version 3 of the License, or (at your |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
7 option) any later version. |
| 0 | 8 |
|
5405
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
9 This library is distributed in the hope that it will be useful, but WITHOUT |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
12 for more details. |
| 0 | 13 |
|
5405
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
|
2aa9cd456ae7
Move src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents:
2108
diff
changeset
|
15 along with this library. If not, see <http://www.gnu.org/licenses/>. */ |
| 0 | 16 |
| 17 /* Synched up with: Not in FSF. */ | |
| 18 | |
| 19 /* Written by Ben Wing, February 1994. */ | |
| 20 | |
| 21 #include <X11/Xlib.h> | |
| 22 #include <X11/Xresource.h> | |
| 23 #include <X11/Xutil.h> | |
| 24 #include "extw-Xlib.h" | |
| 25 | |
| 26 /* this is not a perfect solution, but otherwise we have to include all | |
| 27 of the Xt junk */ | |
| 28 | |
| 29 #define XtGeometryNo 1 | |
| 30 | |
| 31 #if (XlibSpecificationRelease < 5) | |
| 32 # define XPointer char * | |
| 33 #endif | |
| 34 | |
| 35 static int context_inited; | |
| 36 static XContext focus_context; | |
| 37 | |
| 38 /* does the specified window have the focus, given that the pointer just | |
| 39 entered (or left) the window (according to enter_p)? This question | |
| 40 does not have an obvious answer in X. (Basically, X sucks.) */ | |
| 41 | |
| 42 static int | |
| 43 window_has_focus_p (Display *display, Window win, int enter_p) | |
| 44 { | |
| 45 Window focuswin; | |
| 46 int dummy; | |
| 47 | |
| 48 XGetInputFocus(display, &focuswin, &dummy); | |
| 49 if (focuswin == PointerRoot) | |
| 50 return enter_p; | |
| 51 if (focuswin == win) | |
| 52 return True; | |
| 53 if (!enter_p) | |
| 54 return False; | |
| 55 do | |
| 56 { | |
| 57 Status st; | |
| 58 Window root_win, parent_win; | |
| 59 Window *child_win; | |
| 2108 | 60 unsigned int nchild; |
| 0 | 61 |
| 2108 | 62 st = XQueryTree (display, win, &root_win, &parent_win, &child_win, |
| 63 &nchild); | |
| 0 | 64 if (!st) |
| 65 return False; | |
| 66 XFree((XPointer)child_win); | |
| 67 if (parent_win == focuswin) | |
| 68 return True; | |
| 69 if (parent_win == root_win) | |
| 70 return False; | |
| 71 win = parent_win; | |
| 72 } | |
| 73 while (1); | |
| 74 } | |
| 75 | |
| 2108 | 76 |
| 0 | 77 /* External entry points when using XLib directly */ |
| 78 | |
| 79 void ExternalClientInitialize (Display *display, Window win); | |
| 80 void | |
| 81 ExternalClientInitialize (Display *display, Window win) | |
| 82 { | |
| 83 extw_initialize_atoms(display); | |
| 84 extw_which_side = extw_client_send; | |
| 85 if (!context_inited) | |
| 86 { | |
| 87 focus_context = XUniqueContext(); | |
| 88 context_inited = 1; | |
| 89 } | |
| 90 XSaveContext(display, win, focus_context, 0); | |
| 91 XSelectInput(display, win, EnterWindowMask | LeaveWindowMask | | |
| 92 FocusChangeMask); | |
| 93 } | |
| 94 | |
| 95 void ExternalClientEventHandler (Display *display, Window win, XEvent *event); | |
| 96 void | |
| 97 ExternalClientEventHandler (Display *display, Window win, XEvent *event) | |
| 98 { | |
| 99 if (win != event->xany.window) | |
| 100 return; | |
| 2108 | 101 |
| 0 | 102 if (event->type == ClientMessage && |
| 103 event->xclient.message_type == a_EXTW_NOTIFY && | |
| 104 event->xclient.data.l[0] == extw_shell_send) | |
| 105 switch (event->xclient.data.l[1]) { | |
| 106 case extw_notify_gm: | |
| 107 /* for the moment, just refuse geometry requests. */ | |
| 108 extw_send_notify_3(display, win, extw_notify_gm, XtGeometryNo, 0, 0); | |
| 109 break; | |
| 2108 | 110 |
| 0 | 111 case extw_notify_init: |
| 112 extw_send_notify_3(display, win, extw_notify_init, EXTW_TYPE_XLIB, 0, 0); | |
| 113 break; | |
| 2108 | 114 |
| 0 | 115 case extw_notify_end: |
| 116 XClearArea(display, win, 0, 0, 0, 0, True); | |
| 117 break; | |
| 118 } | |
| 119 else | |
| 120 { | |
| 121 int focus_status; | |
| 122 XPointer current_focus; | |
| 123 | |
| 124 if (event->type == FocusIn) | |
| 125 focus_status = 1; | |
| 126 else if (event->type == FocusOut) | |
| 127 focus_status = 0; | |
| 128 else if (event->type == EnterNotify && | |
| 129 event->xcrossing.detail != NotifyInferior) | |
| 130 focus_status = window_has_focus_p(display, win, 1); | |
| 131 else if (event->type == LeaveNotify && | |
| 132 event->xcrossing.detail != NotifyInferior) | |
| 133 focus_status = window_has_focus_p(display, win, 0); | |
| 134 else | |
| 135 return; | |
| 136 XFindContext(display, win, focus_context, ¤t_focus); | |
| 137 if (focus_status != (int) current_focus) | |
| 138 { | |
| 139 XSaveContext(display, win, focus_context, (XPointer) focus_status); | |
| 140 extw_send_notify_3(display, win, focus_status ? | |
| 141 extw_notify_focus_in : extw_notify_focus_out, | |
| 142 0, 0, 0); | |
| 143 } | |
| 144 } | |
| 145 } |
