diff options
author | Lionel Landwerlin <llandwerlin@gmail.com> | 2015-09-14 01:00:12 +0200 |
---|---|---|
committer | Lionel Landwerlin <llandwerlin@gmail.com> | 2015-09-14 13:49:08 +0100 |
commit | ee98a5bbe8ad21519d5e368ca5b2336e5d1da880 (patch) | |
tree | bc9539e8833dcddd136f03de5b77b39924b19c6d | |
parent | aeb19f2f4dcb6d25093802aaac1878c755dc16be (diff) | |
download | clutter-ee98a5bbe8ad21519d5e368ca5b2336e5d1da880.tar.gz |
gdk: x11: notify Cogl immediately of a foreign window resize
We want to avoid waiting for the acknowledgement event from the X
server as we might redraw the stage before that happens.
This patch reimplements a bit of logic already in clutter-gtk [1].
[1] : https://git.gnome.org/browse/clutter-gtk/tree/clutter-gtk/gtk-clutter-embed.c#n723
https://bugzilla.gnome.org/show_bug.cgi?id=754993
-rw-r--r-- | clutter/gdk/clutter-stage-gdk.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/clutter/gdk/clutter-stage-gdk.c b/clutter/gdk/clutter-stage-gdk.c index 7152b11fb..2f2939b27 100644 --- a/clutter/gdk/clutter-stage-gdk.c +++ b/clutter/gdk/clutter-stage-gdk.c @@ -269,18 +269,44 @@ _clutter_stage_gdk_notify_configure (ClutterStageGdk *stage_gdk, gint width, gint height) { -#if defined(GDK_WINDOWING_WAYLAND) if (x < 0 || y < 0 || width < 1 || height < 1) return; - if (stage_gdk->foreign_window && - gdk_window_get_window_type (stage_gdk->window) == GDK_WINDOW_CHILD && - stage_gdk->subsurface) + if (stage_gdk->foreign_window) { - gint rx, ry; - gdk_window_get_origin (stage_gdk->window, &rx, &ry); - wl_subsurface_set_position (stage_gdk->subsurface, rx, ry); - } +#if defined(GDK_WINDOWING_WAYLAND) + if (GDK_IS_WAYLAND_WINDOW (stage_gdk->window) && + gdk_window_get_window_type (stage_gdk->window) == GDK_WINDOW_CHILD && + stage_gdk->subsurface) + { + gint rx, ry; + gdk_window_get_origin (stage_gdk->window, &rx, &ry); + /* TODO: we might need to apply the scale factor here. */ + wl_subsurface_set_position (stage_gdk->subsurface, rx, ry); + } + else #endif +#if defined(GDK_WINDOWING_X11) + if (GDK_IS_X11_WINDOW (stage_gdk->window)) + { + ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_gdk); + ClutterBackend *backend = CLUTTER_BACKEND (stage_cogl->backend); + int scale_factor = gdk_window_get_scale_factor (stage_gdk->window); + XConfigureEvent xevent = { ConfigureNotify }; + xevent.window = GDK_WINDOW_XID (stage_gdk->window); + xevent.width = width * scale_factor; + xevent.height = height * scale_factor; + + /* Ensure cogl knows about the new size immediately, as we will + * draw before we get the ConfigureNotify response. */ + cogl_xlib_renderer_handle_event (backend->cogl_renderer, (XEvent *)&xevent); + } + else +#endif + { + /* Currently we only support X11 and Wayland. */ + g_assert_not_reached(); + } + } } static gboolean |