* [Qemu-devel] [PULL 0/5] gtk patch queue.
@ 2015-05-08 11:48 Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 1/5] console: delayed ui_info guest notification Gerd Hoffmann
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2015-05-08 11:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Hi,
This brings ui_info support for gtk and some small cleanups+fixes.
please pull,
Gerd
The following changes since commit 874e9aeeeb74c5459639a93439a502d262847e68:
Merge remote-tracking branch 'remotes/kraxel/tags/pull-sdl-20150505-1' into staging (2015-05-05 14:06:12 +0100)
are available in the git repository at:
git://git.kraxel.org/qemu tags/pull-gtk-20150508-1
for you to fetch changes up to 1271f7f7c60e0b0a3cc031921008a69dfd53bd34:
gtk: update mouse position in mouse_set() (2015-05-06 08:38:05 +0200)
----------------------------------------------------------------
gtk: add ui_info support, cleanups + fixes.
----------------------------------------------------------------
Gerd Hoffmann (5):
console: delayed ui_info guest notification
console: add dpy_ui_info_supported
gtk: add ui_info support
gtk: create gtk.h
gtk: update mouse position in mouse_set()
include/ui/console.h | 1 +
include/ui/gtk.h | 76 ++++++++++++++++++++++++++++++++++++++++++
ui/console.c | 27 +++++++++++++--
ui/gtk.c | 94 +++++++++++++---------------------------------------
4 files changed, 124 insertions(+), 74 deletions(-)
create mode 100644 include/ui/gtk.h
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 1/5] console: delayed ui_info guest notification
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
@ 2015-05-08 11:48 ` Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 2/5] console: add dpy_ui_info_supported Gerd Hoffmann
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2015-05-08 11:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
So we don't flood the guest with display change notifications
while the user resizes the window.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/console.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/ui/console.c b/ui/console.c
index f5295c4..248dd60 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -126,6 +126,7 @@ struct QemuConsole {
Object *device;
uint32_t head;
QemuUIInfo ui_info;
+ QEMUTimer *ui_timer;
const GraphicHwOps *hw_ops;
void *hw;
@@ -1383,14 +1384,28 @@ 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);
+}
+
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 (!con->hw_ops->ui_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)
@@ -1724,6 +1739,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",
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 2/5] console: add dpy_ui_info_supported
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 1/5] console: delayed ui_info guest notification Gerd Hoffmann
@ 2015-05-08 11:48 ` Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 3/5] gtk: add ui_info support Gerd Hoffmann
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2015-05-08 11:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Allow ui code to check whenever the emulated
display supports display change notifications.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
include/ui/console.h | 1 +
ui/console.c | 7 ++++++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/include/ui/console.h b/include/ui/console.h
index 0b75896..e8b3a9e 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -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);
diff --git a/ui/console.c b/ui/console.c
index 248dd60..406c36b 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1391,11 +1391,16 @@ static void dpy_set_ui_info_timer(void *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) {
+ if (!dpy_ui_info_supported(con)) {
return -1;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 3/5] gtk: add ui_info support
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 1/5] console: delayed ui_info guest notification Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 2/5] console: add dpy_ui_info_supported Gerd Hoffmann
@ 2015-05-08 11:48 ` Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 4/5] gtk: create gtk.h Gerd Hoffmann
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2015-05-08 11:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Pass new display size to the guest after window resizes.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/gtk.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/ui/gtk.c b/ui/gtk.c
index 51ea1b9..9163b43 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1478,6 +1478,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,
@@ -1655,6 +1668,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);
@@ -1772,6 +1787,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;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 4/5] gtk: create gtk.h
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
` (2 preceding siblings ...)
2015-05-08 11:48 ` [Qemu-devel] [PULL 3/5] gtk: add ui_info support Gerd Hoffmann
@ 2015-05-08 11:48 ` Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 5/5] gtk: update mouse position in mouse_set() Gerd Hoffmann
2015-05-11 11:00 ` [Qemu-devel] [PULL 0/5] gtk patch queue Peter Maydell
5 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2015-05-08 11:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Move various gtk bits (includes, data structures) to a header file.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
include/ui/gtk.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ui/gtk.c | 73 ++---------------------------------------------------
2 files changed, 78 insertions(+), 71 deletions(-)
create mode 100644 include/ui/gtk.h
diff --git a/include/ui/gtk.h b/include/ui/gtk.h
new file mode 100644
index 0000000..b750845
--- /dev/null
+++ b/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 */
diff --git a/ui/gtk.c b/ui/gtk.c
index 9163b43..8b1458f 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -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)
@@ -60,7 +47,6 @@
#include <math.h>
#include "trace.h"
-#include "ui/console.h"
#include "ui/input.h"
#include "sysemu/sysemu.h"
#include "qmp-commands.h"
@@ -68,10 +54,6 @@
#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
@@ -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
@@ -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;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 5/5] gtk: update mouse position in mouse_set()
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
` (3 preceding siblings ...)
2015-05-08 11:48 ` [Qemu-devel] [PULL 4/5] gtk: create gtk.h Gerd Hoffmann
@ 2015-05-08 11:48 ` Gerd Hoffmann
2015-05-11 11:00 ` [Qemu-devel] [PULL 0/5] gtk patch queue Peter Maydell
5 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2015-05-08 11:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Without that the next mouse motion event uses the old position
as base for relative move calculation, giving wrong results and
making your mouse pointer jump around.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/gtk.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/ui/gtk.c b/ui/gtk.c
index 8b1458f..c58028f 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -463,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,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PULL 0/5] gtk patch queue.
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
` (4 preceding siblings ...)
2015-05-08 11:48 ` [Qemu-devel] [PULL 5/5] gtk: update mouse position in mouse_set() Gerd Hoffmann
@ 2015-05-11 11:00 ` Peter Maydell
5 siblings, 0 replies; 7+ messages in thread
From: Peter Maydell @ 2015-05-11 11:00 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: QEMU Developers
On 8 May 2015 at 12:48, Gerd Hoffmann <kraxel@redhat.com> wrote:
> Hi,
>
> This brings ui_info support for gtk and some small cleanups+fixes.
>
> please pull,
> Gerd
>
> The following changes since commit 874e9aeeeb74c5459639a93439a502d262847e68:
>
> Merge remote-tracking branch 'remotes/kraxel/tags/pull-sdl-20150505-1' into staging (2015-05-05 14:06:12 +0100)
>
> are available in the git repository at:
>
>
> git://git.kraxel.org/qemu tags/pull-gtk-20150508-1
>
> for you to fetch changes up to 1271f7f7c60e0b0a3cc031921008a69dfd53bd34:
>
> gtk: update mouse position in mouse_set() (2015-05-06 08:38:05 +0200)
>
> ----------------------------------------------------------------
> gtk: add ui_info support, cleanups + fixes.
Applied, thanks.
-- PMM
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-05-11 11:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-08 11:48 [Qemu-devel] [PULL 0/5] gtk patch queue Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 1/5] console: delayed ui_info guest notification Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 2/5] console: add dpy_ui_info_supported Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 3/5] gtk: add ui_info support Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 4/5] gtk: create gtk.h Gerd Hoffmann
2015-05-08 11:48 ` [Qemu-devel] [PULL 5/5] gtk: update mouse position in mouse_set() Gerd Hoffmann
2015-05-11 11:00 ` [Qemu-devel] [PULL 0/5] gtk patch queue Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).