aboutsummaryrefslogtreecommitdiff
path: root/sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdl.c')
-rw-r--r--sdl.c52
1 files changed, 32 insertions, 20 deletions
diff --git a/sdl.c b/sdl.c
index c089f56f45..f1b4726cca 100644
--- a/sdl.c
+++ b/sdl.c
@@ -41,6 +41,8 @@ static int gui_fullscreen;
static int gui_key_modifier_pressed;
static int gui_keysym;
static int gui_fullscreen_initial_grab;
+static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
+static uint8_t modifiers_state[256];
static void sdl_update(DisplayState *ds, int x, int y, int w, int h)
{
@@ -275,10 +277,22 @@ static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
#endif
+static void reset_keys(void)
+{
+ int i;
+ for(i = 0; i < 256; i++) {
+ if (modifiers_state[i]) {
+ if (i & 0x80)
+ kbd_put_keycode(0xe0);
+ kbd_put_keycode(i | 0x80);
+ modifiers_state[i] = 0;
+ }
+ }
+}
+
static void sdl_process_key(SDL_KeyboardEvent *ev)
{
- int keycode, v, i;
- static uint8_t modifiers_state[256];
+ int keycode, v;
if (ev->keysym.sym == SDLK_PAUSE) {
/* specific case */
@@ -297,13 +311,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev)
switch(keycode) {
case 0x00:
/* sent when leaving window: reset the modifiers state */
- for(i = 0; i < 256; i++) {
- if (modifiers_state[i]) {
- if (i & 0x80)
- kbd_put_keycode(0xe0);
- kbd_put_keycode(i | 0x80);
- }
- }
+ reset_keys();
return;
case 0x2a: /* Left Shift */
case 0x36: /* Right Shift */
@@ -341,7 +349,7 @@ static void sdl_update_caption(void)
strcat(buf, " [Stopped]");
}
if (gui_grab) {
- strcat(buf, " - Press Ctrl-Shift to exit grab");
+ strcat(buf, " - Press Ctrl-Alt to exit grab");
}
SDL_WM_SetCaption(buf, "QEMU");
}
@@ -422,17 +430,19 @@ static void sdl_refresh(DisplayState *ds)
case SDL_KEYDOWN:
case SDL_KEYUP:
if (ev->type == SDL_KEYDOWN) {
- mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)) ==
- (KMOD_LSHIFT | KMOD_LCTRL);
+ mod_state = (SDL_GetModState() & gui_grab_code) ==
+ gui_grab_code;
gui_key_modifier_pressed = mod_state;
if (gui_key_modifier_pressed) {
- switch(ev->key.keysym.sym) {
- case SDLK_f:
+ int keycode;
+ keycode = sdl_keyevent_to_keycode(&ev->key);
+ switch(keycode) {
+ case 0x21: /* 'f' key on US keyboard */
toggle_full_screen(ds);
gui_keysym = 1;
break;
- case SDLK_F1 ... SDLK_F12:
- console_select(ev->key.keysym.sym - SDLK_F1);
+ case 0x02 ... 0x0a: /* '1' to '9' keys */
+ console_select(keycode - 0x02);
if (is_active_console(vga_console)) {
/* tell the vga console to redisplay itself */
vga_invalidate_display();
@@ -446,8 +456,7 @@ static void sdl_refresh(DisplayState *ds)
default:
break;
}
- }
- if (!is_active_console(vga_console)) {
+ } else if (!is_active_console(vga_console)) {
int keysym;
keysym = 0;
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
@@ -483,15 +492,18 @@ static void sdl_refresh(DisplayState *ds)
}
}
} else if (ev->type == SDL_KEYUP) {
- mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL));
+ mod_state = (SDL_GetModState() & gui_grab_code);
if (!mod_state) {
if (gui_key_modifier_pressed) {
if (gui_keysym == 0) {
- /* exit/enter grab if pressing Ctrl-Shift */
+ /* exit/enter grab if pressing Ctrl-Alt */
if (!gui_grab)
sdl_grab_start();
else
sdl_grab_end();
+ /* SDL does not send back all the
+ modifiers key, so we must correct it */
+ reset_keys();
break;
}
gui_key_modifier_pressed = 0;