annotate oldXMenu/Activate.c @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 5cc91198ffb2
children 417b1e4d63cd
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 /*
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 100953
diff changeset
6 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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 static Wait_func wait_func;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
107 static void* wait_data;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
108
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
109 void
109124
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
110 XMenuActivateSetWaitFunction (Wait_func func, void *data)
58167
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
111 {
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
112 wait_func = func;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
113 wait_data = data;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
114 }
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
115
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
116 int
109124
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
117 XMenuActivate(
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
118 register Display *display, /* Display to put menu on. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
119 register XMenu *menu, /* Menu to activate. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
120 int *p_num, /* Pane number selected. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
121 int *s_num, /* Selection number selected. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
122 int x_pos, /* X coordinate of menu position. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
123 int y_pos, /* Y coordinate of menu position. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
124 unsigned int event_mask, /* Mouse button event mask. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
125 char **data, /* Pointer to return data value. */
5cc91198ffb2 Convert function definitions in oldXMenu to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
126 void (* help_callback) (char *, int, int)) /* Help callback. */
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
127 {
Dave Love <fx@gnu.org>
parents:
diff changeset
128 int status; /* X routine call status. */
Dave Love <fx@gnu.org>
parents:
diff changeset
129 int orig_x; /* Upper left menu origin X coord. */
Dave Love <fx@gnu.org>
parents:
diff changeset
130 int orig_y; /* Upper left menu origin Y coord. */
Dave Love <fx@gnu.org>
parents:
diff changeset
131 int ret_val; /* Return value. */
Dave Love <fx@gnu.org>
parents:
diff changeset
132
Dave Love <fx@gnu.org>
parents:
diff changeset
133 register XMPane *p_ptr; /* Current XMPane. */
Dave Love <fx@gnu.org>
parents:
diff changeset
134 register XMPane *event_xmp; /* Event XMPane pointer. */
Dave Love <fx@gnu.org>
parents:
diff changeset
135 register XMPane *cur_p; /* Current pane. */
Dave Love <fx@gnu.org>
parents:
diff changeset
136 register XMSelect *cur_s; /* Current selection. */
Dave Love <fx@gnu.org>
parents:
diff changeset
137 XMWindow *event_xmw; /* Event XMWindow pointer. */
Dave Love <fx@gnu.org>
parents:
diff changeset
138 XEvent event; /* X input event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
139 XEvent peek_event; /* X input peek ahead event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
140
Dave Love <fx@gnu.org>
parents:
diff changeset
141 Bool selection = False; /* Selection has been made. */
Dave Love <fx@gnu.org>
parents:
diff changeset
142 Bool forward = True; /* Moving forward in the pane list. */
Dave Love <fx@gnu.org>
parents:
diff changeset
143
Dave Love <fx@gnu.org>
parents:
diff changeset
144 Window root, child;
Dave Love <fx@gnu.org>
parents:
diff changeset
145 int root_x, root_y, win_x, win_y;
Dave Love <fx@gnu.org>
parents:
diff changeset
146 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
147 KeySym keysym;
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
148
Dave Love <fx@gnu.org>
parents:
diff changeset
149 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
150 * Define and allocate a foreign event queue to hold events
Dave Love <fx@gnu.org>
parents:
diff changeset
151 * that don't belong to XMenu. These events are later restored
Dave Love <fx@gnu.org>
parents:
diff changeset
152 * to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
153 */
Dave Love <fx@gnu.org>
parents:
diff changeset
154 typedef struct _xmeventque {
Dave Love <fx@gnu.org>
parents:
diff changeset
155 XEvent event;
Dave Love <fx@gnu.org>
parents:
diff changeset
156 struct _xmeventque *next;
Dave Love <fx@gnu.org>
parents:
diff changeset
157 } XMEventQue;
Dave Love <fx@gnu.org>
parents:
diff changeset
158
Dave Love <fx@gnu.org>
parents:
diff changeset
159 XMEventQue *feq = NULL; /* Foreign event queue. */
Dave Love <fx@gnu.org>
parents:
diff changeset
160 XMEventQue *feq_tmp; /* Foreign event queue temporary. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
161
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
162 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
163 * If there are no panes in the menu then return failure
Dave Love <fx@gnu.org>
parents:
diff changeset
164 * because the menu is not initialized.
Dave Love <fx@gnu.org>
parents:
diff changeset
165 */
Dave Love <fx@gnu.org>
parents:
diff changeset
166 if (menu->p_count == 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
167 _XMErrorCode = XME_NOT_INIT;
Dave Love <fx@gnu.org>
parents:
diff changeset
168 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
169 }
Dave Love <fx@gnu.org>
parents:
diff changeset
170
Dave Love <fx@gnu.org>
parents:
diff changeset
171 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
172 * Find the desired current pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
173 */
Dave Love <fx@gnu.org>
parents:
diff changeset
174 cur_p = _XMGetPanePtr(menu, *p_num);
Dave Love <fx@gnu.org>
parents:
diff changeset
175 if (cur_p == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
176 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
177 }
Dave Love <fx@gnu.org>
parents:
diff changeset
178 cur_p->activated = cur_p->active;
Dave Love <fx@gnu.org>
parents:
diff changeset
179
Dave Love <fx@gnu.org>
parents:
diff changeset
180 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
181 * Find the desired current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
182 * If the current selection index is out of range a null current selection
Dave Love <fx@gnu.org>
parents:
diff changeset
183 * will be assumed and the cursor will be placed in the current pane
Dave Love <fx@gnu.org>
parents:
diff changeset
184 * header.
Dave Love <fx@gnu.org>
parents:
diff changeset
185 */
Dave Love <fx@gnu.org>
parents:
diff changeset
186 cur_s = _XMGetSelectionPtr(cur_p, *s_num);
Dave Love <fx@gnu.org>
parents:
diff changeset
187
Dave Love <fx@gnu.org>
parents:
diff changeset
188 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
189 * Compute origin of menu so that cursor is in
Dave Love <fx@gnu.org>
parents:
diff changeset
190 * Correct pane and selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
191 */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
192 _XMTransToOrigin(display,
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
193 menu,
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
194 cur_p, cur_s,
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
195 x_pos, y_pos,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
196 &orig_x, &orig_y);
Dave Love <fx@gnu.org>
parents:
diff changeset
197 menu->x_pos = orig_x; /* Store X and Y coords of menu. */
Dave Love <fx@gnu.org>
parents:
diff changeset
198 menu->y_pos = orig_y;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
199
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
200 if (XMenuRecompute(display, menu) == XM_FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
201 return(XM_FAILURE);
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 * Flush the window creation queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
206 * This batches all window creates since lazy evaluation
Dave Love <fx@gnu.org>
parents:
diff changeset
207 * is more efficient than individual evaluation.
Dave Love <fx@gnu.org>
parents:
diff changeset
208 * This routine also does an XFlush().
Dave Love <fx@gnu.org>
parents:
diff changeset
209 */
Dave Love <fx@gnu.org>
parents:
diff changeset
210 if (_XMWinQueFlush(display, menu, cur_p, cur_s) == _FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
211 return(XM_FAILURE);
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 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
215 * Make sure windows are in correct order (in case we were passed
Dave Love <fx@gnu.org>
parents:
diff changeset
216 * an already created menu in incorrect order.)
Dave Love <fx@gnu.org>
parents:
diff changeset
217 */
Dave Love <fx@gnu.org>
parents:
diff changeset
218 for(p_ptr = menu->p_list->next; p_ptr != cur_p; p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
219 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
220 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
221 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
222
Dave Love <fx@gnu.org>
parents:
diff changeset
223 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
224 * Make sure all selection windows are mapped.
Dave Love <fx@gnu.org>
parents:
diff changeset
225 */
Dave Love <fx@gnu.org>
parents:
diff changeset
226 for (
Dave Love <fx@gnu.org>
parents:
diff changeset
227 p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
228 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
229 p_ptr = p_ptr->next
Dave Love <fx@gnu.org>
parents:
diff changeset
230 ){
Dave Love <fx@gnu.org>
parents:
diff changeset
231 XMapSubwindows(display, p_ptr->window);
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 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
235 * Synchronize the X buffers and the event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
236 * From here on, all events in the queue that don't belong to
Dave Love <fx@gnu.org>
parents:
diff changeset
237 * XMenu are sent back to the application via an application
Dave Love <fx@gnu.org>
parents:
diff changeset
238 * provided event handler or discarded if the application has
Dave Love <fx@gnu.org>
parents:
diff changeset
239 * not provided an event handler.
Dave Love <fx@gnu.org>
parents:
diff changeset
240 */
Dave Love <fx@gnu.org>
parents:
diff changeset
241 XSync(display, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
242
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
243 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
244 * Grab the mouse for menu input.
Dave Love <fx@gnu.org>
parents:
diff changeset
245 */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
246
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
247 status = XGrabPointer(
Dave Love <fx@gnu.org>
parents:
diff changeset
248 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
249 menu->parent,
Dave Love <fx@gnu.org>
parents:
diff changeset
250 True,
Dave Love <fx@gnu.org>
parents:
diff changeset
251 event_mask,
Dave Love <fx@gnu.org>
parents:
diff changeset
252 GrabModeAsync,
Dave Love <fx@gnu.org>
parents:
diff changeset
253 GrabModeAsync,
Dave Love <fx@gnu.org>
parents:
diff changeset
254 None,
Dave Love <fx@gnu.org>
parents:
diff changeset
255 menu->mouse_cursor,
Dave Love <fx@gnu.org>
parents:
diff changeset
256 CurrentTime
Dave Love <fx@gnu.org>
parents:
diff changeset
257 );
44752
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
258 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
259 {
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
260 status = XGrabKeyboard (display,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
261 menu->parent,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
262 False,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
263 GrabModeAsync,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
264 GrabModeAsync,
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
265 CurrentTime);
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
266 if (status != Success)
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
267 XUngrabPointer(display, CurrentTime);
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
268 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
269
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
270 if (status == _X_FAILURE) {
Dave Love <fx@gnu.org>
parents:
diff changeset
271 _XMErrorCode = XME_GRAB_MOUSE;
Dave Love <fx@gnu.org>
parents:
diff changeset
272 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
273 }
Dave Love <fx@gnu.org>
parents:
diff changeset
274
Dave Love <fx@gnu.org>
parents:
diff changeset
275 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
276 * Map the menu panes.
Dave Love <fx@gnu.org>
parents:
diff changeset
277 */
Dave Love <fx@gnu.org>
parents:
diff changeset
278 XMapWindow(display, cur_p->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
279 for (p_ptr = menu->p_list->next;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
280 p_ptr != cur_p;
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
281 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
282 XMapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
283 for (p_ptr = cur_p->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
284 p_ptr != menu->p_list;
Dave Love <fx@gnu.org>
parents:
diff changeset
285 p_ptr = p_ptr->next)
Dave Love <fx@gnu.org>
parents:
diff changeset
286 XMapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
287
Dave Love <fx@gnu.org>
parents:
diff changeset
288 XRaiseWindow(display, cur_p->window); /* Make sure current */
Dave Love <fx@gnu.org>
parents:
diff changeset
289 /* pane is on top. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
290
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
291 cur_s = NULL; /* Clear current selection. */
Dave Love <fx@gnu.org>
parents:
diff changeset
292
Dave Love <fx@gnu.org>
parents:
diff changeset
293 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
294 * Begin event processing loop.
Dave Love <fx@gnu.org>
parents:
diff changeset
295 */
Dave Love <fx@gnu.org>
parents:
diff changeset
296 while (1) {
58167
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
297 if (wait_func) (*wait_func) (wait_data);
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
298 XNextEvent(display, &event); /* Get next event. */
Dave Love <fx@gnu.org>
parents:
diff changeset
299 switch (event.type) { /* Dispatch on the event type. */
Dave Love <fx@gnu.org>
parents:
diff changeset
300 case Expose:
Dave Love <fx@gnu.org>
parents:
diff changeset
301 event_xmp = (XMPane *)XLookUpAssoc(display,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
302 menu->assoc_tab,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
303 event.xexpose.window);
Dave Love <fx@gnu.org>
parents:
diff changeset
304 if (event_xmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
305 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
306 * If AEQ mode is enabled then queue the event.
Dave Love <fx@gnu.org>
parents:
diff changeset
307 */
Dave Love <fx@gnu.org>
parents:
diff changeset
308 if (menu->aeq) {
Dave Love <fx@gnu.org>
parents:
diff changeset
309 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
310 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
311 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
312 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
313 }
Dave Love <fx@gnu.org>
parents:
diff changeset
314 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
315 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
316 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
317 }
Dave Love <fx@gnu.org>
parents:
diff changeset
318 else if (_XMEventHandler) (*_XMEventHandler)(&event);
Dave Love <fx@gnu.org>
parents:
diff changeset
319 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
320 }
Dave Love <fx@gnu.org>
parents:
diff changeset
321 if (event_xmp->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
322 XSetWindowBackground(display,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
323 event_xmp->window,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
324 menu->bkgnd_color);
Dave Love <fx@gnu.org>
parents:
diff changeset
325 }
Dave Love <fx@gnu.org>
parents:
diff changeset
326 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
327 XSetWindowBackgroundPixmap(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
328 event_xmp->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
329 menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
330 }
Dave Love <fx@gnu.org>
parents:
diff changeset
331 _XMRefreshPane(display, menu, event_xmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
332 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
333 case EnterNotify:
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
334 /*
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
335 * First wait a small period of time, and see
Dave Love <fx@gnu.org>
parents:
diff changeset
336 * if another EnterNotify event follows hard on the
Dave Love <fx@gnu.org>
parents:
diff changeset
337 * heels of this one. i.e., the user is simply
Dave Love <fx@gnu.org>
parents:
diff changeset
338 * "passing through". If so, ignore this one.
Dave Love <fx@gnu.org>
parents:
diff changeset
339 */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
340
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
341 event_xmw = (XMWindow *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
342 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
343 event.xcrossing.window);
Dave Love <fx@gnu.org>
parents:
diff changeset
344 if (event_xmw == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
345 if (event_xmw->type == SELECTION) {
Dave Love <fx@gnu.org>
parents:
diff changeset
346 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
347 * We have entered a selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
348 */
Dave Love <fx@gnu.org>
parents:
diff changeset
349 /* if (XPending(display) == 0) usleep(150000); */
Dave Love <fx@gnu.org>
parents:
diff changeset
350 if (XPending(display) != 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
351 XPeekEvent(display, &peek_event);
Dave Love <fx@gnu.org>
parents:
diff changeset
352 if(peek_event.type == LeaveNotify) {
Dave Love <fx@gnu.org>
parents:
diff changeset
353 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
354 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
355 }
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
356 cur_s = (XMSelect *)event_xmw;
30365
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
357 help_callback (cur_s->help_string,
5eece465cb5d (XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents: 27457
diff changeset
358 cur_p->serial, cur_s->serial);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
359
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
360 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
361 * If the pane we are in is active and the
Dave Love <fx@gnu.org>
parents:
diff changeset
362 * selection entered is active then activate
Dave Love <fx@gnu.org>
parents:
diff changeset
363 * the selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
364 */
Dave Love <fx@gnu.org>
parents:
diff changeset
365 if (cur_p->active && cur_s->active > 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
366 cur_s->activated = 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
367 _XMRefreshSelection(display, menu, cur_s);
Dave Love <fx@gnu.org>
parents:
diff changeset
368 }
Dave Love <fx@gnu.org>
parents:
diff changeset
369 }
Dave Love <fx@gnu.org>
parents:
diff changeset
370 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
371 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
372 * We have entered a pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
373 */
Dave Love <fx@gnu.org>
parents:
diff changeset
374 /* if (XPending(display) == 0) usleep(150000); */
Dave Love <fx@gnu.org>
parents:
diff changeset
375 if (XPending(display) != 0) {
Dave Love <fx@gnu.org>
parents:
diff changeset
376 XPeekEvent(display, &peek_event);
Dave Love <fx@gnu.org>
parents:
diff changeset
377 if (peek_event.type == EnterNotify) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
378 }
Dave Love <fx@gnu.org>
parents:
diff changeset
379 XQueryPointer(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
380 menu->parent,
Dave Love <fx@gnu.org>
parents:
diff changeset
381 &root, &child,
Dave Love <fx@gnu.org>
parents:
diff changeset
382 &root_x, &root_y,
Dave Love <fx@gnu.org>
parents:
diff changeset
383 &win_x, &win_y,
Dave Love <fx@gnu.org>
parents:
diff changeset
384 &mask);
Dave Love <fx@gnu.org>
parents:
diff changeset
385 event_xmp = (XMPane *)XLookUpAssoc(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
386 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
387 child);
Dave Love <fx@gnu.org>
parents:
diff changeset
388 if (event_xmp == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
389 if (event_xmp == cur_p) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
390 if (event_xmp->serial > cur_p->serial) forward = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
391 else forward = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
392 p_ptr = cur_p;
Dave Love <fx@gnu.org>
parents:
diff changeset
393 while (p_ptr != event_xmp) {
Dave Love <fx@gnu.org>
parents:
diff changeset
394 if (forward) p_ptr = p_ptr->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
395 else p_ptr = p_ptr->prev;
Dave Love <fx@gnu.org>
parents:
diff changeset
396 XRaiseWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
397 }
Dave Love <fx@gnu.org>
parents:
diff changeset
398 if (cur_p->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
399 cur_p->activated = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
400 XSetWindowBackgroundPixmap(display,
Dave Love <fx@gnu.org>
parents:
diff changeset
401 cur_p->window,
Dave Love <fx@gnu.org>
parents:
diff changeset
402 menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
403 _XMRefreshPane(display, menu, cur_p);
Dave Love <fx@gnu.org>
parents:
diff changeset
404 }
Dave Love <fx@gnu.org>
parents:
diff changeset
405 if (event_xmp->active) event_xmp->activated = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
406 #if 1
Dave Love <fx@gnu.org>
parents:
diff changeset
407 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
408 * i suspect the we don't get an EXPOSE event when backing
Dave Love <fx@gnu.org>
parents:
diff changeset
409 * store is enabled; the menu windows content is probably
Dave Love <fx@gnu.org>
parents:
diff changeset
410 * not drawn in when it should be in that case.
Dave Love <fx@gnu.org>
parents:
diff changeset
411 * in that case, this is probably an ugly fix!
Dave Love <fx@gnu.org>
parents:
diff changeset
412 * i hope someone more familiar with this code would
Dave Love <fx@gnu.org>
parents:
diff changeset
413 * take it from here. -- caveh@eng.sun.com.
Dave Love <fx@gnu.org>
parents:
diff changeset
414 */
Dave Love <fx@gnu.org>
parents:
diff changeset
415 XSetWindowBackground(display,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
416 event_xmp->window,
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
417 menu->bkgnd_color);
Dave Love <fx@gnu.org>
parents:
diff changeset
418 _XMRefreshPane(display, menu, event_xmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
419 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
420 cur_p = event_xmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
421 }
Dave Love <fx@gnu.org>
parents:
diff changeset
422 break;
Dave Love <fx@gnu.org>
parents:
diff changeset
423 case LeaveNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
424 event_xmw = (XMWindow *)XLookUpAssoc(
Dave Love <fx@gnu.org>
parents:
diff changeset
425 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
426 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
427 event.xcrossing.window
Dave Love <fx@gnu.org>
parents:
diff changeset
428 );
Dave Love <fx@gnu.org>
parents:
diff changeset
429 if (event_xmw == NULL) break;
Dave Love <fx@gnu.org>
parents:
diff changeset
430 if(cur_s == NULL) break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
431
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
432 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
433 * If the current selection was activated then
Dave Love <fx@gnu.org>
parents:
diff changeset
434 * deactivate it.
Dave Love <fx@gnu.org>
parents:
diff changeset
435 */
Dave Love <fx@gnu.org>
parents:
diff changeset
436 if (cur_s->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
437 cur_s->activated = False;
Dave Love <fx@gnu.org>
parents:
diff changeset
438 _XMRefreshSelection(display, menu, cur_s);
Dave Love <fx@gnu.org>
parents:
diff changeset
439 }
Dave Love <fx@gnu.org>
parents:
diff changeset
440 cur_s = NULL;
Dave Love <fx@gnu.org>
parents:
diff changeset
441 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
442
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
443 case ButtonPress:
Dave Love <fx@gnu.org>
parents:
diff changeset
444 case ButtonRelease:
Dave Love <fx@gnu.org>
parents:
diff changeset
445 *p_num = cur_p->serial;
Dave Love <fx@gnu.org>
parents:
diff changeset
446 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
447 * Check to see if there is a current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
448 */
Dave Love <fx@gnu.org>
parents:
diff changeset
449 if (cur_s != NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
450 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
451 * Set the selection number to the current selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
452 */
Dave Love <fx@gnu.org>
parents:
diff changeset
453 *s_num = cur_s->serial;
Dave Love <fx@gnu.org>
parents:
diff changeset
454 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
455 * If the current selection was activated then
Dave Love <fx@gnu.org>
parents:
diff changeset
456 * we have a valid selection otherwise we have
Dave Love <fx@gnu.org>
parents:
diff changeset
457 * an inactive selection.
Dave Love <fx@gnu.org>
parents:
diff changeset
458 */
Dave Love <fx@gnu.org>
parents:
diff changeset
459 if (cur_s->activated) {
Dave Love <fx@gnu.org>
parents:
diff changeset
460 *data = cur_s->data;
Dave Love <fx@gnu.org>
parents:
diff changeset
461 ret_val = XM_SUCCESS;
Dave Love <fx@gnu.org>
parents:
diff changeset
462 }
Dave Love <fx@gnu.org>
parents:
diff changeset
463 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
464 ret_val = XM_IA_SELECT;
Dave Love <fx@gnu.org>
parents:
diff changeset
465 }
Dave Love <fx@gnu.org>
parents:
diff changeset
466 }
Dave Love <fx@gnu.org>
parents:
diff changeset
467 else {
Dave Love <fx@gnu.org>
parents:
diff changeset
468 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
469 * No selection was current.
Dave Love <fx@gnu.org>
parents:
diff changeset
470 */
Dave Love <fx@gnu.org>
parents:
diff changeset
471 ret_val = XM_NO_SELECT;
Dave Love <fx@gnu.org>
parents:
diff changeset
472 }
Dave Love <fx@gnu.org>
parents:
diff changeset
473 selection = True;
Dave Love <fx@gnu.org>
parents:
diff changeset
474 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
475 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
476 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
477 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
478
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
479 /* 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
480 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
481 || 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
482 {
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 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
484 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
485 }
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 break;
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
487 default:
Dave Love <fx@gnu.org>
parents:
diff changeset
488 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
489 * If AEQ mode is enabled then queue the event.
Dave Love <fx@gnu.org>
parents:
diff changeset
490 */
Dave Love <fx@gnu.org>
parents:
diff changeset
491 if (menu->aeq) {
Dave Love <fx@gnu.org>
parents:
diff changeset
492 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
493 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
494 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
495 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
496 }
Dave Love <fx@gnu.org>
parents:
diff changeset
497 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
498 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
499 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
500 }
Dave Love <fx@gnu.org>
parents:
diff changeset
501 else if (_XMEventHandler) (*_XMEventHandler)(&event);
Dave Love <fx@gnu.org>
parents:
diff changeset
502 }
Dave Love <fx@gnu.org>
parents:
diff changeset
503 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
504 * If a selection has been made, break out of the event loop.
Dave Love <fx@gnu.org>
parents:
diff changeset
505 */
Dave Love <fx@gnu.org>
parents:
diff changeset
506 if (selection == True) break;
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 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
510 * Unmap the menu.
Dave Love <fx@gnu.org>
parents:
diff changeset
511 */
Dave Love <fx@gnu.org>
parents:
diff changeset
512 for ( p_ptr = menu->p_list->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
513 p_ptr != menu->p_list;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
514 p_ptr = p_ptr->next)
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
515 {
Dave Love <fx@gnu.org>
parents:
diff changeset
516 XUnmapWindow(display, p_ptr->window);
Dave Love <fx@gnu.org>
parents:
diff changeset
517 }
Dave Love <fx@gnu.org>
parents:
diff changeset
518
Dave Love <fx@gnu.org>
parents:
diff changeset
519 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
520 * Ungrab the mouse.
Dave Love <fx@gnu.org>
parents:
diff changeset
521 */
Dave Love <fx@gnu.org>
parents:
diff changeset
522 XUngrabPointer(display, CurrentTime);
44752
17275bfd5698 Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents: 30365
diff changeset
523 XUngrabKeyboard(display, CurrentTime);
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
524
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
525 /*
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
526 * Restore bits under where the menu was if we managed
Dave Love <fx@gnu.org>
parents:
diff changeset
527 * to save them and free the pixmap.
Dave Love <fx@gnu.org>
parents:
diff changeset
528 */
Dave Love <fx@gnu.org>
parents:
diff changeset
529
Dave Love <fx@gnu.org>
parents:
diff changeset
530 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
531 * If there is a current selection deactivate it.
Dave Love <fx@gnu.org>
parents:
diff changeset
532 */
Dave Love <fx@gnu.org>
parents:
diff changeset
533 if (cur_s != NULL) cur_s->activated = 0;
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 * Deactivate the current pane.
Dave Love <fx@gnu.org>
parents:
diff changeset
537 */
Dave Love <fx@gnu.org>
parents:
diff changeset
538 cur_p->activated = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
539 XSetWindowBackgroundPixmap(display, cur_p->window, menu->inact_pixmap);
Dave Love <fx@gnu.org>
parents:
diff changeset
540
Dave Love <fx@gnu.org>
parents:
diff changeset
541 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
542 * Synchronize the X buffers and the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
543 */
Dave Love <fx@gnu.org>
parents:
diff changeset
544 XSync(display, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
545
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
546 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
547 * Dispatch any events remaining on the queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
548 */
Dave Love <fx@gnu.org>
parents:
diff changeset
549 while (QLength(display)) {
Dave Love <fx@gnu.org>
parents:
diff changeset
550 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
551 * Fetch the next event.
Dave Love <fx@gnu.org>
parents:
diff changeset
552 */
Dave Love <fx@gnu.org>
parents:
diff changeset
553 XNextEvent(display, &event);
Dave Love <fx@gnu.org>
parents:
diff changeset
554
Dave Love <fx@gnu.org>
parents:
diff changeset
555 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
556 * Discard any events left on the queue that belong to XMenu.
Dave Love <fx@gnu.org>
parents:
diff changeset
557 * All others are held and then returned to the event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
558 */
Dave Love <fx@gnu.org>
parents:
diff changeset
559 switch (event.type) {
Dave Love <fx@gnu.org>
parents:
diff changeset
560 case Expose:
Dave Love <fx@gnu.org>
parents:
diff changeset
561 case EnterNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
562 case LeaveNotify:
Dave Love <fx@gnu.org>
parents:
diff changeset
563 case ButtonPress:
Dave Love <fx@gnu.org>
parents:
diff changeset
564 case ButtonRelease:
Dave Love <fx@gnu.org>
parents:
diff changeset
565 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
566 * Does this event belong to one of XMenu's windows?
Dave Love <fx@gnu.org>
parents:
diff changeset
567 * If so, discard it and process the next event.
Dave Love <fx@gnu.org>
parents:
diff changeset
568 * If not fall through and treat it as a foreign event.
Dave Love <fx@gnu.org>
parents:
diff changeset
569 */
Dave Love <fx@gnu.org>
parents:
diff changeset
570 event_xmp = (XMPane *)XLookUpAssoc(
Dave Love <fx@gnu.org>
parents:
diff changeset
571 display,
Dave Love <fx@gnu.org>
parents:
diff changeset
572 menu->assoc_tab,
Dave Love <fx@gnu.org>
parents:
diff changeset
573 event.xbutton.window
Dave Love <fx@gnu.org>
parents:
diff changeset
574 );
Dave Love <fx@gnu.org>
parents:
diff changeset
575 if (event_xmp != NULL) continue;
Dave Love <fx@gnu.org>
parents:
diff changeset
576 default:
Dave Love <fx@gnu.org>
parents:
diff changeset
577 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
578 * This is a foreign event.
Dave Love <fx@gnu.org>
parents:
diff changeset
579 * Queue it for later return to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
580 */
Dave Love <fx@gnu.org>
parents:
diff changeset
581 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue));
Dave Love <fx@gnu.org>
parents:
diff changeset
582 if (feq_tmp == NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
583 _XMErrorCode = XME_CALLOC;
Dave Love <fx@gnu.org>
parents:
diff changeset
584 return(XM_FAILURE);
Dave Love <fx@gnu.org>
parents:
diff changeset
585 }
Dave Love <fx@gnu.org>
parents:
diff changeset
586 feq_tmp->event = event;
Dave Love <fx@gnu.org>
parents:
diff changeset
587 feq_tmp->next = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
588 feq = feq_tmp;
Dave Love <fx@gnu.org>
parents:
diff changeset
589 }
Dave Love <fx@gnu.org>
parents:
diff changeset
590 }
Dave Love <fx@gnu.org>
parents:
diff changeset
591 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
592 * Return any foreign events that were queued to the X event queue.
Dave Love <fx@gnu.org>
parents:
diff changeset
593 */
Dave Love <fx@gnu.org>
parents:
diff changeset
594 while (feq != NULL) {
Dave Love <fx@gnu.org>
parents:
diff changeset
595 feq_tmp = feq;
Dave Love <fx@gnu.org>
parents:
diff changeset
596 XPutBackEvent(display, &feq_tmp->event);
Dave Love <fx@gnu.org>
parents:
diff changeset
597 feq = feq_tmp->next;
Dave Love <fx@gnu.org>
parents:
diff changeset
598 free((char *)feq_tmp);
Dave Love <fx@gnu.org>
parents:
diff changeset
599 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44752
diff changeset
600
58167
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
601 wait_func = 0;
9351060ba546 * XMenu.h (XMenuActivateSetWaitFunction): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents: 54770
diff changeset
602
25858
Dave Love <fx@gnu.org>
parents:
diff changeset
603 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
604 * Return successfully.
Dave Love <fx@gnu.org>
parents:
diff changeset
605 */
Dave Love <fx@gnu.org>
parents:
diff changeset
606 _XMErrorCode = XME_NO_ERROR;
Dave Love <fx@gnu.org>
parents:
diff changeset
607 return(ret_val);
Dave Love <fx@gnu.org>
parents:
diff changeset
608
Dave Love <fx@gnu.org>
parents:
diff changeset
609 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
610
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
611 /* arch-tag: 6b90b578-ecea-4328-b460-a0c96963f872
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
612 (do not change this comment) */