gtk: Avoid accel key leakage into guest on console switch

GTK2 sends the accel key to the guest when switching to the graphic
console via that shortcut. Resolve this by ignoring any keys until the
next key-release event. However, do not ignore keys when switching via
the menu or when on GTK3.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Jan Kiszka 2015-04-26 21:04:21 +02:00 committed by Gerd Hoffmann
parent 9d677e1c2f
commit 1a01716a30

View File

@ -231,6 +231,7 @@ struct GtkDisplayState {
bool modifier_pressed[ARRAY_SIZE(modifier_keycode)]; bool modifier_pressed[ARRAY_SIZE(modifier_keycode)];
bool has_evdev; bool has_evdev;
bool ignore_keys;
}; };
static void gd_grab_pointer(VirtualConsole *vc); static void gd_grab_pointer(VirtualConsole *vc);
@ -993,6 +994,11 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
int qemu_keycode; int qemu_keycode;
int i; int i;
if (s->ignore_keys) {
s->ignore_keys = (key->type == GDK_KEY_PRESS);
return TRUE;
}
if (key->keyval == GDK_KEY_Pause) { if (key->keyval == GDK_KEY_Pause) {
qemu_input_event_send_key_qcode(vc->gfx.dcl.con, Q_KEY_CODE_PAUSE, qemu_input_event_send_key_qcode(vc->gfx.dcl.con, Q_KEY_CODE_PAUSE,
key->type == GDK_KEY_PRESS); key->type == GDK_KEY_PRESS);
@ -1069,12 +1075,18 @@ static void gd_menu_switch_vc(GtkMenuItem *item, void *opaque)
gtk_notebook_set_current_page(nb, page); gtk_notebook_set_current_page(nb, page);
gtk_widget_grab_focus(vc->focus); gtk_widget_grab_focus(vc->focus);
} }
s->ignore_keys = false;
} }
static void gd_accel_switch_vc(void *opaque) static void gd_accel_switch_vc(void *opaque)
{ {
VirtualConsole *vc = opaque; VirtualConsole *vc = opaque;
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(vc->menu_item), TRUE); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(vc->menu_item), TRUE);
#if !GTK_CHECK_VERSION(3, 0, 0)
/* GTK2 sends the accel key to the target console - ignore this until */
vc->s->ignore_keys = true;
#endif
} }
static void gd_menu_show_tabs(GtkMenuItem *item, void *opaque) static void gd_menu_show_tabs(GtkMenuItem *item, void *opaque)