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. (From OE-Core rev: a60b1ebbb8f81245f3ccf25b3f9d63677de75b85) Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
63cd03b80c
commit
dd2b2f93a9
|
@ -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
|
||||
|
|
@ -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 = "\
|
||||
|
|
Loading…
Reference in New Issue