| From 18fb45c34a473c4ba247bb82bcea94b7c3ba493a Mon Sep 17 00:00:00 2001 |
| From: Ross Burton <ross.burton@intel.com> |
| Date: Wed, 18 Sep 2013 14:04:54 +0100 |
| Subject: [PATCH] sdl.c: allow user to disable pointer grabs |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| When the pointer enters the Qemu window it calls SDL_WM_GrabInput, which calls |
| XGrabPointer in a busyloop until it returns GrabSuccess. However if there's already |
| a pointer grab (screen is locked, a menu is open) then qemu will hang until the |
| grab can be taken. In the specific case of a headless X server on an autobuilder, once |
| the screensaver has kicked in any qemu instance that appears underneath the |
| pointer will hang. |
| |
| I'm not entirely sure why pointer grabs are required (the documentation |
| explicitly says it doesn't do grabs when using a tablet, which we are) so wrap |
| them in a conditional that can be set by the autobuilder environment, preserving |
| the current grabbing behaviour for everyone else. |
| |
| Upstream-Status: Pending |
| Signed-off-by: Ross Burton <ross.burton@intel.com> |
| Signed-off-by: Eric BĂ©nard <eric@eukrea.com> |
| --- |
| ui/sdl.c | 13 +++++++++++-- |
| 1 file changed, 11 insertions(+), 2 deletions(-) |
| |
| diff --git a/ui/sdl.c b/ui/sdl.c |
| index a5fd503c25..ab8d1b1eb1 100644 |
| --- a/ui/sdl.c |
| +++ b/ui/sdl.c |
| @@ -68,6 +68,11 @@ static int idle_counter; |
| static const guint16 *keycode_map; |
| static size_t keycode_maplen; |
| |
| +#ifndef True |
| +#define True 1 |
| +#endif |
| +static doing_grabs = True; |
| + |
| #define SDL_REFRESH_INTERVAL_BUSY 10 |
| #define SDL_MAX_IDLE_COUNT (2 * GUI_REFRESH_INTERVAL_DEFAULT \ |
| / SDL_REFRESH_INTERVAL_BUSY + 1) |
| @@ -398,14 +403,16 @@ static void sdl_grab_start(void) |
| } |
| } else |
| sdl_hide_cursor(); |
| - SDL_WM_GrabInput(SDL_GRAB_ON); |
| + if (doing_grabs) |
| + SDL_WM_GrabInput(SDL_GRAB_ON); |
| gui_grab = 1; |
| sdl_update_caption(); |
| } |
| |
| static void sdl_grab_end(void) |
| { |
| - SDL_WM_GrabInput(SDL_GRAB_OFF); |
| + if (doing_grabs) |
| + SDL_WM_GrabInput(SDL_GRAB_OFF); |
| gui_grab = 0; |
| sdl_show_cursor(); |
| sdl_update_caption(); |
| @@ -945,6 +952,8 @@ static void sdl1_display_init(DisplayState *ds, DisplayOptions *o) |
| * This requires SDL >= 1.2.14. */ |
| setenv("SDL_DISABLE_LOCK_KEYS", "1", 1); |
| |
| + doing_grabs = (getenv("QEMU_DONT_GRAB") == NULL); |
| + |
| flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; |
| if (SDL_Init (flags)) { |
| fprintf(stderr, "Could not initialize SDL(%s) - exiting\n", |