--- a/ui/gtk.c +++ b/ui/gtk.c @@ -90,9 +90,13 @@ #ifndef GDK_IS_X11_DISPLAY #define GDK_IS_X11_DISPLAY(dpy) (dpy == dpy) #endif +#ifndef GDK_IS_WAYLAND_DISPLAY +#define GDK_IS_WAYLAND_DISPLAY(dpy) (dpy == dpy) +#endif #ifndef GDK_IS_WIN32_DISPLAY #define GDK_IS_WIN32_DISPLAY(dpy) (dpy == dpy) #endif +#include #if !GTK_CHECK_VERSION(2, 22, 0) #define GDK_KEY_0 GDK_0 @@ -1054,6 +1058,14 @@ qemu_keycode = translate_xfree86_keycode(gdk_keycode - 97); } #endif + +#ifdef GDK_WINDOWING_WAYLAND + } else if (GDK_IS_WAYLAND_DISPLAY(dpy) && gdk_keycode < 158) { + if (s->has_evdev) { + qemu_keycode = translate_evdev_keycode(gdk_keycode - 97); + } +#endif + } else if (gdk_keycode == 208) { /* Hiragana_Katakana */ qemu_keycode = 0x70; } else if (gdk_keycode == 211) { /* backslash */ @@ -1065,6 +1077,8 @@ return qemu_keycode; } + + static gboolean gd_text_key_down(GtkWidget *widget, GdkEventKey *key, void *opaque) { @@ -2137,8 +2151,8 @@ static void gd_set_keycode_type(GtkDisplayState *s) { +GdkDisplay *display = gtk_widget_get_display(s->window); #ifdef GDK_WINDOWING_X11 - GdkDisplay *display = gtk_widget_get_display(s->window); if (GDK_IS_X11_DISPLAY(display)) { Display *x11_display = gdk_x11_display_get_xdisplay(display); XkbDescPtr desc = XkbGetKeyboard(x11_display, XkbGBN_AllComponentsMask, @@ -2163,8 +2177,18 @@ if (keycodes) { XFree(keycodes); } + return; } #endif +#ifdef GDK_WINDOWING_WAYLAND + if (GDK_IS_WAYLAND_DISPLAY(display)) { + //TODO actually use Wayland/libinput API to detect evdev + //Currently evdev is the only backend supported by + //libinput, but others may be added in the future. + s->has_evdev = true; + return; + } +#endif } static gboolean gtkinit;