diff options
| author | Jan Djärv | 2002-04-22 18:21:06 +0000 |
|---|---|---|
| committer | Jan Djärv | 2002-04-22 18:21:06 +0000 |
| commit | 4db7db7d55c7b9778180e7f4c94fd9afc18e4d7c (patch) | |
| tree | c6e0ba92d8ef4d33b5199049c9561e49b3fc4603 | |
| parent | f25d60d646e84b783837351120087138529c9e95 (diff) | |
| download | emacs-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.c | 49 |
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 | ||
| 258 | int submenu_destroyed; | 258 | int submenu_destroyed; |
| 259 | 259 | ||
| 260 | /* For debug, set this to 0 to not grab the keyboard on menu popup */ | ||
| 261 | int x_menu_grab_keyboard = 1; | ||
| 262 | |||
| 260 | static int next_release_must_exit; | 263 | static int next_release_must_exit; |
| 261 | 264 | ||
| 262 | /* Utilities */ | 265 | /* Utilities */ |
| 263 | 266 | ||
| 267 | /* Ungrab pointer and keyboard */ | ||
| 268 | static void | ||
| 269 | ungrab_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 | { |