diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/console.c | 11 | ||||
-rw-r--r-- | ui/curses.c | 1 | ||||
-rw-r--r-- | ui/egl-helpers.c | 16 | ||||
-rw-r--r-- | ui/gtk.c | 18 | ||||
-rw-r--r-- | ui/input-keymap.c | 3 | ||||
-rw-r--r-- | ui/sdl.c | 25 | ||||
-rw-r--r-- | ui/sdl2.c | 7 | ||||
-rw-r--r-- | ui/vnc.c | 8 |
8 files changed, 85 insertions, 4 deletions
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) { 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 <curses.h> #ifndef _WIN32 #include <sys/ioctl.h> 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 <kraxel@redhat.com> + * + * 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 <http://www.gnu.org/licenses/>. + */ #include "qemu/osdep.h" #include <glob.h> #include <dirent.h> @@ -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 @@ -1054,6 +1057,10 @@ static int gd_map_keycode(GtkDisplayState *s, GdkDisplay *dpy, int gdk_keycode) 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; } else if (gdk_keycode == 211) { /* backslash */ @@ -1699,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; @@ -2171,6 +2183,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 +2263,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) { 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, @@ -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); } @@ -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. */ @@ -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); |