Skip to content

Commit

Permalink
kbd-state: use state tracker for sdl2
Browse files Browse the repository at this point in the history
Use the new keyboard state tracked for sdl2.  We can drop the modifier
state tracking from sdl2.  Also keyup code is simpler, the state tracker
will take care to not send suspious keyup events to the guest.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 20190122092814.14919-4-kraxel@redhat.com
  • Loading branch information
kraxel committed Feb 5, 2019
1 parent 85b0369 commit 07333e1
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 34 deletions.
2 changes: 2 additions & 0 deletions include/ui/sdl2.h
Expand Up @@ -10,6 +10,7 @@
# include <SDL_image.h>
#endif

#include "ui/kbd-state.h"
#ifdef CONFIG_OPENGL
# include "ui/egl-helpers.h"
#endif
Expand All @@ -30,6 +31,7 @@ struct sdl2_console {
int idle_counter;
int ignore_hotkeys;
SDL_GLContext winctx;
QKbdState *kbd;
#ifdef CONFIG_OPENGL
QemuGLShader *gls;
egl_fb guest_fb;
Expand Down
27 changes: 2 additions & 25 deletions ui/sdl2-input.c
Expand Up @@ -30,8 +30,6 @@
#include "ui/sdl2.h"
#include "sysemu/sysemu.h"

static uint8_t modifiers_state[SDL_NUM_SCANCODES];

void sdl2_process_key(struct sdl2_console *scon,
SDL_KeyboardEvent *ev)
{
Expand All @@ -43,31 +41,10 @@ void sdl2_process_key(struct sdl2_console *scon,
}

qcode = qemu_input_map_usb_to_qcode[ev->keysym.scancode];

/* modifier state tracking */
switch (ev->keysym.scancode) {
case SDL_SCANCODE_LCTRL:
case SDL_SCANCODE_LSHIFT:
case SDL_SCANCODE_LALT:
case SDL_SCANCODE_LGUI:
case SDL_SCANCODE_RCTRL:
case SDL_SCANCODE_RSHIFT:
case SDL_SCANCODE_RALT:
case SDL_SCANCODE_RGUI:
if (ev->type == SDL_KEYUP) {
modifiers_state[ev->keysym.scancode] = 0;
} else {
modifiers_state[ev->keysym.scancode] = 1;
}
break;
default:
/* nothing */
break;
}
qkbd_state_key_event(scon->kbd, qcode, ev->type == SDL_KEYDOWN);

if (!qemu_console_is_graphic(con)) {
bool ctrl = (modifiers_state[SDL_SCANCODE_LCTRL] ||
modifiers_state[SDL_SCANCODE_RCTRL]);
bool ctrl = qkbd_state_modifier_get(scon->kbd, QKBD_MOD_CTRL);
if (ev->type == SDL_KEYDOWN) {
switch (ev->keysym.scancode) {
case SDL_SCANCODE_RETURN:
Expand Down
12 changes: 3 additions & 9 deletions ui/sdl2.c
Expand Up @@ -38,7 +38,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_keysym;
static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
static SDL_Cursor *sdl_cursor_normal;
static SDL_Cursor *sdl_cursor_hidden;
Expand Down Expand Up @@ -330,6 +329,7 @@ static void handle_keydown(SDL_Event *ev)
int win;
struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
int gui_key_modifier_pressed = get_mod_state();
int gui_keysym = 0;

if (!scon->ignore_hotkeys && gui_key_modifier_pressed && !ev->key.repeat) {
switch (ev->key.keysym.scancode) {
Expand Down Expand Up @@ -410,16 +410,9 @@ static void handle_keydown(SDL_Event *ev)
static void handle_keyup(SDL_Event *ev)
{
struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
int gui_key_modifier_pressed = get_mod_state();

scon->ignore_hotkeys = false;

if (!gui_key_modifier_pressed) {
gui_keysym = 0;
}
if (!gui_keysym) {
sdl2_process_key(scon, &ev->key);
}
sdl2_process_key(scon, &ev->key);
}

static void handle_textinput(SDL_Event *ev)
Expand Down Expand Up @@ -823,6 +816,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
sdl2_console[i].dcl.ops = &dcl_2d_ops;
#endif
sdl2_console[i].dcl.con = con;
sdl2_console[i].kbd = qkbd_state_init(con);
register_displaychangelistener(&sdl2_console[i].dcl);

#if defined(SDL_VIDEO_DRIVER_WINDOWS) || defined(SDL_VIDEO_DRIVER_X11)
Expand Down

0 comments on commit 07333e1

Please sign in to comment.