Mercurial > hg > xemacs-beta
annotate src/ExternalClient-Xlib.c @ 5576:071b810ceb18
Declare labels as line where appropriate; use #'labels, not #'flet, tests.
lisp/ChangeLog addition:
2011-10-03 Aidan Kehoe <kehoea@parhasard.net>
* simple.el (handle-pre-motion-command-current-command-is-motion):
Implement #'keysyms-equal with #'labels + (declare (inline ...)),
instead of abusing macrolet to the same end.
* specifier.el (let-specifier):
* mule/mule-cmds.el (describe-language-environment):
* mule/mule-cmds.el (set-language-environment-coding-systems):
* mule/mule-x-init.el (x-use-halfwidth-roman-font):
* faces.el (Face-frob-property):
* keymap.el (key-sequence-list-description):
* lisp-mode.el (construct-lisp-mode-menu):
* loadhist.el (unload-feature):
* mouse.el (default-mouse-track-check-for-activation):
Declare various labels inline in dumped files when that reduces
the size of the dumped image. Declaring labels inline is normally
only worthwhile for inner loops and so on, but it's reasonable
exercise of the related code to have these changes in core.
tests/ChangeLog addition:
2011-10-03 Aidan Kehoe <kehoea@parhasard.net>
* automated/case-tests.el (uni-mappings):
* automated/database-tests.el (delete-database-files):
* automated/hash-table-tests.el (iterations):
* automated/lisp-tests.el (test1):
* automated/lisp-tests.el (a):
* automated/lisp-tests.el (cl-floor):
* automated/lisp-tests.el (foo):
* automated/lisp-tests.el (list-nreverse):
* automated/lisp-tests.el (needs-lexical-context):
* automated/mule-tests.el (featurep):
* automated/os-tests.el (original-string):
* automated/os-tests.el (with):
* automated/symbol-tests.el (check-weak-list-unique):
Replace #'flet with #'labels where appropriate in these tests,
following my own advice on style in the docstrings of those
functions.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Mon, 03 Oct 2011 20:16:14 +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 } |
