annotate oldXMenu/Activate.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents 3765d76f7fa8
children a04b5f26a401
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
1 /* Copyright Massachusetts Institute of Technology 1985 */
Dave Love <fx@gnu.org>
parents:
diff changeset
2
Dave Love <fx@gnu.org>
parents:
diff changeset
3 #include "copyright.h"
Dave Love <fx@gnu.org>
parents:
diff changeset
4
Dave Love <fx@gnu.org>
parents:
diff changeset
5 /*
79743
43c5da03890c Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78306
diff changeset
6 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
76169
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
7 Free Software Foundation, Inc.
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
8
94791
3765d76f7fa8 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79743
diff changeset
9 This program is free software: you can redistribute it and/or modify
76169
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
10 it under the terms of the GNU General Public License as published by
94791
3765d76f7fa8 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79743
diff changeset
11 the Free Software Foundation, either version 3 of the License, or
3765d76f7fa8 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79743
diff changeset
12 (at your option) any later version.
76169
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
13
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
14 This program is distributed in the hope that it will be useful,
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
17 GNU General Public License for more details.
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
18
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
19 You should have received a copy of the GNU General Public License
94791
3765d76f7fa8 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79743
diff changeset
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
76169
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
21
73c4462d95fc Add GPL for FSF copyright.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
22 /*
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
23 * XMenu: MIT Project Athena, X Window system menu package
Dave Love <fx@gnu.org>
parents:
diff changeset
24 *
Dave Love <fx@gnu.org>
parents:
diff changeset
25 * XMenuActivate - Maps a given menu to the display and activates
Dave Love <fx@gnu.org>
parents:
diff changeset
26 * the menu for user selection. The user is allowed to
Dave Love <fx@gnu.org>
parents:
diff changeset
27 * specify which pane and selection will be current,
Dave Love <fx@gnu.org>
parents:
diff changeset
28 * the X and Y location of the menu (relative to the
Dave Love <fx@gnu.org>
parents:
diff changeset
29 * parent window) and the mouse button event mask that
Dave Love <fx@gnu.org>
parents:
diff changeset
30 * will be used to identify a selection request.
Dave Love <fx@gnu.org>
parents:
diff changeset
31 *
Dave Love <fx@gnu.org>
parents:
diff changeset
32 * A menu selection is shown to be current by placing
Dave Love <fx@gnu.org>
parents:
diff changeset
33 * a highlight box around the selection as the mouse
Dave Love <fx@gnu.org>
parents:
diff changeset
34 * cursor enters its active region. Inactive selections
Dave Love <fx@gnu.org>
parents:
diff changeset
35 * will not be highlighted. As the mouse cursor moved
Dave Love <fx@gnu.org>
parents:
diff changeset
36 * from one menu pane to another menu pane the pane being
Dave Love <fx@gnu.org>
parents:
diff changeset
37 * entered is raised and made current and the pane being
Dave Love <fx@gnu.org>
parents:
diff changeset
38 * left is lowered.
Dave Love <fx@gnu.org>
parents:
diff changeset
39 *
Dave Love <fx@gnu.org>
parents:
diff changeset
40 * Anytime XMenuActivate returns, the p_num and
Dave Love <fx@gnu.org>
parents:
diff changeset
41 * s_num are left at their last known values (i.e.,
Dave Love <fx@gnu.org>
parents:
diff changeset
42 * the last known current pane and selection indices).
Dave Love <fx@gnu.org>
parents:
diff changeset
43 * The following are the defined return states:
Dave Love <fx@gnu.org>
parents:
diff changeset
44 *
Dave Love <fx@gnu.org>
parents:
diff changeset
45 * 1) If at any time an error occurs the data
Dave Love <fx@gnu.org>
parents:
diff changeset
46 * pointer is left untouched and XM_FAILURE
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
47 * is returned.
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
48 *
Dave Love <fx@gnu.org>
parents:
diff changeset
49 * 2) When a selection request is received (i.e.,
Dave Love <fx@gnu.org>
parents:
diff changeset
50 * when the specified mouse event occurs) the
Dave Love <fx@gnu.org>
parents:
diff changeset
51 * data pointer will be set to the data
Dave Love <fx@gnu.org>
parents:
diff changeset
52 * associated with the particular selection
Dave Love <fx@gnu.org>
parents:
diff changeset
53 * current at the time of the selection request
Dave Love <fx@gnu.org>
parents:
diff changeset
54 * and XM_SUCCESS is returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
55 *
Dave Love <fx@gnu.org>
parents:
diff changeset
56 * 3) If no selection was current at the time a
Dave Love <fx@gnu.org>
parents:
diff changeset
57 * selection request is made the data pointer
Dave Love <fx@gnu.org>
parents:
diff changeset
58 * will be left untouched and XM_NO_SELECT will
Dave Love <fx@gnu.org>
parents:
diff changeset
59 * be returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
60 *
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
61 * 4) If the selection that was current at the time
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
62 * a selection request is made is not an active
Dave Love <fx@gnu.org>
parents:
diff changeset
63 * selection the data pointer will be left
Dave Love <fx@gnu.org>
parents:
diff changeset
64 * untouched and XM_IA_SELECT will be returned.
Dave Love <fx@gnu.org>
parents:
diff changeset
65 *
Dave Love <fx@gnu.org>
parents:
diff changeset
66 * Since X processes events in an asynchronous manner
Dave Love <fx@gnu.org>
parents:
diff changeset
67 * it is likely that XMenuActivate will encounter
Dave Love <fx@gnu.org>
parents:
diff changeset
68 * a "foreign event" while it is executing. Foreign
Dave Love <fx@gnu.org>
parents:
diff changeset
69 * events are handled in one of three ways:
Dave Love <fx@gnu.org>
parents:
diff changeset
70 *
Dave Love <fx@gnu.org>
parents:
diff changeset
71 * 1) The event is discarded. This is the default
Dave Love <fx@gnu.org>
parents:
diff changeset
72 * mode and requires no action on the part of the
Dave Love <fx@gnu.org>
parents:
diff changeset
73 * application.
Dave Love <fx@gnu.org>
parents:
diff changeset
74 *
Dave Love <fx@gnu.org>
parents:
diff changeset
75 * 2) The application has identified an asynchronous
Dave Love <fx@gnu.org>
parents:
diff changeset
76 * event handler that will be called and the
Dave Love <fx@gnu.org>
parents:
diff changeset
77 * foreign event handed off to it. Note:
Dave Love <fx@gnu.org>
parents:
diff changeset
78 * AEQ mode disables this mode temporarily.
Dave Love <fx@gnu.org>
parents:
diff changeset
79 *
Dave Love <fx@gnu.org>
parents:
diff changeset
80 * 3) The application has enabled asynchronous event
Dave Love <fx@gnu.org>
parents:
diff changeset
81 * queuing mode. In this mode all foreign events
Dave Love <fx@gnu.org>
parents:
diff changeset
82 * will be queued up untill XMenuActivate
Dave Love <fx@gnu.org>
parents:
diff changeset
83 * terminates; at which time they will be
Dave Love <fx@gnu.org>
parents:
diff changeset
84 * returned to the X event queue. As long as
Dave Love <fx@gnu.org>
parents:
diff changeset
85 * AEQ mode is enabled any asynchronous event
Dave Love <fx@gnu.org>
parents:
diff changeset
86 * handler as temporarily disabled.
Dave Love <fx@gnu.org>
parents:
diff changeset
87 *
Dave Love <fx@gnu.org>
parents:
diff changeset
88 * Any events encountered while taking down the menu
Dave Love <fx@gnu.org>
parents:
diff changeset
89 * (i.e., exposure events from occluded windows) will
Dave Love <fx@gnu.org>
parents:
diff changeset
90 * automatically be returned to the X event queue after
Dave Love <fx@gnu.org>
parents:
diff changeset
91 * XMenuActivate has cleaned the queue of any of its own
Dave Love <fx@gnu.org>
parents:
diff changeset
92 * events that are no longer needed.
Dave Love <fx@gnu.org>
parents:
diff changeset
93 *
Dave Love <fx@gnu.org>
parents:
diff changeset
94 * Author: Tony Della Fera, DEC
Dave Love <fx@gnu.org>
parents:
diff changeset
95 * March 12, 1986
Dave Love <fx@gnu.org>
parents:
diff changeset
96 *
Dave Love <fx@gnu.org>
parents:
diff changeset
97 */
Dave Love <fx@gnu.org>
parents:
diff changeset
98
Dave Love <fx@gnu.org>
parents:
diff changeset
99 #include <config.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
100 #include "XMenuInt.h"
59101
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
101 #include <X11/keysym.h>
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
102
44752
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
103 /* For debug, set this to 0 to not grab the keyboard on menu popup */
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
104 int x_menu_grab_keyboard = 1;
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
105
58167
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
106 typedef void (*Wait_func)();
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
107
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
108 static Wait_func wait_func;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
109 static void* wait_data;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
110
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
111 void
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
112 XMenuActivateSetWaitFunction (func, data)
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
113 Wait_func func;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
114 void *data;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
115 {
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
116 wait_func = func;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
117 wait_data = data;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
118 }
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
119
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
120 int
27457
bbfd0e676041 (XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents: 25858
diff changeset
121 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
122 help_callback)
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
123 register Display *display; /* Display to put menu on. */
Dave Love <fx@gnu.org>
parents:
diff changeset
124 register XMenu *menu; /* Menu to activate. */
Dave Love <fx@gnu.org>
parents:
diff changeset
125 int *p_num; /* Pane number selected. */
Dave Love <fx@gnu.org>
parents:
diff changeset
126 int *s_num; /* Selection number selected. */
Dave Love <fx@gnu.org>
parents:
diff changeset
127 int x_pos; /* X coordinate of menu position. */
Dave Love <fx@gnu.org>
parents:
diff changeset
128 int y_pos; /* Y coordinate of menu position. */
Dave Love <fx@gnu.org>
parents:
diff changeset
129 unsigned int event_mask; /* Mouse button event mask. */
Dave Love <fx@gnu.org>
parents:
diff changeset
130 char **data; /* Pointer to return data value. */
27457
bbfd0e676041 (XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents: 25858
diff changeset
131 void (* help_callback) (); /* Help callback. */
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
132 {
Dave Love <fx@gnu.org>
parents:
diff changeset
133 int status; /* X routine call status. */
Dave Love <fx@gnu.org>
parents:
diff changeset
134 int orig_x; /* Upper left menu origin X coord. */
Dave Love <fx@gnu.org>
parents:
diff changeset
135 int orig_y; /* Upper left menu origin Y coord. */
Dave Love <fx@gnu.org>
parents:
diff changeset
136 int ret_val; /* Return value. */
Dave Love <fx@gnu.org>
parents:
diff changeset
137
Dave Love <fx@gnu.org>
parents:
diff changeset
138 register XMPane *p_ptr; /* Current XMPane. */
Dave Love <fx@gnu.org>
parents:
diff changeset
139 register XMPane *event_xmp; /* Event XMPane pointer. */
Dave Love <fx@gnu.org>
parents:
diff changeset
140 register XMPane *cur_p; /* Current pane. */
Dave Love <fx@gnu.org>
parents:
diff changeset
141 register XMSelect *cur_s; /* Current selection. */
Dave Love <fx@gnu.org>
parents:
diff changeset
142 XMWindow *event_xmw; /* Event XMWindow pointer. */
Dave Love <fx@gnu.org>
parents:
diff changeset
143 XEvent event; /* X input event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
144 XEvent peek_event; /* X input peek ahead event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
145
Dave Love <fx@gnu.org>
parents:
diff changeset
146 Bool selection = False; /* Selection has been made. */
Dave Love <fx@gnu.org>
parents:
diff changeset
147 Bool forward = True; /* Moving forward in the pane list. */
Dave Love <fx@gnu.org>
parents:
diff changeset
148
Dave Love <fx@gnu.org>
parents:
diff changeset
149 Window root, child;
Dave Love <fx@gnu.org>
parents:
diff changeset
150 int root_x, root_y, win_x, win_y;
Dave Love <fx@gnu.org>
parents:
diff changeset
151 unsigned int mask;
59101
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
152 KeySym keysym;
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
153
Dave Love <fx@gnu.org>
parents:
diff changeset
154 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
155 * Define and allocate a foreign event queue to hold events
Dave Love <fx@gnu.org>
parents:
diff changeset
156 * that don't belong to XMenu. These events are later restored
Dave Love <fx@gnu.org>
parents:
diff changeset
157 * to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
158 */
Dave Love <fx@gnu.org>
parents:
diff changeset
159 typedef struct _xmeventque {
Dave Love <fx@gnu.org>
parents:
diff changeset
160 XEvent event;
Dave Love <fx@gnu.org>
parents:
diff changeset
161 struct _xmeventque *next;
Dave Love <fx@gnu.org>
parents:
diff changeset
162 } XMEventQue;
Dave Love <fx@gnu.org>
parents:
diff changeset
163
Dave Love <fx@gnu.org>
parents:
diff changeset
164 XMEventQue *feq = NULL; /* Foreign event queue. */
Dave Love <fx@gnu.org>
parents:
diff changeset
165 XMEventQue *feq_tmp; /* Foreign event queue temporary. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
166
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
167 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
168 * If there are no panes in the menu then return failure
Dave Love <fx@gnu.org>
parents:
diff changeset
169 * because the menu is not initialized.
Dave Love <fx@gnu.org>
parents:
diff changeset
170 */
Dave Love <fx@gnu.org>
parents:
diff changeset
171 if (menu->p_count == 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
172 _XMErrorCode = XME_NOT_INIT;
Dave Love <fx@gnu.org>
parents:
diff changeset
173 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
174 }
Dave Love <fx@gnu.org>
parents:
diff changeset
175
Dave Love <fx@gnu.org>
parents:
diff changeset
176 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
177 * Find the desired current pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
178 */
Dave Love <fx@gnu.org>
parents:
diff changeset
179 cur_p = _XMGetPanePtr(menu, *p_num);
Dave Love <fx@gnu.org>
parents:
diff changeset
180 if (cur_p == NULL) {
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 cur_p->activated = cur_p->active;
Dave Love <fx@gnu.org>
parents:
diff changeset
184
Dave Love <fx@gnu.org>
parents:
diff changeset
185 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
186 * Find the desired current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
187 * If the current selection index is out of range a null current selection
Dave Love <fx@gnu.org>
parents:
diff changeset
188 * will be assumed and the cursor will be placed in the current pane
Dave Love <fx@gnu.org>
parents:
diff changeset
189 * header.
Dave Love <fx@gnu.org>
parents:
diff changeset
190 */
Dave Love <fx@gnu.org>
parents:
diff changeset
191 cur_s = _XMGetSelectionPtr(cur_p, *s_num);
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 * Compute origin of menu so that cursor is in
Dave Love <fx@gnu.org>
parents:
diff changeset
195 * Correct pane and selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
196 */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
197 _XMTransToOrigin(display,
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
198 menu,
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
199 cur_p, cur_s,
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
200 x_pos, y_pos,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
201 &orig_x, &orig_y);
Dave Love <fx@gnu.org>
parents:
diff changeset
202 menu->x_pos = orig_x; /* Store X and Y coords of menu. */
Dave Love <fx@gnu.org>
parents:
diff changeset
203 menu->y_pos = orig_y;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
204
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
205 if (XMenuRecompute(display, menu) == XM_FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
206 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
207 }
Dave Love <fx@gnu.org>
parents:
diff changeset
208
Dave Love <fx@gnu.org>
parents:
diff changeset
209 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
210 * Flush the window creation queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
211 * This batches all window creates since lazy evaluation
Dave Love <fx@gnu.org>
parents:
diff changeset
212 * is more efficient than individual evaluation.
Dave Love <fx@gnu.org>
parents:
diff changeset
213 * This routine also does an XFlush().
Dave Love <fx@gnu.org>
parents:
diff changeset
214 */
Dave Love <fx@gnu.org>
parents:
diff changeset
215 if (_XMWinQueFlush(display, menu, cur_p, cur_s) == _FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
216 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
217 }
Dave Love <fx@gnu.org>
parents:
diff changeset
218
Dave Love <fx@gnu.org>
parents:
diff changeset
219 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
220 * Make sure windows are in correct order (in case we were passed
Dave Love <fx@gnu.org>
parents:
diff changeset
221 * an already created menu in incorrect order.)
Dave Love <fx@gnu.org>
parents:
diff changeset
222 */
Dave Love <fx@gnu.org>
parents:
diff changeset
223 for(p_ptr = menu->p_list->next; p_ptr != cur_p; p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
224 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
225 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
226 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
227
Dave Love <fx@gnu.org>
parents:
diff changeset
228 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
229 * Make sure all selection windows are mapped.
Dave Love <fx@gnu.org>
parents:
diff changeset
230 */
Dave Love <fx@gnu.org>
parents:
diff changeset
231 for (
Dave Love <fx@gnu.org>
parents:
diff changeset
232 p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
233 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
234 p_ptr = p_ptr->next
Dave Love <fx@gnu.org>
parents:
diff changeset
235 ){
Dave Love <fx@gnu.org>
parents:
diff changeset
236 XMapSubwindows(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
237 }
Dave Love <fx@gnu.org>
parents:
diff changeset
238
Dave Love <fx@gnu.org>
parents:
diff changeset
239 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
240 * Synchronize the X buffers and the event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
241 * From here on, all events in the queue that don't belong to
Dave Love <fx@gnu.org>
parents:
diff changeset
242 * XMenu are sent back to the application via an application
Dave Love <fx@gnu.org>
parents:
diff changeset
243 * provided event handler or discarded if the application has
Dave Love <fx@gnu.org>
parents:
diff changeset
244 * not provided an event handler.
Dave Love <fx@gnu.org>
parents:
diff changeset
245 */
Dave Love <fx@gnu.org>
parents:
diff changeset
246 XSync(display, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
247
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
248 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
249 * Grab the mouse for menu input.
Dave Love <fx@gnu.org>
parents:
diff changeset
250 */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
251
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
252 status = XGrabPointer(
Dave Love <fx@gnu.org>
parents:
diff changeset
253 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
254 menu->parent,
Dave Love <fx@gnu.org>
parents:
diff changeset
255 True,
Dave Love <fx@gnu.org>
parents:
diff changeset
256 event_mask,
Dave Love <fx@gnu.org>
parents:
diff changeset
257 GrabModeAsync,
Dave Love <fx@gnu.org>
parents:
diff changeset
258 GrabModeAsync,
Dave Love <fx@gnu.org>
parents:
diff changeset
259 None,
Dave Love <fx@gnu.org>
parents:
diff changeset
260 menu->mouse_cursor,
Dave Love <fx@gnu.org>
parents:
diff changeset
261 CurrentTime
Dave Love <fx@gnu.org>
parents:
diff changeset
262 );
44752
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
263 if (status == Success && x_menu_grab_keyboard)
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
264 {
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
265 status = XGrabKeyboard (display,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
266 menu->parent,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
267 False,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
268 GrabModeAsync,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
269 GrabModeAsync,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
270 CurrentTime);
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
271 if (status != Success)
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
272 XUngrabPointer(display, CurrentTime);
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
273 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
274
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
275 if (status == _X_FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
276 _XMErrorCode = XME_GRAB_MOUSE;
Dave Love <fx@gnu.org>
parents:
diff changeset
277 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
278 }
Dave Love <fx@gnu.org>
parents:
diff changeset
279
Dave Love <fx@gnu.org>
parents:
diff changeset
280 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
281 * Map the menu panes.
Dave Love <fx@gnu.org>
parents:
diff changeset
282 */
Dave Love <fx@gnu.org>
parents:
diff changeset
283 XMapWindow(display, cur_p->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
284 for (p_ptr = menu->p_list->next;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
285 p_ptr != cur_p;
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
286 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
287 XMapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
288 for (p_ptr = cur_p->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
289 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
290 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
291 XMapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
292
Dave Love <fx@gnu.org>
parents:
diff changeset
293 XRaiseWindow(display, cur_p->window); /* Make sure current */
Dave Love <fx@gnu.org>
parents:
diff changeset
294 /* pane is on top. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
295
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
296 cur_s = NULL; /* Clear current selection. */
Dave Love <fx@gnu.org>
parents:
diff changeset
297
Dave Love <fx@gnu.org>
parents:
diff changeset
298 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
299 * Begin event processing loop.
Dave Love <fx@gnu.org>
parents:
diff changeset
300 */
Dave Love <fx@gnu.org>
parents:
diff changeset
301 while (1) {
58167
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
302 if (wait_func) (*wait_func) (wait_data);
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
303 XNextEvent(display, &event); /* Get next event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
304 switch (event.type) { /* Dispatch on the event type. */
Dave Love <fx@gnu.org>
parents:
diff changeset
305 case Expose:
Dave Love <fx@gnu.org>
parents:
diff changeset
306 event_xmp = (XMPane *)XLookUpAssoc(display,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
307 menu->assoc_tab,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
308 event.xexpose.window);
Dave Love <fx@gnu.org>
parents:
diff changeset
309 if (event_xmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
310 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
311 * If AEQ mode is enabled then queue the event.
Dave Love <fx@gnu.org>
parents:
diff changeset
312 */
Dave Love <fx@gnu.org>
parents:
diff changeset
313 if (menu->aeq) {
Dave Love <fx@gnu.org>
parents:
diff changeset
314 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
315 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
316 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
317 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
318 }
Dave Love <fx@gnu.org>
parents:
diff changeset
319 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
320 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
321 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
322 }
Dave Love <fx@gnu.org>
parents:
diff changeset
323 else if (_XMEventHandler) (*_XMEventHandler)(&event);
Dave Love <fx@gnu.org>
parents:
diff changeset
324 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
325 }
Dave Love <fx@gnu.org>
parents:
diff changeset
326 if (event_xmp->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
327 XSetWindowBackground(display,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
328 event_xmp->window,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
329 menu->bkgnd_color);
Dave Love <fx@gnu.org>
parents:
diff changeset
330 }
Dave Love <fx@gnu.org>
parents:
diff changeset
331 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
332 XSetWindowBackgroundPixmap(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
333 event_xmp->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
334 menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
335 }
Dave Love <fx@gnu.org>
parents:
diff changeset
336 _XMRefreshPane(display, menu, event_xmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
337 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
338 case EnterNotify:
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
339 /*
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
340 * First wait a small period of time, and see
Dave Love <fx@gnu.org>
parents:
diff changeset
341 * if another EnterNotify event follows hard on the
Dave Love <fx@gnu.org>
parents:
diff changeset
342 * heels of this one. i.e., the user is simply
Dave Love <fx@gnu.org>
parents:
diff changeset
343 * "passing through". If so, ignore this one.
Dave Love <fx@gnu.org>
parents:
diff changeset
344 */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
345
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
346 event_xmw = (XMWindow *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
347 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
348 event.xcrossing.window);
Dave Love <fx@gnu.org>
parents:
diff changeset
349 if (event_xmw == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
350 if (event_xmw->type == SELECTION) {
Dave Love <fx@gnu.org>
parents:
diff changeset
351 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
352 * We have entered a selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
353 */
Dave Love <fx@gnu.org>
parents:
diff changeset
354 /* if (XPending(display) == 0) usleep(150000); */
Dave Love <fx@gnu.org>
parents:
diff changeset
355 if (XPending(display) != 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
356 XPeekEvent(display, &peek_event);
Dave Love <fx@gnu.org>
parents:
diff changeset
357 if(peek_event.type == LeaveNotify) {
Dave Love <fx@gnu.org>
parents:
diff changeset
358 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
359 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
360 }
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
361 cur_s = (XMSelect *)event_xmw;
30365
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
362 help_callback (cur_s->help_string,
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
363 cur_p->serial, cur_s->serial);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
364
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
365 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
366 * If the pane we are in is active and the
Dave Love <fx@gnu.org>
parents:
diff changeset
367 * selection entered is active then activate
Dave Love <fx@gnu.org>
parents:
diff changeset
368 * the selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
369 */
Dave Love <fx@gnu.org>
parents:
diff changeset
370 if (cur_p->active && cur_s->active > 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
371 cur_s->activated = 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
372 _XMRefreshSelection(display, menu, cur_s);
Dave Love <fx@gnu.org>
parents:
diff changeset
373 }
Dave Love <fx@gnu.org>
parents:
diff changeset
374 }
Dave Love <fx@gnu.org>
parents:
diff changeset
375 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
376 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
377 * We have entered a pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
378 */
Dave Love <fx@gnu.org>
parents:
diff changeset
379 /* if (XPending(display) == 0) usleep(150000); */
Dave Love <fx@gnu.org>
parents:
diff changeset
380 if (XPending(display) != 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
381 XPeekEvent(display, &peek_event);
Dave Love <fx@gnu.org>
parents:
diff changeset
382 if (peek_event.type == EnterNotify) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
383 }
Dave Love <fx@gnu.org>
parents:
diff changeset
384 XQueryPointer(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
385 menu->parent,
Dave Love <fx@gnu.org>
parents:
diff changeset
386 &root, &child,
Dave Love <fx@gnu.org>
parents:
diff changeset
387 &root_x, &root_y,
Dave Love <fx@gnu.org>
parents:
diff changeset
388 &win_x, &win_y,
Dave Love <fx@gnu.org>
parents:
diff changeset
389 &mask);
Dave Love <fx@gnu.org>
parents:
diff changeset
390 event_xmp = (XMPane *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
391 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
392 child);
Dave Love <fx@gnu.org>
parents:
diff changeset
393 if (event_xmp == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
394 if (event_xmp == cur_p) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
395 if (event_xmp->serial > cur_p->serial) forward = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
396 else forward = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
397 p_ptr = cur_p;
Dave Love <fx@gnu.org>
parents:
diff changeset
398 while (p_ptr != event_xmp) {
Dave Love <fx@gnu.org>
parents:
diff changeset
399 if (forward) p_ptr = p_ptr->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
400 else p_ptr = p_ptr->prev;
Dave Love <fx@gnu.org>
parents:
diff changeset
401 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
402 }
Dave Love <fx@gnu.org>
parents:
diff changeset
403 if (cur_p->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
404 cur_p->activated = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
405 XSetWindowBackgroundPixmap(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
406 cur_p->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
407 menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
408 _XMRefreshPane(display, menu, cur_p);
Dave Love <fx@gnu.org>
parents:
diff changeset
409 }
Dave Love <fx@gnu.org>
parents:
diff changeset
410 if (event_xmp->active) event_xmp->activated = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
411 #if 1
Dave Love <fx@gnu.org>
parents:
diff changeset
412 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
413 * i suspect the we don't get an EXPOSE event when backing
Dave Love <fx@gnu.org>
parents:
diff changeset
414 * store is enabled; the menu windows content is probably
Dave Love <fx@gnu.org>
parents:
diff changeset
415 * not drawn in when it should be in that case.
Dave Love <fx@gnu.org>
parents:
diff changeset
416 * in that case, this is probably an ugly fix!
Dave Love <fx@gnu.org>
parents:
diff changeset
417 * i hope someone more familiar with this code would
Dave Love <fx@gnu.org>
parents:
diff changeset
418 * take it from here. -- caveh@eng.sun.com.
Dave Love <fx@gnu.org>
parents:
diff changeset
419 */
Dave Love <fx@gnu.org>
parents:
diff changeset
420 XSetWindowBackground(display,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
421 event_xmp->window,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
422 menu->bkgnd_color);
Dave Love <fx@gnu.org>
parents:
diff changeset
423 _XMRefreshPane(display, menu, event_xmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
424 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
425 cur_p = event_xmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
426 }
Dave Love <fx@gnu.org>
parents:
diff changeset
427 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
428 case LeaveNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
429 event_xmw = (XMWindow *)XLookUpAssoc(
Dave Love <fx@gnu.org>
parents:
diff changeset
430 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
431 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
432 event.xcrossing.window
Dave Love <fx@gnu.org>
parents:
diff changeset
433 );
Dave Love <fx@gnu.org>
parents:
diff changeset
434 if (event_xmw == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
435 if(cur_s == NULL) break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
436
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
437 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
438 * If the current selection was activated then
Dave Love <fx@gnu.org>
parents:
diff changeset
439 * deactivate it.
Dave Love <fx@gnu.org>
parents:
diff changeset
440 */
Dave Love <fx@gnu.org>
parents:
diff changeset
441 if (cur_s->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
442 cur_s->activated = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
443 _XMRefreshSelection(display, menu, cur_s);
Dave Love <fx@gnu.org>
parents:
diff changeset
444 }
Dave Love <fx@gnu.org>
parents:
diff changeset
445 cur_s = NULL;
Dave Love <fx@gnu.org>
parents:
diff changeset
446 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
447
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
448 case ButtonPress:
Dave Love <fx@gnu.org>
parents:
diff changeset
449 case ButtonRelease:
Dave Love <fx@gnu.org>
parents:
diff changeset
450 *p_num = cur_p->serial;
Dave Love <fx@gnu.org>
parents:
diff changeset
451 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
452 * Check to see if there is a current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
453 */
Dave Love <fx@gnu.org>
parents:
diff changeset
454 if (cur_s != NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
455 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
456 * Set the selection number to the current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
457 */
Dave Love <fx@gnu.org>
parents:
diff changeset
458 *s_num = cur_s->serial;
Dave Love <fx@gnu.org>
parents:
diff changeset
459 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
460 * If the current selection was activated then
Dave Love <fx@gnu.org>
parents:
diff changeset
461 * we have a valid selection otherwise we have
Dave Love <fx@gnu.org>
parents:
diff changeset
462 * an inactive selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
463 */
Dave Love <fx@gnu.org>
parents:
diff changeset
464 if (cur_s->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
465 *data = cur_s->data;
Dave Love <fx@gnu.org>
parents:
diff changeset
466 ret_val = XM_SUCCESS;
Dave Love <fx@gnu.org>
parents:
diff changeset
467 }
Dave Love <fx@gnu.org>
parents:
diff changeset
468 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
469 ret_val = XM_IA_SELECT;
Dave Love <fx@gnu.org>
parents:
diff changeset
470 }
Dave Love <fx@gnu.org>
parents:
diff changeset
471 }
Dave Love <fx@gnu.org>
parents:
diff changeset
472 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
473 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
474 * No selection was current.
Dave Love <fx@gnu.org>
parents:
diff changeset
475 */
Dave Love <fx@gnu.org>
parents:
diff changeset
476 ret_val = XM_NO_SELECT;
Dave Love <fx@gnu.org>
parents:
diff changeset
477 }
Dave Love <fx@gnu.org>
parents:
diff changeset
478 selection = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
479 break;
59101
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
480 case KeyPress:
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
481 case KeyRelease:
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
482 keysym = XLookupKeysym (&event.xkey, 0);
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
483
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
484 /* Pop down on C-g and Escape. */
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
485 if ((keysym == XK_g && (event.xkey.state & ControlMask) != 0)
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
486 || keysym == XK_Escape) /* Any escape, ignore modifiers. */
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
487 {
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
488 ret_val = XM_NO_SELECT;
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
489 selection = True;
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
490 }
8aef5660523e * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g
Jan Djärv <jan.h.d@swipnet.se>
parents: 58167
diff changeset
491 break;
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
492 default:
Dave Love <fx@gnu.org>
parents:
diff changeset
493 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
494 * If AEQ mode is enabled then queue the event.
Dave Love <fx@gnu.org>
parents:
diff changeset
495 */
Dave Love <fx@gnu.org>
parents:
diff changeset
496 if (menu->aeq) {
Dave Love <fx@gnu.org>
parents:
diff changeset
497 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
498 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
499 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
500 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
501 }
Dave Love <fx@gnu.org>
parents:
diff changeset
502 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
503 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
504 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
505 }
Dave Love <fx@gnu.org>
parents:
diff changeset
506 else if (_XMEventHandler) (*_XMEventHandler)(&event);
Dave Love <fx@gnu.org>
parents:
diff changeset
507 }
Dave Love <fx@gnu.org>
parents:
diff changeset
508 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
509 * If a selection has been made, break out of the event loop.
Dave Love <fx@gnu.org>
parents:
diff changeset
510 */
Dave Love <fx@gnu.org>
parents:
diff changeset
511 if (selection == True) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
512 }
Dave Love <fx@gnu.org>
parents:
diff changeset
513
Dave Love <fx@gnu.org>
parents:
diff changeset
514 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
515 * Unmap the menu.
Dave Love <fx@gnu.org>
parents:
diff changeset
516 */
Dave Love <fx@gnu.org>
parents:
diff changeset
517 for ( p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
518 p_ptr != menu->p_list;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
519 p_ptr = p_ptr->next)
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
520 {
Dave Love <fx@gnu.org>
parents:
diff changeset
521 XUnmapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
522 }
Dave Love <fx@gnu.org>
parents:
diff changeset
523
Dave Love <fx@gnu.org>
parents:
diff changeset
524 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
525 * Ungrab the mouse.
Dave Love <fx@gnu.org>
parents:
diff changeset
526 */
Dave Love <fx@gnu.org>
parents:
diff changeset
527 XUngrabPointer(display, CurrentTime);
44752
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
528 XUngrabKeyboard(display, CurrentTime);
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
529
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
530 /*
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
531 * Restore bits under where the menu was if we managed
Dave Love <fx@gnu.org>
parents:
diff changeset
532 * to save them and free the pixmap.
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 * If there is a current selection deactivate it.
Dave Love <fx@gnu.org>
parents:
diff changeset
537 */
Dave Love <fx@gnu.org>
parents:
diff changeset
538 if (cur_s != NULL) cur_s->activated = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
539
Dave Love <fx@gnu.org>
parents:
diff changeset
540 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
541 * Deactivate the current pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
542 */
Dave Love <fx@gnu.org>
parents:
diff changeset
543 cur_p->activated = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
544 XSetWindowBackgroundPixmap(display, cur_p->window, menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
545
Dave Love <fx@gnu.org>
parents:
diff changeset
546 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
547 * Synchronize the X buffers and the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
548 */
Dave Love <fx@gnu.org>
parents:
diff changeset
549 XSync(display, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
550
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
551 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
552 * Dispatch any events remaining on the queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
553 */
Dave Love <fx@gnu.org>
parents:
diff changeset
554 while (QLength(display)) {
Dave Love <fx@gnu.org>
parents:
diff changeset
555 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
556 * Fetch the next event.
Dave Love <fx@gnu.org>
parents:
diff changeset
557 */
Dave Love <fx@gnu.org>
parents:
diff changeset
558 XNextEvent(display, &event);
Dave Love <fx@gnu.org>
parents:
diff changeset
559
Dave Love <fx@gnu.org>
parents:
diff changeset
560 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
561 * Discard any events left on the queue that belong to XMenu.
Dave Love <fx@gnu.org>
parents:
diff changeset
562 * All others are held and then returned to the event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
563 */
Dave Love <fx@gnu.org>
parents:
diff changeset
564 switch (event.type) {
Dave Love <fx@gnu.org>
parents:
diff changeset
565 case Expose:
Dave Love <fx@gnu.org>
parents:
diff changeset
566 case EnterNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
567 case LeaveNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
568 case ButtonPress:
Dave Love <fx@gnu.org>
parents:
diff changeset
569 case ButtonRelease:
Dave Love <fx@gnu.org>
parents:
diff changeset
570 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
571 * Does this event belong to one of XMenu's windows?
Dave Love <fx@gnu.org>
parents:
diff changeset
572 * If so, discard it and process the next event.
Dave Love <fx@gnu.org>
parents:
diff changeset
573 * If not fall through and treat it as a foreign event.
Dave Love <fx@gnu.org>
parents:
diff changeset
574 */
Dave Love <fx@gnu.org>
parents:
diff changeset
575 event_xmp = (XMPane *)XLookUpAssoc(
Dave Love <fx@gnu.org>
parents:
diff changeset
576 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
577 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
578 event.xbutton.window
Dave Love <fx@gnu.org>
parents:
diff changeset
579 );
Dave Love <fx@gnu.org>
parents:
diff changeset
580 if (event_xmp != NULL) continue;
Dave Love <fx@gnu.org>
parents:
diff changeset
581 default:
Dave Love <fx@gnu.org>
parents:
diff changeset
582 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
583 * This is a foreign event.
Dave Love <fx@gnu.org>
parents:
diff changeset
584 * Queue it for later return to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
585 */
Dave Love <fx@gnu.org>
parents:
diff changeset
586 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
587 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
588 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
589 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
590 }
Dave Love <fx@gnu.org>
parents:
diff changeset
591 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
592 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
593 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
594 }
Dave Love <fx@gnu.org>
parents:
diff changeset
595 }
Dave Love <fx@gnu.org>
parents:
diff changeset
596 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
597 * Return any foreign events that were queued to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
598 */
Dave Love <fx@gnu.org>
parents:
diff changeset
599 while (feq != NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
600 feq_tmp = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
601 XPutBackEvent(display, &feq_tmp->event);
Dave Love <fx@gnu.org>
parents:
diff changeset
602 feq = feq_tmp->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
603 free((char *)feq_tmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
604 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
605
58167
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
606 wait_func = 0;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
607
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
608 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
609 * Return successfully.
Dave Love <fx@gnu.org>
parents:
diff changeset
610 */
Dave Love <fx@gnu.org>
parents:
diff changeset
611 _XMErrorCode = XME_NO_ERROR;
Dave Love <fx@gnu.org>
parents:
diff changeset
612 return(ret_val);
Dave Love <fx@gnu.org>
parents:
diff changeset
613
Dave Love <fx@gnu.org>
parents:
diff changeset
614 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
615
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
616 /* arch-tag: 6b90b578-ecea-4328-b460-a0c96963f872
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
617 (do not change this comment) */