ctrl-alt is the default grab key - reset modifiers when toggling grab state
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 3 Oct 2004 14:33:54 +0000 (14:33 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 3 Oct 2004 14:33:54 +0000 (14:33 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1094 c046a42c-6fe2-441c-8c8c-71466251a162

sdl.c

diff --git a/sdl.c b/sdl.c
index c089f56..f1b4726 100644 (file)
--- 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;