aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Djärv2002-04-22 18:21:06 +0000
committerJan Djärv2002-04-22 18:21:06 +0000
commit4db7db7d55c7b9778180e7f4c94fd9afc18e4d7c (patch)
treec6e0ba92d8ef4d33b5199049c9561e49b3fc4603
parentf25d60d646e84b783837351120087138529c9e95 (diff)
downloademacs-4db7db7d55c7b9778180e7f4c94fd9afc18e4d7c.tar.gz
emacs-4db7db7d55c7b9778180e7f4c94fd9afc18e4d7c.zip
Add calls to Grab/UngrabKeyboard to remove strange interactions with
window managers that steal keypresses.
-rw-r--r--lwlib/xlwmenu.c49
1 files changed, 36 insertions, 13 deletions
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index c63422bacc6..53dc7022857 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -257,10 +257,22 @@ WidgetClass xlwMenuWidgetClass = (WidgetClass) &xlwMenuClassRec;
257 257
258int submenu_destroyed; 258int submenu_destroyed;
259 259
260/* For debug, set this to 0 to not grab the keyboard on menu popup */
261int x_menu_grab_keyboard = 1;
262
260static int next_release_must_exit; 263static int next_release_must_exit;
261 264
262 /* Utilities */ 265 /* Utilities */
263 266
267/* Ungrab pointer and keyboard */
268static void
269ungrab_all (w, ungrabtime)
270 Widget w;
271 Time ungrabtime;
272{
273 XtUngrabPointer (w, ungrabtime);
274 if (x_menu_grab_keyboard) XtUngrabKeyboard (w, ungrabtime);
275}
264 276
265/* Like abort, but remove grabs from widget W before. */ 277/* Like abort, but remove grabs from widget W before. */
266 278
@@ -270,7 +282,7 @@ abort_gracefully (w)
270{ 282{
271 if (XtIsShell (XtParent (w))) 283 if (XtIsShell (XtParent (w)))
272 XtRemoveGrab (w); 284 XtRemoveGrab (w);
273 XtUngrabPointer (w, CurrentTime); 285 ungrab_all (w, CurrentTime);
274 abort (); 286 abort ();
275} 287}
276 288
@@ -1795,7 +1807,7 @@ XlwMenuDestroy (w)
1795 XlwMenuWidget mw = (XlwMenuWidget) w; 1807 XlwMenuWidget mw = (XlwMenuWidget) w;
1796 1808
1797 if (pointer_grabbed) 1809 if (pointer_grabbed)
1798 XtUngrabPointer ((Widget)w, CurrentTime); 1810 ungrab_all ((Widget)w, CurrentTime);
1799 pointer_grabbed = 0; 1811 pointer_grabbed = 0;
1800 1812
1801 submenu_destroyed = 1; 1813 submenu_destroyed = 1;
@@ -2197,7 +2209,7 @@ Key (w, ev, params, num_params)
2197 if (mw->menu.popped_up) 2209 if (mw->menu.popped_up)
2198 { 2210 {
2199 mw->menu.popped_up = False; 2211 mw->menu.popped_up = False;
2200 XtUngrabPointer ((Widget)mw, ev->xmotion.time); 2212 ungrab_all ((Widget)mw, ev->xmotion.time);
2201 if (XtIsShell (XtParent ((Widget) mw))) 2213 if (XtIsShell (XtParent ((Widget) mw)))
2202 XtPopdown (XtParent ((Widget) mw)); 2214 XtPopdown (XtParent ((Widget) mw));
2203 else 2215 else
@@ -2238,7 +2250,7 @@ Select (w, ev, params, num_params)
2238 if (mw->menu.popped_up) 2250 if (mw->menu.popped_up)
2239 { 2251 {
2240 mw->menu.popped_up = False; 2252 mw->menu.popped_up = False;
2241 XtUngrabPointer ((Widget)mw, ev->xmotion.time); 2253 ungrab_all ((Widget)mw, ev->xmotion.time);
2242 if (XtIsShell (XtParent ((Widget) mw))) 2254 if (XtIsShell (XtParent ((Widget) mw)))
2243 XtPopdown (XtParent ((Widget) mw)); 2255 XtPopdown (XtParent ((Widget) mw));
2244 else 2256 else
@@ -2313,15 +2325,26 @@ pop_up_menu (mw, event)
2313#ifdef emacs 2325#ifdef emacs
2314 count = x_catch_errors (display); 2326 count = x_catch_errors (display);
2315#endif 2327#endif
2316 XtGrabPointer ((Widget)mw, False, 2328 if (XtGrabPointer ((Widget)mw, False,
2317 (PointerMotionMask 2329 (PointerMotionMask
2318 | PointerMotionHintMask 2330 | PointerMotionHintMask
2319 | ButtonReleaseMask 2331 | ButtonReleaseMask
2320 | ButtonPressMask), 2332 | ButtonPressMask),
2321 GrabModeAsync, GrabModeAsync, None, 2333 GrabModeAsync, GrabModeAsync, None,
2322 mw->menu.cursor_shape, 2334 mw->menu.cursor_shape,
2323 event->time); 2335 event->time) == Success)
2324 pointer_grabbed = 1; 2336 {
2337 if (! x_menu_grab_keyboard
2338 || XtGrabKeyboard ((Widget)mw, False, GrabModeAsync,
2339 GrabModeAsync, event->time) == Success)
2340 {
2341 XtSetKeyboardFocus((Widget)mw, None);
2342 pointer_grabbed = 1;
2343 }
2344 else
2345 XtUngrabPointer ((Widget)mw, event->time);
2346 }
2347
2325#ifdef emacs 2348#ifdef emacs
2326 if (x_had_errors_p (display)) 2349 if (x_had_errors_p (display))
2327 { 2350 {