summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@intel.com>2013-09-18 17:48:45 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-09-18 17:51:55 +0100
commita60b1ebbb8f81245f3ccf25b3f9d63677de75b85 (patch)
tree44d9a61fac10e6f26385060163eae467fd18e6ca /meta
parentd9abcc0a2a691ca60cc1cb2f48f1748b0de73ac8 (diff)
downloadopenembedded-core-a60b1ebbb8f81245f3ccf25b3f9d63677de75b85.tar.gz
openembedded-core-a60b1ebbb8f81245f3ccf25b3f9d63677de75b85.tar.bz2
openembedded-core-a60b1ebbb8f81245f3ccf25b3f9d63677de75b85.zip
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 <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/recipes-devtools/qemu/files/disable-grabs.patch69
-rw-r--r--meta/recipes-devtools/qemu/qemu.inc1
2 files changed, 70 insertions, 0 deletions
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 <ross.burton@intel.com>
+
+
+From 4b1988ecb01a178269ec0513a75f2ec620c7ef6a 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
+
+Signed-off-by: Ross Burton <ross.burton@intel.com>
+---
+ 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 = "\