annotate oldXMenu/Activate.c @ 36150:46e59561af4c

Display Vars node renamed Display Custom. Include info there about customizing cursor appearance. Clean up aggressive scrolling. Clarify horizontal scrolling discussion. Fix index entries for line number mode.
author Richard M. Stallman <rms@gnu.org>
date Sat, 17 Feb 2001 16:45:37 +0000
parents 5eece465cb5d
children 17275bfd5698
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30365
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
1 /* $Header: /gd/gnu/cvsroot/emacs/oldXMenu/Activate.c,v 1.2 2000/01/27 15:31:20 gerd Exp $ */
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
2 /* Copyright Massachusetts Institute of Technology 1985 */
Dave Love <fx@gnu.org>
parents:
diff changeset
3
Dave Love <fx@gnu.org>
parents:
diff changeset
4 #include "copyright.h"
Dave Love <fx@gnu.org>
parents:
diff changeset
5
Dave Love <fx@gnu.org>
parents:
diff changeset
6 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
7 * XMenu: MIT Project Athena, X Window system menu package
Dave Love <fx@gnu.org>
parents:
diff changeset
8 *
Dave Love <fx@gnu.org>
parents:
diff changeset
9 * XMenuActivate - Maps a given menu to the display and activates
Dave Love <fx@gnu.org>
parents:
diff changeset
10 * the menu for user selection. The user is allowed to
Dave Love <fx@gnu.org>
parents:
diff changeset
11 * specify which pane and selection will be current,
Dave Love <fx@gnu.org>
parents:
diff changeset
12 * the X and Y location of the menu (relative to the
Dave Love <fx@gnu.org>
parents:
diff changeset
13 * parent window) and the mouse button event mask that
Dave Love <fx@gnu.org>
parents:
diff changeset
14 * will be used to identify a selection request.
Dave Love <fx@gnu.org>
parents:
diff changeset
15 *
Dave Love <fx@gnu.org>
parents:
diff changeset
16 * A menu selection is shown to be current by placing
Dave Love <fx@gnu.org>
parents:
diff changeset
17 * a highlight box around the selection as the mouse
Dave Love <fx@gnu.org>
parents:
diff changeset
18 * cursor enters its active region. Inactive selections
Dave Love <fx@gnu.org>
parents:
diff changeset
19 * will not be highlighted. As the mouse cursor moved
Dave Love <fx@gnu.org>
parents:
diff changeset
20 * from one menu pane to another menu pane the pane being
Dave Love <fx@gnu.org>
parents:
diff changeset
21 * entered is raised and made current and the pane being
Dave Love <fx@gnu.org>
parents:
diff changeset
22 * left is lowered.
Dave Love <fx@gnu.org>
parents:
diff changeset
23 *
Dave Love <fx@gnu.org>
parents:
diff changeset
24 * Anytime XMenuActivate returns, the p_num and
Dave Love <fx@gnu.org>
parents:
diff changeset
25 * s_num are left at their last known values (i.e.,
Dave Love <fx@gnu.org>
parents:
diff changeset
26 * the last known current pane and selection indices).
Dave Love <fx@gnu.org>
parents:
diff changeset
27 * The following are the defined return states:
Dave Love <fx@gnu.org>
parents:
diff changeset
28 *
Dave Love <fx@gnu.org>
parents:
diff changeset
29 * 1) If at any time an error occurs the data
Dave Love <fx@gnu.org>
parents:
diff changeset
30 * pointer is left untouched and XM_FAILURE
Dave Love <fx@gnu.org>
parents:
diff changeset
31 * is returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
32 *
Dave Love <fx@gnu.org>
parents:
diff changeset
33 * 2) When a selection request is received (i.e.,
Dave Love <fx@gnu.org>
parents:
diff changeset
34 * when the specified mouse event occurs) the
Dave Love <fx@gnu.org>
parents:
diff changeset
35 * data pointer will be set to the data
Dave Love <fx@gnu.org>
parents:
diff changeset
36 * associated with the particular selection
Dave Love <fx@gnu.org>
parents:
diff changeset
37 * current at the time of the selection request
Dave Love <fx@gnu.org>
parents:
diff changeset
38 * and XM_SUCCESS is returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
39 *
Dave Love <fx@gnu.org>
parents:
diff changeset
40 * 3) If no selection was current at the time a
Dave Love <fx@gnu.org>
parents:
diff changeset
41 * selection request is made the data pointer
Dave Love <fx@gnu.org>
parents:
diff changeset
42 * will be left untouched and XM_NO_SELECT will
Dave Love <fx@gnu.org>
parents:
diff changeset
43 * be returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
44 *
Dave Love <fx@gnu.org>
parents:
diff changeset
45 * 4) If the selection that was current at the time
Dave Love <fx@gnu.org>
parents:
diff changeset
46 * a selection request is made is not an active
Dave Love <fx@gnu.org>
parents:
diff changeset
47 * selection the data pointer will be left
Dave Love <fx@gnu.org>
parents:
diff changeset
48 * untouched and XM_IA_SELECT will be returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
49 *
Dave Love <fx@gnu.org>
parents:
diff changeset
50 * Since X processes events in an asynchronous manner
Dave Love <fx@gnu.org>
parents:
diff changeset
51 * it is likely that XMenuActivate will encounter
Dave Love <fx@gnu.org>
parents:
diff changeset
52 * a "foreign event" while it is executing. Foreign
Dave Love <fx@gnu.org>
parents:
diff changeset
53 * events are handled in one of three ways:
Dave Love <fx@gnu.org>
parents:
diff changeset
54 *
Dave Love <fx@gnu.org>
parents:
diff changeset
55 * 1) The event is discarded. This is the default
Dave Love <fx@gnu.org>
parents:
diff changeset
56 * mode and requires no action on the part of the
Dave Love <fx@gnu.org>
parents:
diff changeset
57 * application.
Dave Love <fx@gnu.org>
parents:
diff changeset
58 *
Dave Love <fx@gnu.org>
parents:
diff changeset
59 * 2) The application has identified an asynchronous
Dave Love <fx@gnu.org>
parents:
diff changeset
60 * event handler that will be called and the
Dave Love <fx@gnu.org>
parents:
diff changeset
61 * foreign event handed off to it. Note:
Dave Love <fx@gnu.org>
parents:
diff changeset
62 * AEQ mode disables this mode temporarily.
Dave Love <fx@gnu.org>
parents:
diff changeset
63 *
Dave Love <fx@gnu.org>
parents:
diff changeset
64 * 3) The application has enabled asynchronous event
Dave Love <fx@gnu.org>
parents:
diff changeset
65 * queuing mode. In this mode all foreign events
Dave Love <fx@gnu.org>
parents:
diff changeset
66 * will be queued up untill XMenuActivate
Dave Love <fx@gnu.org>
parents:
diff changeset
67 * terminates; at which time they will be
Dave Love <fx@gnu.org>
parents:
diff changeset
68 * returned to the X event queue. As long as
Dave Love <fx@gnu.org>
parents:
diff changeset
69 * AEQ mode is enabled any asynchronous event
Dave Love <fx@gnu.org>
parents:
diff changeset
70 * handler as temporarily disabled.
Dave Love <fx@gnu.org>
parents:
diff changeset
71 *
Dave Love <fx@gnu.org>
parents:
diff changeset
72 * Any events encountered while taking down the menu
Dave Love <fx@gnu.org>
parents:
diff changeset
73 * (i.e., exposure events from occluded windows) will
Dave Love <fx@gnu.org>
parents:
diff changeset
74 * automatically be returned to the X event queue after
Dave Love <fx@gnu.org>
parents:
diff changeset
75 * XMenuActivate has cleaned the queue of any of its own
Dave Love <fx@gnu.org>
parents:
diff changeset
76 * events that are no longer needed.
Dave Love <fx@gnu.org>
parents:
diff changeset
77 *
Dave Love <fx@gnu.org>
parents:
diff changeset
78 * Author: Tony Della Fera, DEC
Dave Love <fx@gnu.org>
parents:
diff changeset
79 * March 12, 1986
Dave Love <fx@gnu.org>
parents:
diff changeset
80 *
Dave Love <fx@gnu.org>
parents:
diff changeset
81 */
Dave Love <fx@gnu.org>
parents:
diff changeset
82
Dave Love <fx@gnu.org>
parents:
diff changeset
83 #include <config.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
84 #include "XMenuInt.h"
Dave Love <fx@gnu.org>
parents:
diff changeset
85
Dave Love <fx@gnu.org>
parents:
diff changeset
86 int
27457
bbfd0e676041 (XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents: 25858
diff changeset
87 XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data,
bbfd0e676041 (XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents: 25858
diff changeset
88 help_callback)
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
89 register Display *display; /* Display to put menu on. */
Dave Love <fx@gnu.org>
parents:
diff changeset
90 register XMenu *menu; /* Menu to activate. */
Dave Love <fx@gnu.org>
parents:
diff changeset
91 int *p_num; /* Pane number selected. */
Dave Love <fx@gnu.org>
parents:
diff changeset
92 int *s_num; /* Selection number selected. */
Dave Love <fx@gnu.org>
parents:
diff changeset
93 int x_pos; /* X coordinate of menu position. */
Dave Love <fx@gnu.org>
parents:
diff changeset
94 int y_pos; /* Y coordinate of menu position. */
Dave Love <fx@gnu.org>
parents:
diff changeset
95 unsigned int event_mask; /* Mouse button event mask. */
Dave Love <fx@gnu.org>
parents:
diff changeset
96 char **data; /* Pointer to return data value. */
27457
bbfd0e676041 (XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents: 25858
diff changeset
97 void (* help_callback) (); /* Help callback. */
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
98 {
Dave Love <fx@gnu.org>
parents:
diff changeset
99 int status; /* X routine call status. */
Dave Love <fx@gnu.org>
parents:
diff changeset
100 int orig_x; /* Upper left menu origin X coord. */
Dave Love <fx@gnu.org>
parents:
diff changeset
101 int orig_y; /* Upper left menu origin Y coord. */
Dave Love <fx@gnu.org>
parents:
diff changeset
102 int ret_val; /* Return value. */
Dave Love <fx@gnu.org>
parents:
diff changeset
103
Dave Love <fx@gnu.org>
parents:
diff changeset
104 register XMPane *p_ptr; /* Current XMPane. */
Dave Love <fx@gnu.org>
parents:
diff changeset
105 register XMPane *event_xmp; /* Event XMPane pointer. */
Dave Love <fx@gnu.org>
parents:
diff changeset
106 register XMPane *cur_p; /* Current pane. */
Dave Love <fx@gnu.org>
parents:
diff changeset
107 register XMSelect *cur_s; /* Current selection. */
Dave Love <fx@gnu.org>
parents:
diff changeset
108 XMWindow *event_xmw; /* Event XMWindow pointer. */
Dave Love <fx@gnu.org>
parents:
diff changeset
109 XEvent event; /* X input event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
110 XEvent peek_event; /* X input peek ahead event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
111
Dave Love <fx@gnu.org>
parents:
diff changeset
112 Bool selection = False; /* Selection has been made. */
Dave Love <fx@gnu.org>
parents:
diff changeset
113 Bool forward = True; /* Moving forward in the pane list. */
Dave Love <fx@gnu.org>
parents:
diff changeset
114
Dave Love <fx@gnu.org>
parents:
diff changeset
115 Window root, child;
Dave Love <fx@gnu.org>
parents:
diff changeset
116 int root_x, root_y, win_x, win_y;
Dave Love <fx@gnu.org>
parents:
diff changeset
117 unsigned int mask;
Dave Love <fx@gnu.org>
parents:
diff changeset
118
Dave Love <fx@gnu.org>
parents:
diff changeset
119 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
120 * Define and allocate a foreign event queue to hold events
Dave Love <fx@gnu.org>
parents:
diff changeset
121 * that don't belong to XMenu. These events are later restored
Dave Love <fx@gnu.org>
parents:
diff changeset
122 * to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
123 */
Dave Love <fx@gnu.org>
parents:
diff changeset
124 typedef struct _xmeventque {
Dave Love <fx@gnu.org>
parents:
diff changeset
125 XEvent event;
Dave Love <fx@gnu.org>
parents:
diff changeset
126 struct _xmeventque *next;
Dave Love <fx@gnu.org>
parents:
diff changeset
127 } XMEventQue;
Dave Love <fx@gnu.org>
parents:
diff changeset
128
Dave Love <fx@gnu.org>
parents:
diff changeset
129 XMEventQue *feq = NULL; /* Foreign event queue. */
Dave Love <fx@gnu.org>
parents:
diff changeset
130 XMEventQue *feq_tmp; /* Foreign event queue temporary. */
Dave Love <fx@gnu.org>
parents:
diff changeset
131
Dave Love <fx@gnu.org>
parents:
diff changeset
132 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
133 * If there are no panes in the menu then return failure
Dave Love <fx@gnu.org>
parents:
diff changeset
134 * because the menu is not initialized.
Dave Love <fx@gnu.org>
parents:
diff changeset
135 */
Dave Love <fx@gnu.org>
parents:
diff changeset
136 if (menu->p_count == 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
137 _XMErrorCode = XME_NOT_INIT;
Dave Love <fx@gnu.org>
parents:
diff changeset
138 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
139 }
Dave Love <fx@gnu.org>
parents:
diff changeset
140
Dave Love <fx@gnu.org>
parents:
diff changeset
141 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
142 * Find the desired current pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
143 */
Dave Love <fx@gnu.org>
parents:
diff changeset
144 cur_p = _XMGetPanePtr(menu, *p_num);
Dave Love <fx@gnu.org>
parents:
diff changeset
145 if (cur_p == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
146 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
147 }
Dave Love <fx@gnu.org>
parents:
diff changeset
148 cur_p->activated = cur_p->active;
Dave Love <fx@gnu.org>
parents:
diff changeset
149
Dave Love <fx@gnu.org>
parents:
diff changeset
150 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
151 * Find the desired current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
152 * If the current selection index is out of range a null current selection
Dave Love <fx@gnu.org>
parents:
diff changeset
153 * will be assumed and the cursor will be placed in the current pane
Dave Love <fx@gnu.org>
parents:
diff changeset
154 * header.
Dave Love <fx@gnu.org>
parents:
diff changeset
155 */
Dave Love <fx@gnu.org>
parents:
diff changeset
156 cur_s = _XMGetSelectionPtr(cur_p, *s_num);
Dave Love <fx@gnu.org>
parents:
diff changeset
157
Dave Love <fx@gnu.org>
parents:
diff changeset
158 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
159 * Compute origin of menu so that cursor is in
Dave Love <fx@gnu.org>
parents:
diff changeset
160 * Correct pane and selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
161 */
Dave Love <fx@gnu.org>
parents:
diff changeset
162 _XMTransToOrigin(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
163 menu,
Dave Love <fx@gnu.org>
parents:
diff changeset
164 cur_p, cur_s,
Dave Love <fx@gnu.org>
parents:
diff changeset
165 x_pos, y_pos,
Dave Love <fx@gnu.org>
parents:
diff changeset
166 &orig_x, &orig_y);
Dave Love <fx@gnu.org>
parents:
diff changeset
167 menu->x_pos = orig_x; /* Store X and Y coords of menu. */
Dave Love <fx@gnu.org>
parents:
diff changeset
168 menu->y_pos = orig_y;
Dave Love <fx@gnu.org>
parents:
diff changeset
169
Dave Love <fx@gnu.org>
parents:
diff changeset
170 if (XMenuRecompute(display, menu) == XM_FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
171 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
172 }
Dave Love <fx@gnu.org>
parents:
diff changeset
173
Dave Love <fx@gnu.org>
parents:
diff changeset
174 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
175 * Flush the window creation queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
176 * This batches all window creates since lazy evaluation
Dave Love <fx@gnu.org>
parents:
diff changeset
177 * is more efficient than individual evaluation.
Dave Love <fx@gnu.org>
parents:
diff changeset
178 * This routine also does an XFlush().
Dave Love <fx@gnu.org>
parents:
diff changeset
179 */
Dave Love <fx@gnu.org>
parents:
diff changeset
180 if (_XMWinQueFlush(display, menu, cur_p, cur_s) == _FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
181 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
182 }
Dave Love <fx@gnu.org>
parents:
diff changeset
183
Dave Love <fx@gnu.org>
parents:
diff changeset
184 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
185 * Make sure windows are in correct order (in case we were passed
Dave Love <fx@gnu.org>
parents:
diff changeset
186 * an already created menu in incorrect order.)
Dave Love <fx@gnu.org>
parents:
diff changeset
187 */
Dave Love <fx@gnu.org>
parents:
diff changeset
188 for(p_ptr = menu->p_list->next; p_ptr != cur_p; p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
189 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
190 for(p_ptr = menu->p_list->prev; p_ptr != cur_p->prev; p_ptr = p_ptr->prev)
Dave Love <fx@gnu.org>
parents:
diff changeset
191 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
192
Dave Love <fx@gnu.org>
parents:
diff changeset
193 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
194 * Make sure all selection windows are mapped.
Dave Love <fx@gnu.org>
parents:
diff changeset
195 */
Dave Love <fx@gnu.org>
parents:
diff changeset
196 for (
Dave Love <fx@gnu.org>
parents:
diff changeset
197 p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
198 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
199 p_ptr = p_ptr->next
Dave Love <fx@gnu.org>
parents:
diff changeset
200 ){
Dave Love <fx@gnu.org>
parents:
diff changeset
201 XMapSubwindows(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
202 }
Dave Love <fx@gnu.org>
parents:
diff changeset
203
Dave Love <fx@gnu.org>
parents:
diff changeset
204 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
205 * Synchronize the X buffers and the event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
206 * From here on, all events in the queue that don't belong to
Dave Love <fx@gnu.org>
parents:
diff changeset
207 * XMenu are sent back to the application via an application
Dave Love <fx@gnu.org>
parents:
diff changeset
208 * provided event handler or discarded if the application has
Dave Love <fx@gnu.org>
parents:
diff changeset
209 * not provided an event handler.
Dave Love <fx@gnu.org>
parents:
diff changeset
210 */
Dave Love <fx@gnu.org>
parents:
diff changeset
211 XSync(display, 0);
Dave Love <fx@gnu.org>
parents:
diff changeset
212
Dave Love <fx@gnu.org>
parents:
diff changeset
213 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
214 * Grab the mouse for menu input.
Dave Love <fx@gnu.org>
parents:
diff changeset
215 */
Dave Love <fx@gnu.org>
parents:
diff changeset
216
Dave Love <fx@gnu.org>
parents:
diff changeset
217 status = XGrabPointer(
Dave Love <fx@gnu.org>
parents:
diff changeset
218 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
219 menu->parent,
Dave Love <fx@gnu.org>
parents:
diff changeset
220 True,
Dave Love <fx@gnu.org>
parents:
diff changeset
221 event_mask,
Dave Love <fx@gnu.org>
parents:
diff changeset
222 GrabModeAsync,
Dave Love <fx@gnu.org>
parents:
diff changeset
223 GrabModeAsync,
Dave Love <fx@gnu.org>
parents:
diff changeset
224 None,
Dave Love <fx@gnu.org>
parents:
diff changeset
225 menu->mouse_cursor,
Dave Love <fx@gnu.org>
parents:
diff changeset
226 CurrentTime
Dave Love <fx@gnu.org>
parents:
diff changeset
227 );
Dave Love <fx@gnu.org>
parents:
diff changeset
228 if (status == _X_FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
229 _XMErrorCode = XME_GRAB_MOUSE;
Dave Love <fx@gnu.org>
parents:
diff changeset
230 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
231 }
Dave Love <fx@gnu.org>
parents:
diff changeset
232
Dave Love <fx@gnu.org>
parents:
diff changeset
233 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
234 * Map the menu panes.
Dave Love <fx@gnu.org>
parents:
diff changeset
235 */
Dave Love <fx@gnu.org>
parents:
diff changeset
236 XMapWindow(display, cur_p->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
237 for (p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
238 p_ptr != cur_p;
Dave Love <fx@gnu.org>
parents:
diff changeset
239 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
240 XMapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
241 for (p_ptr = cur_p->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
242 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
243 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
244 XMapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
245
Dave Love <fx@gnu.org>
parents:
diff changeset
246 XRaiseWindow(display, cur_p->window); /* Make sure current */
Dave Love <fx@gnu.org>
parents:
diff changeset
247 /* pane is on top. */
Dave Love <fx@gnu.org>
parents:
diff changeset
248
Dave Love <fx@gnu.org>
parents:
diff changeset
249 cur_s = NULL; /* Clear current selection. */
Dave Love <fx@gnu.org>
parents:
diff changeset
250
Dave Love <fx@gnu.org>
parents:
diff changeset
251 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
252 * Begin event processing loop.
Dave Love <fx@gnu.org>
parents:
diff changeset
253 */
Dave Love <fx@gnu.org>
parents:
diff changeset
254 while (1) {
Dave Love <fx@gnu.org>
parents:
diff changeset
255 XNextEvent(display, &event); /* Get next event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
256 switch (event.type) { /* Dispatch on the event type. */
Dave Love <fx@gnu.org>
parents:
diff changeset
257 case Expose:
Dave Love <fx@gnu.org>
parents:
diff changeset
258 event_xmp = (XMPane *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
259 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
260 event.xexpose.window);
Dave Love <fx@gnu.org>
parents:
diff changeset
261 if (event_xmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
262 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
263 * If AEQ mode is enabled then queue the event.
Dave Love <fx@gnu.org>
parents:
diff changeset
264 */
Dave Love <fx@gnu.org>
parents:
diff changeset
265 if (menu->aeq) {
Dave Love <fx@gnu.org>
parents:
diff changeset
266 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
267 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
268 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
269 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
270 }
Dave Love <fx@gnu.org>
parents:
diff changeset
271 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
272 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
273 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
274 }
Dave Love <fx@gnu.org>
parents:
diff changeset
275 else if (_XMEventHandler) (*_XMEventHandler)(&event);
Dave Love <fx@gnu.org>
parents:
diff changeset
276 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
277 }
Dave Love <fx@gnu.org>
parents:
diff changeset
278 if (event_xmp->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
279 XSetWindowBackground(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
280 event_xmp->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
281 menu->bkgnd_color);
Dave Love <fx@gnu.org>
parents:
diff changeset
282 }
Dave Love <fx@gnu.org>
parents:
diff changeset
283 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
284 XSetWindowBackgroundPixmap(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
285 event_xmp->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
286 menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
287 }
Dave Love <fx@gnu.org>
parents:
diff changeset
288 _XMRefreshPane(display, menu, event_xmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
289 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
290 case EnterNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
291 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
292 * First wait a small period of time, and see
Dave Love <fx@gnu.org>
parents:
diff changeset
293 * if another EnterNotify event follows hard on the
Dave Love <fx@gnu.org>
parents:
diff changeset
294 * heels of this one. i.e., the user is simply
Dave Love <fx@gnu.org>
parents:
diff changeset
295 * "passing through". If so, ignore this one.
Dave Love <fx@gnu.org>
parents:
diff changeset
296 */
Dave Love <fx@gnu.org>
parents:
diff changeset
297
Dave Love <fx@gnu.org>
parents:
diff changeset
298 event_xmw = (XMWindow *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
299 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
300 event.xcrossing.window);
Dave Love <fx@gnu.org>
parents:
diff changeset
301 if (event_xmw == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
302 if (event_xmw->type == SELECTION) {
Dave Love <fx@gnu.org>
parents:
diff changeset
303 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
304 * We have entered a selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
305 */
Dave Love <fx@gnu.org>
parents:
diff changeset
306 /* if (XPending(display) == 0) usleep(150000); */
Dave Love <fx@gnu.org>
parents:
diff changeset
307 if (XPending(display) != 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
308 XPeekEvent(display, &peek_event);
Dave Love <fx@gnu.org>
parents:
diff changeset
309 if(peek_event.type == LeaveNotify) {
Dave Love <fx@gnu.org>
parents:
diff changeset
310 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
311 }
Dave Love <fx@gnu.org>
parents:
diff changeset
312 }
Dave Love <fx@gnu.org>
parents:
diff changeset
313 cur_s = (XMSelect *)event_xmw;
30365
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
314 help_callback (cur_s->help_string,
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
315 cur_p->serial, cur_s->serial);
27457
bbfd0e676041 (XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents: 25858
diff changeset
316
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
317 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
318 * If the pane we are in is active and the
Dave Love <fx@gnu.org>
parents:
diff changeset
319 * selection entered is active then activate
Dave Love <fx@gnu.org>
parents:
diff changeset
320 * the selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
321 */
Dave Love <fx@gnu.org>
parents:
diff changeset
322 if (cur_p->active && cur_s->active > 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
323 cur_s->activated = 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
324 _XMRefreshSelection(display, menu, cur_s);
Dave Love <fx@gnu.org>
parents:
diff changeset
325 }
Dave Love <fx@gnu.org>
parents:
diff changeset
326 }
Dave Love <fx@gnu.org>
parents:
diff changeset
327 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
328 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
329 * We have entered a pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
330 */
Dave Love <fx@gnu.org>
parents:
diff changeset
331 /* if (XPending(display) == 0) usleep(150000); */
Dave Love <fx@gnu.org>
parents:
diff changeset
332 if (XPending(display) != 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
333 XPeekEvent(display, &peek_event);
Dave Love <fx@gnu.org>
parents:
diff changeset
334 if (peek_event.type == EnterNotify) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
335 }
Dave Love <fx@gnu.org>
parents:
diff changeset
336 XQueryPointer(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
337 menu->parent,
Dave Love <fx@gnu.org>
parents:
diff changeset
338 &root, &child,
Dave Love <fx@gnu.org>
parents:
diff changeset
339 &root_x, &root_y,
Dave Love <fx@gnu.org>
parents:
diff changeset
340 &win_x, &win_y,
Dave Love <fx@gnu.org>
parents:
diff changeset
341 &mask);
Dave Love <fx@gnu.org>
parents:
diff changeset
342 event_xmp = (XMPane *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
343 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
344 child);
Dave Love <fx@gnu.org>
parents:
diff changeset
345 if (event_xmp == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
346 if (event_xmp == cur_p) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
347 if (event_xmp->serial > cur_p->serial) forward = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
348 else forward = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
349 p_ptr = cur_p;
Dave Love <fx@gnu.org>
parents:
diff changeset
350 while (p_ptr != event_xmp) {
Dave Love <fx@gnu.org>
parents:
diff changeset
351 if (forward) p_ptr = p_ptr->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
352 else p_ptr = p_ptr->prev;
Dave Love <fx@gnu.org>
parents:
diff changeset
353 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
354 }
Dave Love <fx@gnu.org>
parents:
diff changeset
355 if (cur_p->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
356 cur_p->activated = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
357 XSetWindowBackgroundPixmap(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
358 cur_p->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
359 menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
360 _XMRefreshPane(display, menu, cur_p);
Dave Love <fx@gnu.org>
parents:
diff changeset
361 }
Dave Love <fx@gnu.org>
parents:
diff changeset
362 if (event_xmp->active) event_xmp->activated = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
363 #if 1
Dave Love <fx@gnu.org>
parents:
diff changeset
364 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
365 * i suspect the we don't get an EXPOSE event when backing
Dave Love <fx@gnu.org>
parents:
diff changeset
366 * store is enabled; the menu windows content is probably
Dave Love <fx@gnu.org>
parents:
diff changeset
367 * not drawn in when it should be in that case.
Dave Love <fx@gnu.org>
parents:
diff changeset
368 * in that case, this is probably an ugly fix!
Dave Love <fx@gnu.org>
parents:
diff changeset
369 * i hope someone more familiar with this code would
Dave Love <fx@gnu.org>
parents:
diff changeset
370 * take it from here. -- caveh@eng.sun.com.
Dave Love <fx@gnu.org>
parents:
diff changeset
371 */
Dave Love <fx@gnu.org>
parents:
diff changeset
372 XSetWindowBackground(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
373 event_xmp->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
374 menu->bkgnd_color);
Dave Love <fx@gnu.org>
parents:
diff changeset
375 _XMRefreshPane(display, menu, event_xmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
376 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
377 cur_p = event_xmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
378 }
Dave Love <fx@gnu.org>
parents:
diff changeset
379 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
380 case LeaveNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
381 event_xmw = (XMWindow *)XLookUpAssoc(
Dave Love <fx@gnu.org>
parents:
diff changeset
382 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
383 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
384 event.xcrossing.window
Dave Love <fx@gnu.org>
parents:
diff changeset
385 );
Dave Love <fx@gnu.org>
parents:
diff changeset
386 if (event_xmw == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
387 if(cur_s == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
388
Dave Love <fx@gnu.org>
parents:
diff changeset
389 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
390 * If the current selection was activated then
Dave Love <fx@gnu.org>
parents:
diff changeset
391 * deactivate it.
Dave Love <fx@gnu.org>
parents:
diff changeset
392 */
Dave Love <fx@gnu.org>
parents:
diff changeset
393 if (cur_s->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
394 cur_s->activated = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
395 _XMRefreshSelection(display, menu, cur_s);
Dave Love <fx@gnu.org>
parents:
diff changeset
396 }
Dave Love <fx@gnu.org>
parents:
diff changeset
397 cur_s = NULL;
Dave Love <fx@gnu.org>
parents:
diff changeset
398 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
399
Dave Love <fx@gnu.org>
parents:
diff changeset
400 case ButtonPress:
Dave Love <fx@gnu.org>
parents:
diff changeset
401 case ButtonRelease:
Dave Love <fx@gnu.org>
parents:
diff changeset
402 *p_num = cur_p->serial;
Dave Love <fx@gnu.org>
parents:
diff changeset
403 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
404 * Check to see if there is a current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
405 */
Dave Love <fx@gnu.org>
parents:
diff changeset
406 if (cur_s != NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
407 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
408 * Set the selection number to the current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
409 */
Dave Love <fx@gnu.org>
parents:
diff changeset
410 *s_num = cur_s->serial;
Dave Love <fx@gnu.org>
parents:
diff changeset
411 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
412 * If the current selection was activated then
Dave Love <fx@gnu.org>
parents:
diff changeset
413 * we have a valid selection otherwise we have
Dave Love <fx@gnu.org>
parents:
diff changeset
414 * an inactive selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
415 */
Dave Love <fx@gnu.org>
parents:
diff changeset
416 if (cur_s->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
417 *data = cur_s->data;
Dave Love <fx@gnu.org>
parents:
diff changeset
418 ret_val = XM_SUCCESS;
Dave Love <fx@gnu.org>
parents:
diff changeset
419 }
Dave Love <fx@gnu.org>
parents:
diff changeset
420 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
421 ret_val = XM_IA_SELECT;
Dave Love <fx@gnu.org>
parents:
diff changeset
422 }
Dave Love <fx@gnu.org>
parents:
diff changeset
423 }
Dave Love <fx@gnu.org>
parents:
diff changeset
424 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
425 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
426 * No selection was current.
Dave Love <fx@gnu.org>
parents:
diff changeset
427 */
Dave Love <fx@gnu.org>
parents:
diff changeset
428 ret_val = XM_NO_SELECT;
Dave Love <fx@gnu.org>
parents:
diff changeset
429 }
Dave Love <fx@gnu.org>
parents:
diff changeset
430 selection = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
431 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
432 default:
Dave Love <fx@gnu.org>
parents:
diff changeset
433 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
434 * If AEQ mode is enabled then queue the event.
Dave Love <fx@gnu.org>
parents:
diff changeset
435 */
Dave Love <fx@gnu.org>
parents:
diff changeset
436 if (menu->aeq) {
Dave Love <fx@gnu.org>
parents:
diff changeset
437 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
438 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
439 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
440 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
441 }
Dave Love <fx@gnu.org>
parents:
diff changeset
442 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
443 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
444 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
445 }
Dave Love <fx@gnu.org>
parents:
diff changeset
446 else if (_XMEventHandler) (*_XMEventHandler)(&event);
Dave Love <fx@gnu.org>
parents:
diff changeset
447 }
Dave Love <fx@gnu.org>
parents:
diff changeset
448 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
449 * If a selection has been made, break out of the event loop.
Dave Love <fx@gnu.org>
parents:
diff changeset
450 */
Dave Love <fx@gnu.org>
parents:
diff changeset
451 if (selection == True) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
452 }
Dave Love <fx@gnu.org>
parents:
diff changeset
453
Dave Love <fx@gnu.org>
parents:
diff changeset
454 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
455 * Unmap the menu.
Dave Love <fx@gnu.org>
parents:
diff changeset
456 */
Dave Love <fx@gnu.org>
parents:
diff changeset
457 for ( p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
458 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
459 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
460 {
Dave Love <fx@gnu.org>
parents:
diff changeset
461 XUnmapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
462 }
Dave Love <fx@gnu.org>
parents:
diff changeset
463
Dave Love <fx@gnu.org>
parents:
diff changeset
464 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
465 * Ungrab the mouse.
Dave Love <fx@gnu.org>
parents:
diff changeset
466 */
Dave Love <fx@gnu.org>
parents:
diff changeset
467 XUngrabPointer(display, CurrentTime);
Dave Love <fx@gnu.org>
parents:
diff changeset
468
Dave Love <fx@gnu.org>
parents:
diff changeset
469 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
470 * Restore bits under where the menu was if we managed
Dave Love <fx@gnu.org>
parents:
diff changeset
471 * to save them and free the pixmap.
Dave Love <fx@gnu.org>
parents:
diff changeset
472 */
Dave Love <fx@gnu.org>
parents:
diff changeset
473
Dave Love <fx@gnu.org>
parents:
diff changeset
474 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
475 * If there is a current selection deactivate it.
Dave Love <fx@gnu.org>
parents:
diff changeset
476 */
Dave Love <fx@gnu.org>
parents:
diff changeset
477 if (cur_s != NULL) cur_s->activated = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
478
Dave Love <fx@gnu.org>
parents:
diff changeset
479 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
480 * Deactivate the current pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
481 */
Dave Love <fx@gnu.org>
parents:
diff changeset
482 cur_p->activated = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
483 XSetWindowBackgroundPixmap(display, cur_p->window, menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
484
Dave Love <fx@gnu.org>
parents:
diff changeset
485 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
486 * Synchronize the X buffers and the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
487 */
Dave Love <fx@gnu.org>
parents:
diff changeset
488 XSync(display, 0);
Dave Love <fx@gnu.org>
parents:
diff changeset
489
Dave Love <fx@gnu.org>
parents:
diff changeset
490 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
491 * Dispatch any events remaining on the queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
492 */
Dave Love <fx@gnu.org>
parents:
diff changeset
493 while (QLength(display)) {
Dave Love <fx@gnu.org>
parents:
diff changeset
494 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
495 * Fetch the next event.
Dave Love <fx@gnu.org>
parents:
diff changeset
496 */
Dave Love <fx@gnu.org>
parents:
diff changeset
497 XNextEvent(display, &event);
Dave Love <fx@gnu.org>
parents:
diff changeset
498
Dave Love <fx@gnu.org>
parents:
diff changeset
499 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
500 * Discard any events left on the queue that belong to XMenu.
Dave Love <fx@gnu.org>
parents:
diff changeset
501 * All others are held and then returned to the event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
502 */
Dave Love <fx@gnu.org>
parents:
diff changeset
503 switch (event.type) {
Dave Love <fx@gnu.org>
parents:
diff changeset
504 case Expose:
Dave Love <fx@gnu.org>
parents:
diff changeset
505 case EnterNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
506 case LeaveNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
507 case ButtonPress:
Dave Love <fx@gnu.org>
parents:
diff changeset
508 case ButtonRelease:
Dave Love <fx@gnu.org>
parents:
diff changeset
509 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
510 * Does this event belong to one of XMenu's windows?
Dave Love <fx@gnu.org>
parents:
diff changeset
511 * If so, discard it and process the next event.
Dave Love <fx@gnu.org>
parents:
diff changeset
512 * If not fall through and treat it as a foreign event.
Dave Love <fx@gnu.org>
parents:
diff changeset
513 */
Dave Love <fx@gnu.org>
parents:
diff changeset
514 event_xmp = (XMPane *)XLookUpAssoc(
Dave Love <fx@gnu.org>
parents:
diff changeset
515 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
516 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
517 event.xbutton.window
Dave Love <fx@gnu.org>
parents:
diff changeset
518 );
Dave Love <fx@gnu.org>
parents:
diff changeset
519 if (event_xmp != NULL) continue;
Dave Love <fx@gnu.org>
parents:
diff changeset
520 default:
Dave Love <fx@gnu.org>
parents:
diff changeset
521 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
522 * This is a foreign event.
Dave Love <fx@gnu.org>
parents:
diff changeset
523 * Queue it for later return to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
524 */
Dave Love <fx@gnu.org>
parents:
diff changeset
525 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
526 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
527 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
528 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
529 }
Dave Love <fx@gnu.org>
parents:
diff changeset
530 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
531 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
532 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
533 }
Dave Love <fx@gnu.org>
parents:
diff changeset
534 }
Dave Love <fx@gnu.org>
parents:
diff changeset
535 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
536 * Return any foreign events that were queued to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
537 */
Dave Love <fx@gnu.org>
parents:
diff changeset
538 while (feq != NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
539 feq_tmp = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
540 XPutBackEvent(display, &feq_tmp->event);
Dave Love <fx@gnu.org>
parents:
diff changeset
541 feq = feq_tmp->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
542 free((char *)feq_tmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
543 }
Dave Love <fx@gnu.org>
parents:
diff changeset
544
Dave Love <fx@gnu.org>
parents:
diff changeset
545 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
546 * Return successfully.
Dave Love <fx@gnu.org>
parents:
diff changeset
547 */
Dave Love <fx@gnu.org>
parents:
diff changeset
548 _XMErrorCode = XME_NO_ERROR;
Dave Love <fx@gnu.org>
parents:
diff changeset
549 return(ret_val);
Dave Love <fx@gnu.org>
parents:
diff changeset
550
Dave Love <fx@gnu.org>
parents:
diff changeset
551 }