Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/kraxel/tags/pull-gtk-20150508-1…
Browse files Browse the repository at this point in the history
…' 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>
  • Loading branch information
pm215 committed May 11, 2015
2 parents 4ae740c + 1271f7f commit ec62ad1
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 74 deletions.
1 change: 1 addition & 0 deletions include/ui/console.h
Expand Up @@ -228,6 +228,7 @@ void update_displaychangelistener(DisplayChangeListener *dcl,
uint64_t interval);
void unregister_displaychangelistener(DisplayChangeListener *dcl);

bool dpy_ui_info_supported(QemuConsole *con);
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info);

void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h);
Expand Down
76 changes: 76 additions & 0 deletions include/ui/gtk.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 changes: 24 additions & 3 deletions ui/console.c
Expand Up @@ -126,6 +126,7 @@ struct QemuConsole {
Object *device;
uint32_t head;
QemuUIInfo ui_info;
QEMUTimer *ui_timer;
const GraphicHwOps *hw_ops;
void *hw;

Expand Down Expand Up @@ -1383,14 +1384,33 @@ void unregister_displaychangelistener(DisplayChangeListener *dcl)
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)
{
assert(con != NULL);
con->ui_info = *info;
if (con->hw_ops->ui_info) {
return con->hw_ops->ui_info(con->hw, con->head, info);
if (!dpy_ui_info_supported(con)) {
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)
Expand Down Expand Up @@ -1724,6 +1744,7 @@ QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
ds = get_alloc_displaystate();
trace_console_gfx_new();
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);
if (dev) {
object_property_set_link(OBJECT(s), OBJECT(dev), "device",
Expand Down
94 changes: 23 additions & 71 deletions ui/gtk.c
Expand Up @@ -34,24 +34,11 @@
#define GETTEXT_PACKAGE "qemu"
#define LOCALEDIR "po"

#ifdef _WIN32
# define _WIN32_WINNT 0x0601 /* needed to get definition of MAPVK_VK_TO_VSC */
#endif

#include "qemu-common.h"

#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 "ui/console.h"
#include "ui/gtk.h"

#include <gdk/gdkkeysyms.h>
#include <glib/gi18n.h>
#include <locale.h>
#if defined(CONFIG_VTE)
Expand All @@ -60,18 +47,13 @@
#include <math.h>

#include "trace.h"
#include "ui/console.h"
#include "ui/input.h"
#include "sysemu/sysemu.h"
#include "qmp-commands.h"
#include "x_keymap.h"
#include "keymaps.h"
#include "sysemu/char.h"
#include "qom/object.h"
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#include <X11/XKBlib.h>
#endif

#define MAX_VCS 10
#define VC_WINDOW_X_MIN 320
Expand Down Expand Up @@ -99,15 +81,6 @@
# define VTE_RESIZE_HACK 1
#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)
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget)
#endif
Expand Down Expand Up @@ -138,48 +111,6 @@ static const int modifier_keycode[] = {
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 {
GtkWidget *window;

Expand Down Expand Up @@ -532,6 +463,8 @@ static void gd_mouse_set(DisplayChangeListener *dcl,
gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
gtk_widget_get_screen(vc->gfx.drawing_area),
x_root, y_root);
vc->s->last_x = x;
vc->s->last_y = y;
}
#else
static void gd_mouse_set(DisplayChangeListener *dcl,
Expand Down Expand Up @@ -1478,6 +1411,19 @@ static gboolean gd_focus_out_event(GtkWidget *widget,
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 **/

static GSList *gd_vc_menu_init(GtkDisplayState *s, VirtualConsole *vc,
Expand Down Expand Up @@ -1655,6 +1601,8 @@ static void gd_connect_vc_gfx_signals(VirtualConsole *vc)
G_CALLBACK(gd_leave_event), vc);
g_signal_connect(vc->gfx.drawing_area, "focus-out-event",
G_CALLBACK(gd_focus_out_event), vc);
g_signal_connect(vc->gfx.drawing_area, "configure-event",
G_CALLBACK(gd_configure), vc);
} else {
g_signal_connect(vc->gfx.drawing_area, "key-press-event",
G_CALLBACK(gd_text_key_down), vc);
Expand Down Expand Up @@ -1772,6 +1720,10 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,
gd_connect_vc_gfx_signals(vc);
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;
}

Expand Down

0 comments on commit ec62ad1

Please sign in to comment.