[clutter-gtk] actor: fix incorrect allocation logic



commit e63dbfc883ea8762013e3af79bf1a27219431b29
Author: Lionel Landwerlin <llandwerlin gmail com>
Date:   Tue Dec 1 22:31:32 2015 +0000

    actor: fix incorrect allocation logic
    
    Using a pointer comparison to prevent resetting the size of the canvas/actor
    is incorrect on Wayland. Let's make that logic X11 only.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=758937

 clutter-gtk/gtk-clutter-actor.c |   58 +++++++++++++++++++++------------------
 1 files changed, 31 insertions(+), 27 deletions(-)
---
diff --git a/clutter-gtk/gtk-clutter-actor.c b/clutter-gtk/gtk-clutter-actor.c
index 566d571..9582154 100644
--- a/clutter-gtk/gtk-clutter-actor.c
+++ b/clutter-gtk/gtk-clutter-actor.c
@@ -82,7 +82,9 @@ struct _GtkClutterActorPrivate
   GtkWidget *widget;
   GtkWidget *embed;
 
-  cairo_surface_t *surface;
+#ifdef CLUTTER_WINDOWING_X11
+  Drawable pixmap;
+#endif
 
   /* canvas instance used as a fallback; owned
    * by the texture actor below
@@ -126,6 +128,10 @@ gtk_clutter_actor_draw_canvas (ClutterCanvas   *canvas,
                                int              height,
                                GtkClutterActor *actor)
 {
+  GtkClutterActorPrivate *priv = actor->priv;
+  cairo_surface_t *surface =
+    _gtk_clutter_offscreen_get_surface (GTK_CLUTTER_OFFSCREEN (priv->widget));
+
   /* clear the surface */
   cairo_save (cr);
   cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
@@ -134,7 +140,7 @@ gtk_clutter_actor_draw_canvas (ClutterCanvas   *canvas,
   cairo_restore (cr);
 
   cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-  cairo_set_source_surface (cr, actor->priv->surface, 0.0, 0.0);
+  cairo_set_source_surface (cr, surface, 0.0, 0.0);
   cairo_paint (cr);
 
   return TRUE;
@@ -166,6 +172,7 @@ gtk_clutter_actor_realize (ClutterActor *actor)
   GtkClutterActor *clutter = GTK_CLUTTER_ACTOR (actor);
   GtkClutterActorPrivate *priv = clutter->priv;
   ClutterActor *stage;
+  cairo_surface_t *surface;
 
   stage = clutter_actor_get_stage (actor);
   priv->embed = g_object_get_data (G_OBJECT (stage), "gtk-clutter-embed");
@@ -173,21 +180,20 @@ gtk_clutter_actor_realize (ClutterActor *actor)
 
   gtk_widget_realize (priv->widget);
 
-  priv->surface = _gtk_clutter_offscreen_get_surface (GTK_CLUTTER_OFFSCREEN (priv->widget));
+  surface = _gtk_clutter_offscreen_get_surface (GTK_CLUTTER_OFFSCREEN (priv->widget));
 
 #if defined(CLUTTER_WINDOWING_X11) && defined(CAIRO_HAS_XLIB_SURFACE)
   if (!gtk_clutter_actor_use_image_surface () &&
       clutter_check_windowing_backend (CLUTTER_WINDOWING_X11) &&
-      cairo_surface_get_type (priv->surface) == CAIRO_SURFACE_TYPE_XLIB)
+      cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB)
     {
-      Drawable pixmap;
       gint pixmap_width, pixmap_height;
 
-      pixmap_width = cairo_xlib_surface_get_width (priv->surface);
-      pixmap_height = cairo_xlib_surface_get_height (priv->surface);
-      pixmap = cairo_xlib_surface_get_drawable (priv->surface);
+      pixmap_width = cairo_xlib_surface_get_width (surface);
+      pixmap_height = cairo_xlib_surface_get_height (surface);
+      priv->pixmap = cairo_xlib_surface_get_drawable (surface);
 
-      clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->texture), pixmap);
+      clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->texture), priv->pixmap);
       clutter_actor_set_size (priv->texture, pixmap_width, pixmap_height);
     }
   else
@@ -221,8 +227,6 @@ gtk_clutter_actor_unrealize (ClutterActor *actor)
   if (priv->widget == NULL)
     return;
 
-  priv->surface = NULL;
-
   g_object_ref (priv->widget);
   gtk_container_remove (GTK_CONTAINER (priv->embed), priv->widget);
   priv->embed = NULL;
@@ -329,28 +333,28 @@ gtk_clutter_actor_allocate (ClutterActor           *actor,
       gdk_window_process_updates (window, TRUE);
 
       surface = gdk_offscreen_window_get_surface (window);
-      if (surface != priv->surface)
+#if defined(CLUTTER_WINDOWING_X11) && defined(CAIRO_HAS_XLIB_SURFACE)
+      if (!gtk_clutter_actor_use_image_surface () &&
+          clutter_check_windowing_backend (CLUTTER_WINDOWING_X11) &&
+          cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB)
         {
-          priv->surface = surface;
+          Drawable pixmap = cairo_xlib_surface_get_drawable (surface);
 
-#if defined(CLUTTER_WINDOWING_X11) && defined(CAIRO_HAS_XLIB_SURFACE)
-          if (!gtk_clutter_actor_use_image_surface () &&
-              clutter_check_windowing_backend (CLUTTER_WINDOWING_X11) &&
-              cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB)
+          if (pixmap != priv->pixmap)
             {
-              Drawable pixmap = cairo_xlib_surface_get_drawable (surface);
-
-              clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->texture), pixmap);
+              priv->pixmap = pixmap;
+              clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->texture),
+                                                     priv->pixmap);
             }
-          else
+        }
+      else
 #endif
-            {
-              DEBUG (G_STRLOC ": Using image surface.\n");
+        {
+          DEBUG (G_STRLOC ": Using image surface.\n");
 
-              clutter_canvas_set_size (CLUTTER_CANVAS (priv->canvas),
-                                       gtk_widget_get_allocated_width (priv->widget),
-                                       gtk_widget_get_allocated_height (priv->widget));
-            }
+          clutter_canvas_set_size (CLUTTER_CANVAS (priv->canvas),
+                                   gtk_widget_get_allocated_width (priv->widget),
+                                   gtk_widget_get_allocated_height (priv->widget));
         }
     }
 


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