From 0ca9f8a42d64571d3310ea25a63588d77efd58c3 Mon Sep 17 00:00:00 2001 From: Dustin Kirkland Date: Thu, 17 Sep 2009 15:48:04 -0500 Subject: [PATCH] offer right-ctrl as a grab option Add support for -ctrl-grab to use the right-ctrl button to grab/release the mouse in SDL. The multi-button ctrl-alt and ctrl-alt-shift grab buttons present an accessibility problem to users who cannot press more than one button at a time. https://bugs.edge.launchpad.net/ubuntu/+source/qemu-kvm/+bug/237635 Signed-off-by: Dustin Kirkland Signed-off-by: Anthony Liguori --- qemu-options.hx | 10 ++++++++++ sdl.c | 18 +++++++++++------- sysemu.h | 1 + vl.c | 4 ++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/qemu-options.hx b/qemu-options.hx index f21e9f9da2..3dd76b34bf 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -478,6 +478,16 @@ Use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt). ETEXI #ifdef CONFIG_SDL +DEF("ctrl-grab", 0, QEMU_OPTION_ctrl_grab, + "-ctrl-grab use Right-Ctrl to grab mouse (instead of Ctrl-Alt)\n") +#endif +STEXI +@item -ctrl-grab + +Use Right-Ctrl to grab mouse (instead of Ctrl-Alt). +ETEXI + +#ifdef CONFIG_SDL DEF("no-quit", 0, QEMU_OPTION_no_quit, "-no-quit disable SDL window close capability\n") #endif diff --git a/sdl.c b/sdl.c index 42b6f37e6f..034440f721 100644 --- a/sdl.c +++ b/sdl.c @@ -414,10 +414,12 @@ static void sdl_update_caption(void) if (!vm_running) status = " [Stopped]"; else if (gui_grab) { - if (!alt_grab) - status = " - Press Ctrl-Alt to exit grab"; - else + if (alt_grab) status = " - Press Ctrl-Alt-Shift to exit grab"; + else if (ctrl_grab) + status = " - Press Right-Ctrl to exit grab"; + else + status = " - Press Ctrl-Alt to exit grab"; } if (qemu_name) { @@ -557,12 +559,14 @@ static void sdl_refresh(DisplayState *ds) case SDL_KEYDOWN: case SDL_KEYUP: if (ev->type == SDL_KEYDOWN) { - if (!alt_grab) { - mod_state = (SDL_GetModState() & gui_grab_code) == - gui_grab_code; - } else { + if (alt_grab) { mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) == (gui_grab_code | KMOD_LSHIFT); + } else if (ctrl_grab) { + mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL; + } else { + mod_state = (SDL_GetModState() & gui_grab_code) == + gui_grab_code; } gui_key_modifier_pressed = mod_state; if (gui_key_modifier_pressed) { diff --git a/sysemu.h b/sysemu.h index 9131e62cdd..763861ded5 100644 --- a/sysemu.h +++ b/sysemu.h @@ -126,6 +126,7 @@ extern const char *keyboard_layout; extern int win2k_install_hack; extern int rtc_td_hack; extern int alt_grab; +extern int ctrl_grab; extern int usb_enabled; extern int smp_cpus; extern int max_cpus; diff --git a/vl.c b/vl.c index 6d79912172..3d2314025c 100644 --- a/vl.c +++ b/vl.c @@ -247,6 +247,7 @@ int old_param = 0; #endif const char *qemu_name; int alt_grab = 0; +int ctrl_grab = 0; #if defined(TARGET_SPARC) || defined(TARGET_PPC) unsigned int nb_prom_envs = 0; const char *prom_envs[MAX_PROM_ENVS]; @@ -5310,6 +5311,9 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_alt_grab: alt_grab = 1; break; + case QEMU_OPTION_ctrl_grab: + ctrl_grab = 1; + break; case QEMU_OPTION_no_quit: no_quit = 1; break; -- 2.11.0