[clutter] gdk: x11: notify Cogl immediately of a foreign window resize



commit ee98a5bbe8ad21519d5e368ca5b2336e5d1da880
Author: Lionel Landwerlin <llandwerlin gmail com>
Date:   Mon Sep 14 01:00:12 2015 +0200

    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

 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 7152b11..2f2939b 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]