From a60b1ebbb8f81245f3ccf25b3f9d63677de75b85 Mon Sep 17 00:00:00 2001 From: Ross Burton Date: Wed, 18 Sep 2013 17:48:45 +0100 Subject: qemu: add option to disable X grabs When the mouse pointer enters the qemu window it takes a pointer grab. This doesn't sound too dangerous at first but it turns out that SDL will infinitely busy-loop if it can't get the grab (e.g. if the screen is locked) and the average autobuilder setup's X server will have locked the screen a few minutes after boot. The result is that on many autobuilders apparently random qemu instances (the top-most one under the pointer) will hang during boot. To resolve this add an option (via an environment variable) to never attempt a grab. The default behaviour remains to grab so that everyone else doesn't see any change. Signed-off-by: Ross Burton Signed-off-by: Richard Purdie --- .../qemu/files/disable-grabs.patch | 69 ++++++++++++++++++++++ meta/recipes-devtools/qemu/qemu.inc | 1 + 2 files changed, 70 insertions(+) create mode 100644 meta/recipes-devtools/qemu/files/disable-grabs.patch diff --git a/meta/recipes-devtools/qemu/files/disable-grabs.patch b/meta/recipes-devtools/qemu/files/disable-grabs.patch new file mode 100644 index 0000000000..0e82cc8688 --- /dev/null +++ b/meta/recipes-devtools/qemu/files/disable-grabs.patch @@ -0,0 +1,69 @@ +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 + + +From 4b1988ecb01a178269ec0513a75f2ec620c7ef6a Mon Sep 17 00:00:00 2001 +From: Ross Burton +Date: Wed, 18 Sep 2013 14:04:54 +0100 +Subject: [PATCH] sdl.c: allow user to disable pointer grabs + +Signed-off-by: Ross Burton +--- + ui/sdl.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/ui/sdl.c b/ui/sdl.c +index 39a42d6..6095aa6 100644 +--- a/ui/sdl.c ++++ b/ui/sdl.c +@@ -59,6 +59,7 @@ static SDL_Cursor *guest_sprite = NULL; + static SDL_PixelFormat host_format; + static int scaling_active = 0; + static Notifier mouse_mode_notifier; ++static doing_grabs = True; + + static void sdl_update(DisplayChangeListener *dcl, + int x, int y, int w, int h) +@@ -384,14 +385,16 @@ static void sdl_grab_start(void) + SDL_WarpMouse(guest_x, guest_y); + } 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(); +@@ -909,7 +912,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) + * 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", +-- +1.7.10.4 + diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc index 97e9b7be1c..1b861d7dc9 100644 --- a/meta/recipes-devtools/qemu/qemu.inc +++ b/meta/recipes-devtools/qemu/qemu.inc @@ -17,6 +17,7 @@ SRC_URI = "\ file://powerpc_rom.bin \ file://no-strip.patch \ file://larger_default_ram_size.patch \ + file://disable-grabs.patch \ " SRC_URI_append_class-nativesdk = "\ -- cgit 1.2.3-korg