mirror of https://github.com/xemu-project/xemu.git
gtk: misc fixes & cleanups.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJTmEtcAAoJEEy22O7T6HE4OigP/3/H6WBaVbhvo59lmuGkaVtf 7xdxAi+8d/d6gd/X0UGyip98+vjdzYd1BDuAc5GfDzMAJCccu03TQwJT6PqbRitb XJt6r69Brd1Epx81xxzkQK/OPmTqlpjlMWL3KcLZHFyyhAijFhVpTbttxEgXfU3G Sg5W/TShsNN+dt0W3SXRQ7VLmoiZbvD5dsL4RkYQyWiHZllG1FTywsSbJQaAACRa LSRH1QasYq0ah+e7sRYTNcMDAy9Z7oQHbyjuk2C7F6nfwE1662lw6JCE4dFGa4Mp YklkGzRnAgD+D7Beu70fNt1SwFe+NxbTN4doV9qpEhcyMnpvftIEjRhN15oc+leM fgJQvjGByL/mSZ3vumYx00NIv+GciCGQaG936YC83LSEjRr6VBxCqait0qL9jwhS pg3AtZiAyHgoD7dOY1lyxu3eSFNevU88w7WbaWajydBbj5bqlJIDsFE2krebo6rv J2pbleiEsZgt2eyF9rZguDUawDvjwHFv8x0YFB/p1Pk+R+bCEQvaqRFGJPiisv7N 84EugPSvVSxm1/C1mc5ZQBXLcWctDIWhCfHVWgw9hy9X36/RUvCvMzuit1ESY1JA 0+9wuNfSnG1CThOqFTGzd1Md8A0doSHUcUIcIaF9XmDsl08IoGA1G9V8lGsE5biO Z6cMRsqnzUtXuHD5Paun =mLkk -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/pull-gtk-20140611-1' into staging gtk: misc fixes & cleanups. # gpg: Signature made Wed 11 Jun 2014 13:28:12 BST using RSA key ID D3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" * remotes/kraxel/tags/pull-gtk-20140611-1: gtk: update window size after showing/hiding tabs gtk: factor out gtk3 grab into the new gd_grab_devices function gtk: cleanup backend dependencies gtk: factor out keycode mapping Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
2a2c4830c0
|
@ -2006,6 +2006,7 @@ fi
|
||||||
|
|
||||||
if test "$gtk" != "no"; then
|
if test "$gtk" != "no"; then
|
||||||
gtkpackage="gtk+-$gtkabi"
|
gtkpackage="gtk+-$gtkabi"
|
||||||
|
gtkx11package="gtk+-x11-$gtkabi"
|
||||||
if test "$gtkabi" = "3.0" ; then
|
if test "$gtkabi" = "3.0" ; then
|
||||||
gtkversion="3.0.0"
|
gtkversion="3.0.0"
|
||||||
else
|
else
|
||||||
|
@ -2014,6 +2015,9 @@ if test "$gtk" != "no"; then
|
||||||
if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
|
if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
|
||||||
gtk_cflags=`$pkg_config --cflags $gtkpackage`
|
gtk_cflags=`$pkg_config --cflags $gtkpackage`
|
||||||
gtk_libs=`$pkg_config --libs $gtkpackage`
|
gtk_libs=`$pkg_config --libs $gtkpackage`
|
||||||
|
if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
|
||||||
|
gtk_libs="$gtk_libs -lX11"
|
||||||
|
fi
|
||||||
libs_softmmu="$gtk_libs $libs_softmmu"
|
libs_softmmu="$gtk_libs $libs_softmmu"
|
||||||
gtk="yes"
|
gtk="yes"
|
||||||
elif test "$gtk" = "yes"; then
|
elif test "$gtk" = "yes"; then
|
||||||
|
|
195
ui/gtk.c
195
ui/gtk.c
|
@ -68,7 +68,7 @@
|
||||||
#include "keymaps.h"
|
#include "keymaps.h"
|
||||||
#include "sysemu/char.h"
|
#include "sysemu/char.h"
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
#ifndef _WIN32
|
#ifdef GDK_WINDOWING_X11
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#include <X11/XKBlib.h>
|
#include <X11/XKBlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -112,6 +112,13 @@ static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh)
|
||||||
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget)
|
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef GDK_IS_X11_DISPLAY
|
||||||
|
#define GDK_IS_X11_DISPLAY(dpy) (dpy == dpy)
|
||||||
|
#endif
|
||||||
|
#ifndef GDK_IS_WIN32_DISPLAY
|
||||||
|
#define GDK_IS_WIN32_DISPLAY(dpy) (dpy == dpy)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef GDK_KEY_0
|
#ifndef GDK_KEY_0
|
||||||
#define GDK_KEY_0 GDK_0
|
#define GDK_KEY_0 GDK_0
|
||||||
#define GDK_KEY_1 GDK_1
|
#define GDK_KEY_1 GDK_1
|
||||||
|
@ -877,33 +884,34 @@ static gboolean gd_scroll_event(GtkWidget *widget, GdkEventScroll *scroll,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
|
static int gd_map_keycode(GtkDisplayState *s, GdkDisplay *dpy, int gdk_keycode)
|
||||||
{
|
{
|
||||||
VirtualConsole *vc = opaque;
|
|
||||||
GtkDisplayState *s = vc->s;
|
|
||||||
int gdk_keycode = key->hardware_keycode;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
UINT qemu_keycode = MapVirtualKey(gdk_keycode, MAPVK_VK_TO_VSC);
|
|
||||||
switch (qemu_keycode) {
|
|
||||||
case 103: /* alt gr */
|
|
||||||
qemu_keycode = 56 | SCANCODE_GREY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int qemu_keycode;
|
int qemu_keycode;
|
||||||
|
|
||||||
|
#ifdef GDK_WINDOWING_WIN32
|
||||||
|
if (GDK_IS_WIN32_DISPLAY(dpy)) {
|
||||||
|
qemu_keycode = MapVirtualKey(gdk_keycode, MAPVK_VK_TO_VSC);
|
||||||
|
switch (qemu_keycode) {
|
||||||
|
case 103: /* alt gr */
|
||||||
|
qemu_keycode = 56 | SCANCODE_GREY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return qemu_keycode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (gdk_keycode < 9) {
|
if (gdk_keycode < 9) {
|
||||||
qemu_keycode = 0;
|
qemu_keycode = 0;
|
||||||
} else if (gdk_keycode < 97) {
|
} else if (gdk_keycode < 97) {
|
||||||
qemu_keycode = gdk_keycode - 8;
|
qemu_keycode = gdk_keycode - 8;
|
||||||
} else if (gdk_keycode < 158) {
|
#ifdef GDK_WINDOWING_X11
|
||||||
|
} else if (GDK_IS_X11_DISPLAY(dpy) && gdk_keycode < 158) {
|
||||||
if (s->has_evdev) {
|
if (s->has_evdev) {
|
||||||
qemu_keycode = translate_evdev_keycode(gdk_keycode - 97);
|
qemu_keycode = translate_evdev_keycode(gdk_keycode - 97);
|
||||||
} else {
|
} else {
|
||||||
qemu_keycode = translate_xfree86_keycode(gdk_keycode - 97);
|
qemu_keycode = translate_xfree86_keycode(gdk_keycode - 97);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
} else if (gdk_keycode == 208) { /* Hiragana_Katakana */
|
} else if (gdk_keycode == 208) { /* Hiragana_Katakana */
|
||||||
qemu_keycode = 0x70;
|
qemu_keycode = 0x70;
|
||||||
} else if (gdk_keycode == 211) { /* backslash */
|
} else if (gdk_keycode == 211) { /* backslash */
|
||||||
|
@ -911,7 +919,20 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
|
||||||
} else {
|
} else {
|
||||||
qemu_keycode = 0;
|
qemu_keycode = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
return qemu_keycode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
|
||||||
|
{
|
||||||
|
VirtualConsole *vc = opaque;
|
||||||
|
GtkDisplayState *s = vc->s;
|
||||||
|
int gdk_keycode = key->hardware_keycode;
|
||||||
|
int qemu_keycode;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
qemu_keycode = gd_map_keycode(s, gtk_widget_get_display(widget),
|
||||||
|
gdk_keycode);
|
||||||
|
|
||||||
trace_gd_key_event(vc->label, gdk_keycode, qemu_keycode,
|
trace_gd_key_event(vc->label, gdk_keycode, qemu_keycode,
|
||||||
(key->type == GDK_KEY_PRESS) ? "down" : "up");
|
(key->type == GDK_KEY_PRESS) ? "down" : "up");
|
||||||
|
@ -984,12 +1005,14 @@ static void gd_menu_switch_vc(GtkMenuItem *item, void *opaque)
|
||||||
static void gd_menu_show_tabs(GtkMenuItem *item, void *opaque)
|
static void gd_menu_show_tabs(GtkMenuItem *item, void *opaque)
|
||||||
{
|
{
|
||||||
GtkDisplayState *s = opaque;
|
GtkDisplayState *s = opaque;
|
||||||
|
VirtualConsole *vc = gd_vc_find_current(s);
|
||||||
|
|
||||||
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(s->show_tabs_item))) {
|
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(s->show_tabs_item))) {
|
||||||
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(s->notebook), TRUE);
|
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(s->notebook), TRUE);
|
||||||
} else {
|
} else {
|
||||||
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(s->notebook), FALSE);
|
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(s->notebook), FALSE);
|
||||||
}
|
}
|
||||||
|
gd_update_windowsize(vc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean gd_tab_window_close(GtkWidget *widget, GdkEvent *event,
|
static gboolean gd_tab_window_close(GtkWidget *widget, GdkEvent *event,
|
||||||
|
@ -1141,28 +1164,39 @@ static void gd_menu_zoom_fit(GtkMenuItem *item, void *opaque)
|
||||||
gd_update_full_redraw(vc);
|
gd_update_full_redraw(vc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
|
static void gd_grab_devices(VirtualConsole *vc, bool grab,
|
||||||
|
GdkInputSource source, GdkEventMask mask,
|
||||||
|
GdkCursor *cursor)
|
||||||
|
{
|
||||||
|
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
||||||
|
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
||||||
|
GList *devs = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
|
||||||
|
GList *tmp = devs;
|
||||||
|
|
||||||
|
for (tmp = devs; tmp; tmp = tmp->next) {
|
||||||
|
GdkDevice *dev = tmp->data;
|
||||||
|
if (gdk_device_get_source(dev) != source) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (grab) {
|
||||||
|
GdkWindow *win = gtk_widget_get_window(vc->gfx.drawing_area);
|
||||||
|
gdk_device_grab(dev, win, GDK_OWNERSHIP_NONE, FALSE,
|
||||||
|
mask, cursor, GDK_CURRENT_TIME);
|
||||||
|
} else {
|
||||||
|
gdk_device_ungrab(dev, GDK_CURRENT_TIME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_list_free(devs);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void gd_grab_keyboard(VirtualConsole *vc)
|
static void gd_grab_keyboard(VirtualConsole *vc)
|
||||||
{
|
{
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
gd_grab_devices(vc, true, GDK_SOURCE_KEYBOARD,
|
||||||
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
|
||||||
GList *devices = gdk_device_manager_list_devices(mgr,
|
NULL);
|
||||||
GDK_DEVICE_TYPE_MASTER);
|
|
||||||
GList *tmp = devices;
|
|
||||||
while (tmp) {
|
|
||||||
GdkDevice *dev = tmp->data;
|
|
||||||
if (gdk_device_get_source(dev) == GDK_SOURCE_KEYBOARD) {
|
|
||||||
gdk_device_grab(dev,
|
|
||||||
gtk_widget_get_window(vc->gfx.drawing_area),
|
|
||||||
GDK_OWNERSHIP_NONE,
|
|
||||||
FALSE,
|
|
||||||
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
|
|
||||||
NULL,
|
|
||||||
GDK_CURRENT_TIME);
|
|
||||||
}
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
|
||||||
g_list_free(devices);
|
|
||||||
#else
|
#else
|
||||||
gdk_keyboard_grab(gtk_widget_get_window(vc->gfx.drawing_area),
|
gdk_keyboard_grab(gtk_widget_get_window(vc->gfx.drawing_area),
|
||||||
FALSE,
|
FALSE,
|
||||||
|
@ -1182,20 +1216,7 @@ static void gd_ungrab_keyboard(GtkDisplayState *s)
|
||||||
s->kbd_owner = NULL;
|
s->kbd_owner = NULL;
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
gd_grab_devices(vc, false, GDK_SOURCE_KEYBOARD, 0, NULL);
|
||||||
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
|
||||||
GList *devices = gdk_device_manager_list_devices(mgr,
|
|
||||||
GDK_DEVICE_TYPE_MASTER);
|
|
||||||
GList *tmp = devices;
|
|
||||||
while (tmp) {
|
|
||||||
GdkDevice *dev = tmp->data;
|
|
||||||
if (gdk_device_get_source(dev) == GDK_SOURCE_KEYBOARD) {
|
|
||||||
gdk_device_ungrab(dev,
|
|
||||||
GDK_CURRENT_TIME);
|
|
||||||
}
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
|
||||||
g_list_free(devices);
|
|
||||||
#else
|
#else
|
||||||
gdk_keyboard_ungrab(GDK_CURRENT_TIME);
|
gdk_keyboard_ungrab(GDK_CURRENT_TIME);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1207,28 +1228,13 @@ static void gd_grab_pointer(VirtualConsole *vc)
|
||||||
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
||||||
GList *devices = gdk_device_manager_list_devices(mgr,
|
gd_grab_devices(vc, true, GDK_SOURCE_MOUSE,
|
||||||
GDK_DEVICE_TYPE_MASTER);
|
GDK_POINTER_MOTION_MASK |
|
||||||
GList *tmp = devices;
|
GDK_BUTTON_PRESS_MASK |
|
||||||
while (tmp) {
|
GDK_BUTTON_RELEASE_MASK |
|
||||||
GdkDevice *dev = tmp->data;
|
GDK_BUTTON_MOTION_MASK |
|
||||||
if (gdk_device_get_source(dev) == GDK_SOURCE_MOUSE) {
|
GDK_SCROLL_MASK,
|
||||||
gdk_device_grab(dev,
|
vc->s->null_cursor);
|
||||||
gtk_widget_get_window(vc->gfx.drawing_area),
|
|
||||||
GDK_OWNERSHIP_NONE,
|
|
||||||
FALSE, /* All events to come to our
|
|
||||||
window directly */
|
|
||||||
GDK_POINTER_MOTION_MASK |
|
|
||||||
GDK_BUTTON_PRESS_MASK |
|
|
||||||
GDK_BUTTON_RELEASE_MASK |
|
|
||||||
GDK_BUTTON_MOTION_MASK |
|
|
||||||
GDK_SCROLL_MASK,
|
|
||||||
vc->s->null_cursor,
|
|
||||||
GDK_CURRENT_TIME);
|
|
||||||
}
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
|
||||||
g_list_free(devices);
|
|
||||||
gdk_device_get_position(gdk_device_manager_get_client_pointer(mgr),
|
gdk_device_get_position(gdk_device_manager_get_client_pointer(mgr),
|
||||||
NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
|
NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
|
||||||
#else
|
#else
|
||||||
|
@ -1261,18 +1267,7 @@ static void gd_ungrab_pointer(GtkDisplayState *s)
|
||||||
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
||||||
GList *devices = gdk_device_manager_list_devices(mgr,
|
gd_grab_devices(vc, false, GDK_SOURCE_MOUSE, 0, NULL);
|
||||||
GDK_DEVICE_TYPE_MASTER);
|
|
||||||
GList *tmp = devices;
|
|
||||||
while (tmp) {
|
|
||||||
GdkDevice *dev = tmp->data;
|
|
||||||
if (gdk_device_get_source(dev) == GDK_SOURCE_MOUSE) {
|
|
||||||
gdk_device_ungrab(dev,
|
|
||||||
GDK_CURRENT_TIME);
|
|
||||||
}
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
|
||||||
g_list_free(devices);
|
|
||||||
gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
|
gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
|
||||||
gtk_widget_get_screen(vc->gfx.drawing_area),
|
gtk_widget_get_screen(vc->gfx.drawing_area),
|
||||||
vc->s->grab_x_root, vc->s->grab_y_root);
|
vc->s->grab_x_root, vc->s->grab_y_root);
|
||||||
|
@ -1793,23 +1788,25 @@ static void gd_create_menus(GtkDisplayState *s)
|
||||||
|
|
||||||
static void gd_set_keycode_type(GtkDisplayState *s)
|
static void gd_set_keycode_type(GtkDisplayState *s)
|
||||||
{
|
{
|
||||||
#ifndef _WIN32
|
#ifdef GDK_WINDOWING_X11
|
||||||
char *keycodes = NULL;
|
|
||||||
GdkDisplay *display = gtk_widget_get_display(s->window);
|
GdkDisplay *display = gtk_widget_get_display(s->window);
|
||||||
Display *x11_display = gdk_x11_display_get_xdisplay(display);
|
if (GDK_IS_X11_DISPLAY(display)) {
|
||||||
XkbDescPtr desc = XkbGetKeyboard(x11_display, XkbGBN_AllComponentsMask,
|
Display *x11_display = gdk_x11_display_get_xdisplay(display);
|
||||||
XkbUseCoreKbd);
|
XkbDescPtr desc = XkbGetKeyboard(x11_display, XkbGBN_AllComponentsMask,
|
||||||
|
XkbUseCoreKbd);
|
||||||
|
char *keycodes = NULL;
|
||||||
|
|
||||||
if (desc && desc->names) {
|
if (desc && desc->names) {
|
||||||
keycodes = XGetAtomName(x11_display, desc->names->keycodes);
|
keycodes = XGetAtomName(x11_display, desc->names->keycodes);
|
||||||
}
|
}
|
||||||
if (keycodes == NULL) {
|
if (keycodes == NULL) {
|
||||||
fprintf(stderr, "could not lookup keycode name\n");
|
fprintf(stderr, "could not lookup keycode name\n");
|
||||||
} else if (strstart(keycodes, "evdev", NULL)) {
|
} else if (strstart(keycodes, "evdev", NULL)) {
|
||||||
s->has_evdev = true;
|
s->has_evdev = true;
|
||||||
} else if (!strstart(keycodes, "xfree86", NULL)) {
|
} else if (!strstart(keycodes, "xfree86", NULL)) {
|
||||||
fprintf(stderr, "unknown keycodes `%s', please report to "
|
fprintf(stderr, "unknown keycodes `%s', please report to "
|
||||||
"qemu-devel@nongnu.org\n", keycodes);
|
"qemu-devel@nongnu.org\n", keycodes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue