Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | When the pointer enters the Qemu window it calls SDL_WM_GrabInput, which calls |
| 2 | XGrabPointer in a busyloop until it returns GrabSuccess. However if there's already |
| 3 | a pointer grab (screen is locked, a menu is open) then qemu will hang until the |
| 4 | grab can be taken. In the specific case of a headless X server on an autobuilder, once |
| 5 | the screensaver has kicked in any qemu instance that appears underneath the |
| 6 | pointer will hang. |
| 7 | |
| 8 | I'm not entirely sure why pointer grabs are required (the documentation |
| 9 | explicitly says it doesn't do grabs when using a tablet, which we are) so wrap |
| 10 | them in a conditional that can be set by the autobuilder environment, preserving |
| 11 | the current grabbing behaviour for everyone else. |
| 12 | |
| 13 | Upstream-Status: Pending |
| 14 | Signed-off-by: Ross Burton <ross.burton@intel.com> |
| 15 | |
| 16 | From 4b1988ecb01a178269ec0513a75f2ec620c7ef6a Mon Sep 17 00:00:00 2001 |
| 17 | From: Ross Burton <ross.burton@intel.com> |
| 18 | Date: Wed, 18 Sep 2013 14:04:54 +0100 |
| 19 | Subject: [PATCH] sdl.c: allow user to disable pointer grabs |
| 20 | |
| 21 | Signed-off-by: Ross Burton <ross.burton@intel.com> |
| 22 | Signed-off-by: Eric BĂ©nard <eric@eukrea.com> |
| 23 | --- |
| 24 | ui/sdl.c | 12 ++++++++++-- |
| 25 | 1 file changed, 10 insertions(+), 2 deletions(-) |
| 26 | |
| 27 | diff --git a/ui/sdl.c b/ui/sdl.c |
| 28 | index 39a42d6..9b8abe5 100644 |
| 29 | --- a/ui/sdl.c |
| 30 | +++ b/ui/sdl.c |
| 31 | @@ -59,6 +59,10 @@ static SDL_Cursor *guest_sprite = NULL; |
| 32 | static SDL_PixelFormat host_format; |
| 33 | static int scaling_active = 0; |
| 34 | static Notifier mouse_mode_notifier; |
| 35 | +#ifndef True |
| 36 | +#define True 1 |
| 37 | +#endif |
| 38 | +static doing_grabs = True; |
| 39 | |
| 40 | static void sdl_update(DisplayChangeListener *dcl, |
| 41 | int x, int y, int w, int h) |
| 42 | @@ -384,14 +388,16 @@ static void sdl_grab_start(void) |
| 43 | SDL_WarpMouse(guest_x, guest_y); |
| 44 | } else |
| 45 | sdl_hide_cursor(); |
| 46 | - SDL_WM_GrabInput(SDL_GRAB_ON); |
| 47 | + if (doing_grabs) |
| 48 | + SDL_WM_GrabInput(SDL_GRAB_ON); |
| 49 | gui_grab = 1; |
| 50 | sdl_update_caption(); |
| 51 | } |
| 52 | |
| 53 | static void sdl_grab_end(void) |
| 54 | { |
| 55 | - SDL_WM_GrabInput(SDL_GRAB_OFF); |
| 56 | + if (doing_grabs) |
| 57 | + SDL_WM_GrabInput(SDL_GRAB_OFF); |
| 58 | gui_grab = 0; |
| 59 | sdl_show_cursor(); |
| 60 | sdl_update_caption(); |
| 61 | @@ -909,6 +915,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) |
| 62 | * This requires SDL >= 1.2.14. */ |
| 63 | setenv("SDL_DISABLE_LOCK_KEYS", "1", 1); |
| 64 | |
| 65 | + doing_grabs = (getenv("QEMU_DONT_GRAB") == NULL); |
| 66 | + |
| 67 | flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; |
| 68 | if (SDL_Init (flags)) { |
| 69 | fprintf(stderr, "Could not initialize SDL(%s) - exiting\n", |
| 70 | -- |
| 71 | 1.8.3.1 |
| 72 | |