gtk: add ui_info support, cleanups + fixes.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJVTKI4AAoJEEy22O7T6HE4eP8P/1luJq5YIXcMhk+fBvAAOZhp jpYG9u48CHEWwArcdeeyC142Z6bR3G3UKApsGoikzyIqt5uALe/4Z/APcdvfPM+S efjdtAMPymSY0Hstg9zLL+lqMMFusShzodvdE/O3oS+swxBzVZNKGPrGE94OX48j RvDykDOlKqvumSwJtgX8b68la2UHUQZU35XzUuBnHV47ifWEGHGIAVZs73PJXOdk 7TGvsOHaPHUygy7zPpnlo87606uApN6VZRFWAaCLxKZ1WS8O/vkqfx9DQ5KLbunv vX4epXH8lkmCAYwXelOoYhw37WN8kgWy5d7nbLvmMwcZz+yMgUjNDS6emC1OV+TV QY5V7btABh2Nb+nX5nQCY1RgXO4rttKYakTOgfabQbBq1XqqBY8Zvpszju/DV5J6 Z8oIEqo7oyY7YBYvToXjFWz5zf+NH2pWILbhPCRponp3FPWraMt/+FJ5zU47s31p fBnHrmfV3E82MhrJNArE/W5lvQzPzGhUf/4+JZ62eoxoRlzAt5jORRfXLcsAuCZm zxUKRntDro76fBPPWot99LDLtUrJtxtw0ZLz4wn5xd8IYCbQBsVtUsCROG3vjqYx P4EhpGcNqfPd7g23mUSFAHYiKENOjzB8zvROp07jCorVm3CqNYVrYOGAnQQXhxar RS+LAWMFtVFhQi6GGnaX =uLWh -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/pull-gtk-20150508-1' into staging gtk: add ui_info support, cleanups + fixes. # gpg: Signature made Fri May 8 12:47:04 2015 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-20150508-1: gtk: update mouse position in mouse_set() gtk: create gtk.h gtk: add ui_info support console: add dpy_ui_info_supported console: delayed ui_info guest notification Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
ec62ad1e27
|
@ -228,6 +228,7 @@ void update_displaychangelistener(DisplayChangeListener *dcl,
|
||||||
uint64_t interval);
|
uint64_t interval);
|
||||||
void unregister_displaychangelistener(DisplayChangeListener *dcl);
|
void unregister_displaychangelistener(DisplayChangeListener *dcl);
|
||||||
|
|
||||||
|
bool dpy_ui_info_supported(QemuConsole *con);
|
||||||
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info);
|
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info);
|
||||||
|
|
||||||
void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h);
|
void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h);
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
#ifndef UI_GTK_H
|
||||||
|
#define UI_GTK_H
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# define _WIN32_WINNT 0x0601 /* needed to get definition of MAPVK_VK_TO_VSC */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
|
||||||
|
/* Work around an -Wstrict-prototypes warning in GTK headers */
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
|
||||||
|
#endif
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
|
||||||
|
#ifdef GDK_WINDOWING_X11
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Compatibility define to let us build on both Gtk2 and Gtk3 */
|
||||||
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
|
static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh)
|
||||||
|
{
|
||||||
|
*ww = gdk_window_get_width(w);
|
||||||
|
*wh = gdk_window_get_height(w);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct GtkDisplayState GtkDisplayState;
|
||||||
|
|
||||||
|
typedef struct VirtualGfxConsole {
|
||||||
|
GtkWidget *drawing_area;
|
||||||
|
DisplayChangeListener dcl;
|
||||||
|
DisplaySurface *ds;
|
||||||
|
pixman_image_t *convert;
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
double scale_x;
|
||||||
|
double scale_y;
|
||||||
|
} VirtualGfxConsole;
|
||||||
|
|
||||||
|
#if defined(CONFIG_VTE)
|
||||||
|
typedef struct VirtualVteConsole {
|
||||||
|
GtkWidget *box;
|
||||||
|
GtkWidget *scrollbar;
|
||||||
|
GtkWidget *terminal;
|
||||||
|
CharDriverState *chr;
|
||||||
|
} VirtualVteConsole;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum VirtualConsoleType {
|
||||||
|
GD_VC_GFX,
|
||||||
|
GD_VC_VTE,
|
||||||
|
} VirtualConsoleType;
|
||||||
|
|
||||||
|
typedef struct VirtualConsole {
|
||||||
|
GtkDisplayState *s;
|
||||||
|
char *label;
|
||||||
|
GtkWidget *window;
|
||||||
|
GtkWidget *menu_item;
|
||||||
|
GtkWidget *tab_item;
|
||||||
|
GtkWidget *focus;
|
||||||
|
VirtualConsoleType type;
|
||||||
|
union {
|
||||||
|
VirtualGfxConsole gfx;
|
||||||
|
#if defined(CONFIG_VTE)
|
||||||
|
VirtualVteConsole vte;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
} VirtualConsole;
|
||||||
|
|
||||||
|
#endif /* UI_GTK_H */
|
27
ui/console.c
27
ui/console.c
|
@ -126,6 +126,7 @@ struct QemuConsole {
|
||||||
Object *device;
|
Object *device;
|
||||||
uint32_t head;
|
uint32_t head;
|
||||||
QemuUIInfo ui_info;
|
QemuUIInfo ui_info;
|
||||||
|
QEMUTimer *ui_timer;
|
||||||
const GraphicHwOps *hw_ops;
|
const GraphicHwOps *hw_ops;
|
||||||
void *hw;
|
void *hw;
|
||||||
|
|
||||||
|
@ -1383,14 +1384,33 @@ void unregister_displaychangelistener(DisplayChangeListener *dcl)
|
||||||
gui_setup_refresh(ds);
|
gui_setup_refresh(ds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dpy_set_ui_info_timer(void *opaque)
|
||||||
|
{
|
||||||
|
QemuConsole *con = opaque;
|
||||||
|
|
||||||
|
con->hw_ops->ui_info(con->hw, con->head, &con->ui_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dpy_ui_info_supported(QemuConsole *con)
|
||||||
|
{
|
||||||
|
return con->hw_ops->ui_info != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info)
|
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info)
|
||||||
{
|
{
|
||||||
assert(con != NULL);
|
assert(con != NULL);
|
||||||
con->ui_info = *info;
|
con->ui_info = *info;
|
||||||
if (con->hw_ops->ui_info) {
|
if (!dpy_ui_info_supported(con)) {
|
||||||
return con->hw_ops->ui_info(con->hw, con->head, info);
|
return -1;
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
|
/*
|
||||||
|
* Typically we get a flood of these as the user resizes the window.
|
||||||
|
* Wait until the dust has settled (one second without updates), then
|
||||||
|
* go notify the guest.
|
||||||
|
*/
|
||||||
|
timer_mod(con->ui_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 1000);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
|
void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
|
||||||
|
@ -1724,6 +1744,7 @@ QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
|
||||||
ds = get_alloc_displaystate();
|
ds = get_alloc_displaystate();
|
||||||
trace_console_gfx_new();
|
trace_console_gfx_new();
|
||||||
s = new_console(ds, GRAPHIC_CONSOLE, head);
|
s = new_console(ds, GRAPHIC_CONSOLE, head);
|
||||||
|
s->ui_timer = timer_new_ms(QEMU_CLOCK_REALTIME, dpy_set_ui_info_timer, s);
|
||||||
graphic_console_set_hwops(s, hw_ops, opaque);
|
graphic_console_set_hwops(s, hw_ops, opaque);
|
||||||
if (dev) {
|
if (dev) {
|
||||||
object_property_set_link(OBJECT(s), OBJECT(dev), "device",
|
object_property_set_link(OBJECT(s), OBJECT(dev), "device",
|
||||||
|
|
94
ui/gtk.c
94
ui/gtk.c
|
@ -34,24 +34,11 @@
|
||||||
#define GETTEXT_PACKAGE "qemu"
|
#define GETTEXT_PACKAGE "qemu"
|
||||||
#define LOCALEDIR "po"
|
#define LOCALEDIR "po"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# define _WIN32_WINNT 0x0601 /* needed to get definition of MAPVK_VK_TO_VSC */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
|
|
||||||
#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
|
#include "ui/console.h"
|
||||||
/* Work around an -Wstrict-prototypes warning in GTK headers */
|
#include "ui/gtk.h"
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
|
|
||||||
#endif
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <gdk/gdkkeysyms.h>
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#if defined(CONFIG_VTE)
|
#if defined(CONFIG_VTE)
|
||||||
|
@ -60,7 +47,6 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "ui/console.h"
|
|
||||||
#include "ui/input.h"
|
#include "ui/input.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
|
@ -68,10 +54,6 @@
|
||||||
#include "keymaps.h"
|
#include "keymaps.h"
|
||||||
#include "sysemu/char.h"
|
#include "sysemu/char.h"
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
#ifdef GDK_WINDOWING_X11
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#include <X11/XKBlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_VCS 10
|
#define MAX_VCS 10
|
||||||
#define VC_WINDOW_X_MIN 320
|
#define VC_WINDOW_X_MIN 320
|
||||||
|
@ -99,15 +81,6 @@
|
||||||
# define VTE_RESIZE_HACK 1
|
# define VTE_RESIZE_HACK 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Compatibility define to let us build on both Gtk2 and Gtk3 */
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
|
||||||
static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh)
|
|
||||||
{
|
|
||||||
*ww = gdk_window_get_width(w);
|
|
||||||
*wh = gdk_window_get_height(w);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(2, 20, 0)
|
#if !GTK_CHECK_VERSION(2, 20, 0)
|
||||||
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget)
|
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget)
|
||||||
#endif
|
#endif
|
||||||
|
@ -138,48 +111,6 @@ static const int modifier_keycode[] = {
|
||||||
0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8, 0xdb, 0xdd,
|
0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8, 0xdb, 0xdd,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct GtkDisplayState GtkDisplayState;
|
|
||||||
|
|
||||||
typedef struct VirtualGfxConsole {
|
|
||||||
GtkWidget *drawing_area;
|
|
||||||
DisplayChangeListener dcl;
|
|
||||||
DisplaySurface *ds;
|
|
||||||
pixman_image_t *convert;
|
|
||||||
cairo_surface_t *surface;
|
|
||||||
double scale_x;
|
|
||||||
double scale_y;
|
|
||||||
} VirtualGfxConsole;
|
|
||||||
|
|
||||||
#if defined(CONFIG_VTE)
|
|
||||||
typedef struct VirtualVteConsole {
|
|
||||||
GtkWidget *box;
|
|
||||||
GtkWidget *scrollbar;
|
|
||||||
GtkWidget *terminal;
|
|
||||||
CharDriverState *chr;
|
|
||||||
} VirtualVteConsole;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum VirtualConsoleType {
|
|
||||||
GD_VC_GFX,
|
|
||||||
GD_VC_VTE,
|
|
||||||
} VirtualConsoleType;
|
|
||||||
|
|
||||||
typedef struct VirtualConsole {
|
|
||||||
GtkDisplayState *s;
|
|
||||||
char *label;
|
|
||||||
GtkWidget *window;
|
|
||||||
GtkWidget *menu_item;
|
|
||||||
GtkWidget *tab_item;
|
|
||||||
GtkWidget *focus;
|
|
||||||
VirtualConsoleType type;
|
|
||||||
union {
|
|
||||||
VirtualGfxConsole gfx;
|
|
||||||
#if defined(CONFIG_VTE)
|
|
||||||
VirtualVteConsole vte;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
} VirtualConsole;
|
|
||||||
|
|
||||||
struct GtkDisplayState {
|
struct GtkDisplayState {
|
||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
|
|
||||||
|
@ -532,6 +463,8 @@ static void gd_mouse_set(DisplayChangeListener *dcl,
|
||||||
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),
|
||||||
x_root, y_root);
|
x_root, y_root);
|
||||||
|
vc->s->last_x = x;
|
||||||
|
vc->s->last_y = y;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void gd_mouse_set(DisplayChangeListener *dcl,
|
static void gd_mouse_set(DisplayChangeListener *dcl,
|
||||||
|
@ -1478,6 +1411,19 @@ static gboolean gd_focus_out_event(GtkWidget *widget,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean gd_configure(GtkWidget *widget,
|
||||||
|
GdkEventConfigure *cfg, gpointer opaque)
|
||||||
|
{
|
||||||
|
VirtualConsole *vc = opaque;
|
||||||
|
QemuUIInfo info;
|
||||||
|
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
info.width = cfg->width;
|
||||||
|
info.height = cfg->height;
|
||||||
|
dpy_set_ui_info(vc->gfx.dcl.con, &info);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/** Virtual Console Callbacks **/
|
/** Virtual Console Callbacks **/
|
||||||
|
|
||||||
static GSList *gd_vc_menu_init(GtkDisplayState *s, VirtualConsole *vc,
|
static GSList *gd_vc_menu_init(GtkDisplayState *s, VirtualConsole *vc,
|
||||||
|
@ -1655,6 +1601,8 @@ static void gd_connect_vc_gfx_signals(VirtualConsole *vc)
|
||||||
G_CALLBACK(gd_leave_event), vc);
|
G_CALLBACK(gd_leave_event), vc);
|
||||||
g_signal_connect(vc->gfx.drawing_area, "focus-out-event",
|
g_signal_connect(vc->gfx.drawing_area, "focus-out-event",
|
||||||
G_CALLBACK(gd_focus_out_event), vc);
|
G_CALLBACK(gd_focus_out_event), vc);
|
||||||
|
g_signal_connect(vc->gfx.drawing_area, "configure-event",
|
||||||
|
G_CALLBACK(gd_configure), vc);
|
||||||
} else {
|
} else {
|
||||||
g_signal_connect(vc->gfx.drawing_area, "key-press-event",
|
g_signal_connect(vc->gfx.drawing_area, "key-press-event",
|
||||||
G_CALLBACK(gd_text_key_down), vc);
|
G_CALLBACK(gd_text_key_down), vc);
|
||||||
|
@ -1772,6 +1720,10 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,
|
||||||
gd_connect_vc_gfx_signals(vc);
|
gd_connect_vc_gfx_signals(vc);
|
||||||
group = gd_vc_menu_init(s, vc, idx, group, view_menu);
|
group = gd_vc_menu_init(s, vc, idx, group, view_menu);
|
||||||
|
|
||||||
|
if (dpy_ui_info_supported(vc->gfx.dcl.con)) {
|
||||||
|
gtk_menu_item_activate(GTK_MENU_ITEM(s->zoom_fit_item));
|
||||||
|
}
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue