From 3d4da9d6f3b664beb5bee446ad53b69178f46ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 1 Jan 2017 10:39:45 +0100 Subject: [PATCH 01/10] ui/gtk: fix crash at startup when no console is available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch fixes a segfault at QEMU startup, introduced in a08156321ab9a7d2fed9ee77dbfeea2a61ffd153. gd_vc_find_current() return NULL, which is dereferenced without checking it. While at it, disable the whole 'View' menu if no console exists. Reproducer: qemu-system-i386 -M none -nodefaults Signed-off-by: Hervé Poussineau Reviewed-by: Stefan Hajnoczi Message-id: 1483263585-8101-1-git-send-email-hpoussin@reactos.org Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/gtk.c b/ui/gtk.c index a216216d8b..406de4f940 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -2171,6 +2171,8 @@ static gboolean gtkinit; void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) { + VirtualConsole *vc; + GtkDisplayState *s = g_malloc0(sizeof(*s)); char *filename; GdkDisplay *window_display; @@ -2249,9 +2251,11 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) } #endif + vc = gd_vc_find_current(s); + gtk_widget_set_sensitive(s->view_menu, vc != NULL); #ifdef CONFIG_VTE gtk_widget_set_sensitive(s->copy_item, - gd_vc_find_current(s)->type == GD_VC_VTE); + vc && vc->type == GD_VC_VTE); #endif if (full_screen) { From a8ffb372a2202c65f42fdb69891ea68a2f274b55 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 1 Dec 2016 09:41:17 +0000 Subject: [PATCH 02/10] ui: use evdev keymap when running under wayland Wayland always uses evdev as its input source, so QEMU can use the existing evdev keymap data Signed-off-by: Daniel P. Berrange Tested-by: Stefan Hajnoczi Message-id: 20161201094117.16407-1-berrange@redhat.com Signed-off-by: Gerd Hoffmann --- include/ui/gtk.h | 4 ++++ ui/gtk.c | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/include/ui/gtk.h b/include/ui/gtk.h index 42ca0fea8b..b3b50059c7 100644 --- a/include/ui/gtk.h +++ b/include/ui/gtk.h @@ -18,6 +18,10 @@ #include #endif +#ifdef GDK_WINDOWING_WAYLAND +#include +#endif + #if defined(CONFIG_OPENGL) #include "ui/egl-helpers.h" #include "ui/egl-context.h" diff --git a/ui/gtk.c b/ui/gtk.c index 406de4f940..356f400af5 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -90,6 +90,9 @@ #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 @@ -1053,6 +1056,10 @@ static int gd_map_keycode(GtkDisplayState *s, GdkDisplay *dpy, int gdk_keycode) } else { qemu_keycode = translate_xfree86_keycode(gdk_keycode - 97); } +#endif +#ifdef GDK_WINDOWING_WAYLAND + } else if (GDK_IS_WAYLAND_DISPLAY(dpy) && gdk_keycode < 158) { + qemu_keycode = translate_evdev_keycode(gdk_keycode - 97); #endif } else if (gdk_keycode == 208) { /* Hiragana_Katakana */ qemu_keycode = 0x70; From b3cb21b9b5ece1756a4796e2f2e3d275bf110002 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 21 Dec 2016 01:38:04 +0100 Subject: [PATCH 03/10] console: add API to get underlying gui window ID This adds two console functions, qemu_console_set_window_id and qemu_graphic_console_get_window_id, to let graphical backend record the window id in the QemuConsole structure, and let the baum driver read it. Signed-off-by: Samuel Thibault Message-id: 20161221003806.22412-2-samuel.thibault@ens-lyon.org Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 4 ++++ ui/console.c | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/include/ui/console.h b/include/ui/console.h index e2589e2134..ee8c407cac 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -394,6 +394,10 @@ uint32_t qemu_console_get_head(QemuConsole *con); QemuUIInfo *qemu_console_get_ui_info(QemuConsole *con); int qemu_console_get_width(QemuConsole *con, int fallback); int qemu_console_get_height(QemuConsole *con, int fallback); +/* Return the low-level window id for the console */ +int qemu_console_get_window_id(QemuConsole *con); +/* Set the low-level window id for the console */ +void qemu_console_set_window_id(QemuConsole *con, int window_id); void console_select(unsigned int index); void qemu_console_resize(QemuConsole *con, int width, int height); diff --git a/ui/console.c b/ui/console.c index ed888e55ea..b9575f2ee5 100644 --- a/ui/console.c +++ b/ui/console.c @@ -124,6 +124,7 @@ struct QemuConsole { int dcls; DisplayChangeListener *gl; bool gl_block; + int window_id; /* Graphic console state. */ Object *device; @@ -273,6 +274,16 @@ void graphic_hw_gl_block(QemuConsole *con, bool block) } } +int qemu_console_get_window_id(QemuConsole *con) +{ + return con->window_id; +} + +void qemu_console_set_window_id(QemuConsole *con, int window_id) +{ + con->window_id = window_id; +} + void graphic_hw_invalidate(QemuConsole *con) { if (!con) { From f29b3431f6294168e5f8fc63edb91c15c6a08e41 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 21 Dec 2016 01:38:05 +0100 Subject: [PATCH 04/10] console: move window ID code from baum to sdl This moves the SDL bits for window ID from the baum driver to SDL, as well as fixing the build for non-X11. Signed-off-by: Samuel Thibault Message-id: 20161221003806.22412-3-samuel.thibault@ens-lyon.org Signed-off-by: Gerd Hoffmann --- backends/baum.c | 31 ++++++++----------------------- ui/sdl.c | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/backends/baum.c b/backends/baum.c index b92369d840..b045ef49c5 100644 --- a/backends/baum.c +++ b/backends/baum.c @@ -27,12 +27,10 @@ #include "sysemu/char.h" #include "qemu/timer.h" #include "hw/usb.h" +#include "ui/console.h" #include #include #include -#ifdef CONFIG_SDL -#include -#endif #if 0 #define DPRINTF(fmt, ...) \ @@ -227,12 +225,8 @@ static const uint8_t nabcc_translation[2][256] = { /* The guest OS has started discussing with us, finish initializing BrlAPI */ static int baum_deferred_init(BaumDriverState *baum) { -#if defined(CONFIG_SDL) -#if SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0) - SDL_SysWMinfo info; -#endif -#endif - int tty; + int tty = BRLAPI_TTY_DEFAULT; + QemuConsole *con; if (baum->deferred_init) { return 1; @@ -243,21 +237,12 @@ static int baum_deferred_init(BaumDriverState *baum) return 0; } -#if defined(CONFIG_SDL) -#if SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0) - memset(&info, 0, sizeof(info)); - SDL_VERSION(&info.version); - if (SDL_GetWMInfo(&info)) { - tty = info.info.x11.wmwindow; - } else { -#endif -#endif - tty = BRLAPI_TTY_DEFAULT; -#if defined(CONFIG_SDL) -#if SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0) + con = qemu_console_lookup_by_index(0); + if (con && qemu_console_is_graphic(con)) { + tty = qemu_console_get_window_id(con); + if (tty == -1) + tty = BRLAPI_TTY_DEFAULT; } -#endif -#endif if (brlapi__enterTtyMode(baum->brlapi, tty, NULL) == -1) { brlapi_perror("baum: brlapi__enterTtyMode"); diff --git a/ui/sdl.c b/ui/sdl.c index d8cf5bcf74..19e8a848a7 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -947,6 +947,7 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) int flags; uint8_t data = 0; const SDL_VideoInfo *vi; + SDL_SysWMinfo info; char *filename; #if defined(__APPLE__) @@ -1023,5 +1024,29 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) sdl_cursor_hidden = SDL_CreateCursor(&data, &data, 8, 1, 0, 0); sdl_cursor_normal = SDL_GetCursor(); + memset(&info, 0, sizeof(info)); + SDL_VERSION(&info.version); + if (SDL_GetWMInfo(&info)) { + int i; + for (i = 0; ; i++) { + /* All consoles share the same window */ + QemuConsole *con = qemu_console_lookup_by_index(i); + if (con) { +#if defined(SDL_VIDEO_DRIVER_X11) + qemu_console_set_window_id(con, info.info.x11.wmwindow); +#elif defined(SDL_VIDEO_DRIVER_NANOX) || \ + defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || \ + defined(SDL_VIDEO_DRIVER_GAPI) || \ + defined(SDL_VIDEO_DRIVER_RISCOS) + qemu_console_set_window_id(con, (int) (uintptr_t) info.window); +#else + qemu_console_set_window_id(con, info.data); +#endif + } else { + break; + } + } + } + atexit(sdl_cleanup); } From d825367172beaa339217c39eca3cf76eeca80056 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 21 Dec 2016 01:38:06 +0100 Subject: [PATCH 05/10] sdl2: set window ID This uses the console API to record the window ID of the SDL2 windows. Signed-off-by: Samuel Thibault Message-id: 20161221003806.22412-4-samuel.thibault@ens-lyon.org Signed-off-by: Gerd Hoffmann --- ui/sdl2.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ui/sdl2.c b/ui/sdl2.c index 30d2a3c35d..9a79b17b92 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -761,6 +761,7 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) uint8_t data = 0; char *filename; int i; + SDL_SysWMinfo info; if (no_frame) { gui_noframe = 1; @@ -786,6 +787,8 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) exit(1); } SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1"); + memset(&info, 0, sizeof(info)); + SDL_VERSION(&info.version); for (i = 0;; i++) { QemuConsole *con = qemu_console_lookup_by_index(i); @@ -813,6 +816,10 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) #endif sdl2_console[i].dcl.con = con; register_displaychangelistener(&sdl2_console[i].dcl); + + if (SDL_GetWindowWMInfo(sdl2_console[i].real_window, &info)) { + qemu_console_set_window_id(con, info.info.x11.window); + } } /* Load a 32x32x4 image. White pixels are transparent. */ From 6250dff39a358a5f61cbaf085bf8be739a6c73f3 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Thu, 8 Dec 2016 10:45:39 +0000 Subject: [PATCH 06/10] egl-helpers: Change file licensing to LGPLv2 The relicense permits sharing the code with Spice which is LGPL. All people listed below have agreed to the relicense: - Arei Gonglei; - Cole Robinson; - Gerd Hoffmann; - Peter Maydell. Signed-off-by: Frediano Ziglio Acked-by: Cole Robinson Acked-by: Gonglei Acked-by: Peter Maydell Message-id: 20161208104539.3045-1-fziglio@redhat.com Signed-off-by: Gerd Hoffmann --- ui/egl-helpers.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index 79cee0503a..cd24568a5e 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2015-2016 Gerd Hoffmann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ #include "qemu/osdep.h" #include #include From c952b71582e2e4be286087ad34de5e3ec1b8d974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Dec 2016 13:55:11 +0300 Subject: [PATCH 07/10] gtk: avoid oob array access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When too many consoles are created, vcs[] may be write out-of-bounds. Signed-off-by: Marc-André Lureau Message-id: 20161207105511.25173-1-marcandre.lureau@redhat.com Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui/gtk.c b/ui/gtk.c index 356f400af5..86368e38b7 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1706,6 +1706,11 @@ static CharDriverState *gd_vc_handler(ChardevVC *vc, Error **errp) ChardevCommon *common = qapi_ChardevVC_base(vc); CharDriverState *chr; + if (nb_vcs == MAX_VCS) { + error_setg(errp, "Maximum number of consoles reached"); + return NULL; + } + chr = qemu_chr_alloc(common, errp); if (!chr) { return NULL; From 97efe4f961dcf5a0126baa75e8a6bff66d33186f Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Mon, 21 Nov 2016 18:25:15 +0100 Subject: [PATCH 08/10] ui/vnc: Fix problem with sending too many bytes as server name If the buffer is not big enough, snprintf() does not return the number of bytes that have been written to the buffer, but the number of bytes that would be needed for writing the whole string. By using this value for the following vnc_write() calls, we send some junk at the end of the name in case the qemu_name is longer than 1017 bytes, which could confuse the VNC clients. Fix this by adding an additional size check here. Buglink: https://bugs.launchpad.net/qemu/+bug/1637447 Signed-off-by: Thomas Huth Reviewed-by: Eric Blake Message-id: 1479749115-21932-1-git-send-email-thuth@redhat.com Signed-off-by: Gerd Hoffmann --- ui/vnc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/vnc.c b/ui/vnc.c index 2c28a59ff7..29aa9c4c97 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -2459,10 +2459,14 @@ static int protocol_client_init(VncState *vs, uint8_t *data, size_t len) pixel_format_message(vs); - if (qemu_name) + if (qemu_name) { size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name); - else + if (size > sizeof(buf)) { + size = sizeof(buf); + } + } else { size = snprintf(buf, sizeof(buf), "QEMU"); + } vnc_write_u32(vs, size); vnc_write(vs, buf, size); From f27ff81070b0cc4f5906361964563cc680febe2d Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sat, 19 Nov 2016 19:53:18 +0100 Subject: [PATCH 09/10] curses: Fix compiler warnings (Mingw-w64 redefinition of macro KEY_EVENT) For builds with Mingw-w64 as it is included in Cygwin, there are two header files which define KEY_EVENT with different values. This results in lots of compiler warnings like this one: CC vl.o In file included from /qemu/include/ui/console.h:340:0, from /qemu/vl.c:76: /usr/i686-w64-mingw32/sys-root/mingw/include/curses.h:1522:0: warning: "KEY_EVENT" redefined #define KEY_EVENT 0633 /* We were interrupted by an event */ In file included from /usr/share/mingw-w64/include/windows.h:74:0, from /usr/share/mingw-w64/include/winsock2.h:23, from /qemu/include/sysemu/os-win32.h:29, from /qemu/include/qemu/osdep.h:100, from /qemu/vl.c:24: /usr/share/mingw-w64/include/wincon.h:101:0: note: this is the location of the previous definition #define KEY_EVENT 0x1 QEMU only uses the KEY_EVENT macro from wincon.h. Therefore we can undefine the macro coming from curses.h. The explicit include statement for curses.h in ui/curses.c is not needed and was removed. Those two modifications fix the redefinition warnings. Signed-off-by: Stefan Weil Acked-by: Samuel Thibault Message-id: 20161119185318.10564-1-sw@weilnetz.de Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 3 +++ ui/curses.c | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/ui/console.h b/include/ui/console.h index ee8c407cac..b59e7b8c15 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -337,7 +337,10 @@ static inline pixman_format_code_t surface_format(DisplaySurface *s) } #ifdef CONFIG_CURSES +/* KEY_EVENT is defined in wincon.h and in curses.h. Avoid redefinition. */ +#undef KEY_EVENT #include +#undef KEY_EVENT typedef chtype console_ch_t; extern chtype vga_to_curses[]; #else diff --git a/ui/curses.c b/ui/curses.c index 2e132a7bfa..03cefdf470 100644 --- a/ui/curses.c +++ b/ui/curses.c @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include "qemu/osdep.h" -#include #ifndef _WIN32 #include From e934644126f214a99bb3b3201f73fe7f0c579ef7 Mon Sep 17 00:00:00 2001 From: OGAWA Hirofumi Date: Wed, 28 Dec 2016 04:55:51 +0900 Subject: [PATCH 10/10] ps2: Fix lost scancodes by recent changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With "ps2: use QEMU qcodes instead of scancodes", key handling was changed to qcode base. But all scancodes are not converted to new one. This adds some missing qcodes/scancodes what I found in using. [set1 and set3 are from ] Signed-off-by: OGAWA Hirofumi Reviewed-by: Hervé Poussineau Signed-off-by: Gerd Hoffmann --- hw/input/ps2.c | 10 ++++++++++ qapi-schema.json | 6 +++++- ui/input-keymap.c | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 0d14de08a6..8485a4edaf 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -252,6 +252,9 @@ static const uint16_t qcode_to_keycode_set1[Q_KEY_CODE__MAX] = { [Q_KEY_CODE_ASTERISK] = 0x37, [Q_KEY_CODE_LESS] = 0x56, [Q_KEY_CODE_RO] = 0x73, + [Q_KEY_CODE_HIRAGANA] = 0x70, + [Q_KEY_CODE_HENKAN] = 0x79, + [Q_KEY_CODE_YEN] = 0x7d, [Q_KEY_CODE_KP_COMMA] = 0x7e, }; @@ -394,6 +397,9 @@ static const uint16_t qcode_to_keycode_set2[Q_KEY_CODE__MAX] = { [Q_KEY_CODE_LESS] = 0x61, [Q_KEY_CODE_SYSRQ] = 0x7f, [Q_KEY_CODE_RO] = 0x51, + [Q_KEY_CODE_HIRAGANA] = 0x13, + [Q_KEY_CODE_HENKAN] = 0x64, + [Q_KEY_CODE_YEN] = 0x6a, [Q_KEY_CODE_KP_COMMA] = 0x6d, }; @@ -504,6 +510,10 @@ static const uint16_t qcode_to_keycode_set3[Q_KEY_CODE__MAX] = { [Q_KEY_CODE_COMMA] = 0x41, [Q_KEY_CODE_DOT] = 0x49, [Q_KEY_CODE_SLASH] = 0x4a, + + [Q_KEY_CODE_HIRAGANA] = 0x87, + [Q_KEY_CODE_HENKAN] = 0x86, + [Q_KEY_CODE_YEN] = 0x5d, }; static uint8_t translate_table[256] = { diff --git a/qapi-schema.json b/qapi-schema.json index a0d3b5d7c5..eab8d4a9ee 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3618,6 +3618,9 @@ # @kp_comma: since 2.4 # @kp_equals: since 2.6 # @power: since 2.6 +# @hiragana: since 2.9 +# @henkan: since 2.9 +# @yen: since 2.9 # # An enumeration of key name. # @@ -3642,7 +3645,8 @@ 'kp_9', 'less', 'f11', 'f12', 'print', 'home', 'pgup', 'pgdn', 'end', 'left', 'up', 'down', 'right', 'insert', 'delete', 'stop', 'again', 'props', 'undo', 'front', 'copy', 'open', 'paste', 'find', 'cut', - 'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause', 'ro', + 'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause', + 'ro', 'hiragana', 'henkan', 'yen', 'kp_comma', 'kp_equals', 'power' ] } ## diff --git a/ui/input-keymap.c b/ui/input-keymap.c index f1e700d720..8a1476fc48 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -131,6 +131,9 @@ static const int qcode_to_number[] = { [Q_KEY_CODE_DELETE] = 0xd3, [Q_KEY_CODE_RO] = 0x73, + [Q_KEY_CODE_HIRAGANA] = 0x70, + [Q_KEY_CODE_HENKAN] = 0x79, + [Q_KEY_CODE_YEN] = 0x7d, [Q_KEY_CODE_KP_COMMA] = 0x7e, [Q_KEY_CODE__MAX] = 0,