qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH 4/5] kbd-state: register sdl2 hotkeys


From: Gerd Hoffmann
Subject: [Qemu-devel] [RFC PATCH 4/5] kbd-state: register sdl2 hotkeys
Date: Wed, 21 Feb 2018 18:08:19 +0100

Register SDL2 hotkeys in keyboard state tracker, use it to check for
hotkeys.  Drop even more modifier code.

This also changes behavior a bit.  The Ctrl-Alt-<key> hotkey
combinations accept both ctrl keys now.  Likewise the
Ctrl-Alt-Shift-<key> mode you can enable with -alt-grab accepts both
ctrl and shift keys.  The -ctrl-grab mode (use right ctrl key) is not
supported.

Signed-off-by: Gerd Hoffmann <address@hidden>
---
 ui/sdl2-input.c |  1 -
 ui/sdl2.c       | 98 ++++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 59 insertions(+), 40 deletions(-)

diff --git a/ui/sdl2-input.c b/ui/sdl2-input.c
index d970655616..82ec375ea2 100644
--- a/ui/sdl2-input.c
+++ b/ui/sdl2-input.c
@@ -61,7 +61,6 @@ void sdl2_process_key(struct sdl2_console *scon,
                 break;
             }
         }
-        return;
     }
 
     kbd_state_key_event(scon->kbd, qcode, ev->type == SDL_KEYDOWN);
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 50f5fca0f6..0f48f5a546 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -39,8 +39,6 @@ static int gui_grab; /* if true, all keyboard/mouse events 
are grabbed */
 
 static int gui_saved_grab;
 static int gui_fullscreen;
-static int gui_key_modifier_pressed;
-static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
 static SDL_Cursor *sdl_cursor_normal;
 static SDL_Cursor *sdl_cursor_hidden;
 static int absolute_enabled;
@@ -312,43 +310,35 @@ static void toggle_full_screen(struct sdl2_console *scon)
     sdl2_redraw(scon);
 }
 
-static int get_mod_state(void)
-{
-    SDL_Keymod mod = SDL_GetModState();
-
-    if (alt_grab) {
-        return (mod & (gui_grab_code | KMOD_LSHIFT)) ==
-            (gui_grab_code | KMOD_LSHIFT);
-    } else if (ctrl_grab) {
-        return (mod & KMOD_RCTRL) == KMOD_RCTRL;
-    } else {
-        return (mod & gui_grab_code) == gui_grab_code;
-    }
-}
-
 static void handle_keydown(SDL_Event *ev)
 {
     int win;
     struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
-    int gui_keysym = 0;
+    KbdHotkey hotkey;
+    QKeyCode qcode;
 
-    gui_key_modifier_pressed = get_mod_state();
+    if (ev->key.keysym.scancode >= qemu_input_map_usb_to_qcode_len) {
+        return;
+    }
+    qcode = qemu_input_map_usb_to_qcode[ev->key.keysym.scancode];
 
-    if (!scon->ignore_hotkeys && gui_key_modifier_pressed && !ev->key.repeat) {
-        switch (ev->key.keysym.scancode) {
-        case SDL_SCANCODE_2:
-        case SDL_SCANCODE_3:
-        case SDL_SCANCODE_4:
-        case SDL_SCANCODE_5:
-        case SDL_SCANCODE_6:
-        case SDL_SCANCODE_7:
-        case SDL_SCANCODE_8:
-        case SDL_SCANCODE_9:
+    if (!scon->ignore_hotkeys && !ev->key.repeat) {
+        hotkey = kbd_state_hotkey_get(scon->kbd, qcode);
+        switch (hotkey) {
+        case KBD_HOTKEY_CONSOLE_2:
+        case KBD_HOTKEY_CONSOLE_3:
+        case KBD_HOTKEY_CONSOLE_4:
+        case KBD_HOTKEY_CONSOLE_5:
+        case KBD_HOTKEY_CONSOLE_6:
+        case KBD_HOTKEY_CONSOLE_7:
+        case KBD_HOTKEY_CONSOLE_8:
+        case KBD_HOTKEY_CONSOLE_9:
             if (gui_grab) {
                 sdl_grab_end(scon);
             }
+            sdl2_reset_keys(scon);
 
-            win = ev->key.keysym.scancode - SDL_SCANCODE_1;
+            win = hotkey - KBD_HOTKEY_CONSOLE_1;
             if (win < sdl2_num_outputs) {
                 sdl2_console[win].hidden = !sdl2_console[win].hidden;
                 if (sdl2_console[win].real_window) {
@@ -358,29 +348,25 @@ static void handle_keydown(SDL_Event *ev)
                         SDL_ShowWindow(sdl2_console[win].real_window);
                     }
                 }
-                gui_keysym = 1;
             }
             break;
-        case SDL_SCANCODE_F:
+        case KBD_HOTKEY_FULLSCREEN:
             toggle_full_screen(scon);
-            gui_keysym = 1;
             break;
-        case SDL_SCANCODE_G:
-            gui_keysym = 1;
+        case KBD_HOTKEY_GRAB:
             if (!gui_grab) {
                 sdl_grab_start(scon);
             } else if (!gui_fullscreen) {
                 sdl_grab_end(scon);
             }
             break;
-        case SDL_SCANCODE_U:
+        case KBD_HOTKEY_REDRAW:
             sdl2_window_destroy(scon);
             sdl2_window_create(scon);
             if (!scon->opengl) {
                 /* re-create scon->texture */
                 sdl2_2d_switch(&scon->dcl, scon->surface);
             }
-            gui_keysym = 1;
             break;
 #if 0
         case SDL_SCANCODE_KP_PLUS:
@@ -402,11 +388,14 @@ static void handle_keydown(SDL_Event *ev)
                 gui_keysym = 1;
             }
 #endif
+        case KBD_HOTKEY_NONE:
+            sdl2_process_key(scon, &ev->key);
+            break;
         default:
+            /* keep gcc happy */
             break;
         }
-    }
-    if (!gui_keysym) {
+    } else {
         sdl2_process_key(scon, &ev->key);
     }
 }
