From 857e479552cd092edf0f7af09ac5073d76e11057 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 27 Feb 2017 13:23:43 +0000 Subject: ui: Use XkbGetMap and XkbGetNames instead of XkbGetKeyboard XkbGetKeyboard does not work in XWayland and even on non-Wayland X11 servers its use is discouraged: https://bugs.freedesktop.org/show_bug.cgi?id=89240 This resolves a problem whereby QEMU prints "could not lookup keycode name" on startup when running under XWayland. Keymap handling is however still broken after this commit, since Xwayland is reporting a keymap we can't handle "unknown keycodes `(unnamed)', please report to qemu-devel@nongnu.org" NB, native Wayland support (which is the default under GTK3) is not affected - only XWayland (which can be requested with GDK_BACKEND on GTK3, and is the only option for GTK2). Signed-off-by: Daniel P. Berrange Message-id: 20170227132343.30824-1-berrange@redhat.com Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 7 ++++--- ui/sdl.c | 10 ++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ui/gtk.c b/ui/gtk.c index 640ff84368..a86848f3b0 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -2201,11 +2201,12 @@ static void gd_set_keycode_type(GtkDisplayState *s) 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, - XkbUseCoreKbd); + XkbDescPtr desc = XkbGetMap(x11_display, XkbGBN_AllComponentsMask, + XkbUseCoreKbd); char *keycodes = NULL; - if (desc && desc->names) { + if (desc && + (XkbGetNames(x11_display, XkbKeycodesNameMask, desc) == Success)) { keycodes = XGetAtomName(x11_display, desc->names->keycodes); } if (keycodes == NULL) { diff --git a/ui/sdl.c b/ui/sdl.c index 19e8a848a7..37c21a00fb 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -233,10 +233,12 @@ static int check_for_evdev(void) if (!SDL_GetWMInfo(&info)) { return 0; } - desc = XkbGetKeyboard(info.info.x11.display, - XkbGBN_AllComponentsMask, - XkbUseCoreKbd); - if (desc && desc->names) { + desc = XkbGetMap(info.info.x11.display, + XkbGBN_AllComponentsMask, + XkbUseCoreKbd); + if (desc && + (XkbGetNames(info.info.x11.display, + XkbKeycodesNameMask, desc) == Success)) { keycodes = XGetAtomName(info.info.x11.display, desc->names->keycodes); if (keycodes == NULL) { fprintf(stderr, "could not lookup keycode name\n"); -- cgit v1.2.3