@@ -546,7 +535,7 @@ static void handle_windowevent(SDL_Event *ev)
          * Work around this by ignoring further hotkey events until a
          * key is released.
          */
-        scon->ignore_hotkeys = get_mod_state();
+        scon->ignore_hotkeys = SDL_GetModState();
         break;
     case SDL_WINDOWEVENT_FOCUS_LOST:
         if (gui_grab && !gui_fullscreen) {
@@ -756,6 +745,36 @@ void sdl_display_early_init(DisplayOptions *o)
     }
 }
 
+static void sdl2_hotkey_init(KbdState *kbd)
+{
+    /*
+     * Register traditional SDL hotkeys for now.
+     *
+     * Making this configurable is left as an
+     * excercise for another day ...
+     */
+    KbdModifier m1 = KBD_MOD_CTRL;
+    KbdModifier m2 = KBD_MOD_ALT;
+    KbdModifier m3 = KBD_MOD_NONE;
+    int i;
+
+    if (alt_grab) {
+        m3 = KBD_MOD_SHIFT;
+    }
+
+    kbd_state_hotkey_register(kbd, KBD_HOTKEY_FULLSCREEN,
+                              Q_KEY_CODE_F, m1, m2, m3);
+    kbd_state_hotkey_register(kbd, KBD_HOTKEY_GRAB,
+                              Q_KEY_CODE_G, m1, m2, m3);
+    kbd_state_hotkey_register(kbd, KBD_HOTKEY_REDRAW,
+                              Q_KEY_CODE_U, m1, m2, m3);
+    for (i = 0; i <= 7; i++) {
+        /* keys 2 ... 9 */
+        kbd_state_hotkey_register(kbd, KBD_HOTKEY_CONSOLE_2 + i,
+                                  Q_KEY_CODE_2 + i, m1, m2, m3);
+    }
+}
+
 void sdl_display_init(DisplayState *ds, DisplayOptions *o)
 {
     int flags;
@@ -817,6 +836,7 @@ void sdl_display_init(DisplayState *ds, DisplayOptions *o)
 #endif
         sdl2_console[i].dcl.con = con;
         sdl2_console[i].kbd = kbd_state_init(con);
+        sdl2_hotkey_init(sdl2_console[i].kbd);
         register_displaychangelistener(&sdl2_console[i].dcl);
 
 #if defined(SDL_VIDEO_DRIVER_WINDOWS) || defined(SDL_VIDEO_DRIVER_X11)
-- 
2.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]