[gtk+/wip/ebassi/gsk: 9/11] gsk: Integrate GskLayoutManager with GskLayer



commit 4385cbe6cb3890d03e1c9b806138a54605623ef0
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Mar 18 11:08:01 2015 +0000

    gsk: Integrate GskLayoutManager with GskLayer
    
    Since GskLayoutManager is the interface for delegate objects responsible
    for the layout management of layers, GskLayer should use it to delegate
    the implementation of various virtual functions.

 gsk/gsklayer.c |   47 ++++++++++++++++++++++++++++++++++++++++++++---
 gsk/gsklayer.h |   16 ++++++++++++----
 2 files changed, 56 insertions(+), 7 deletions(-)
---
diff --git a/gsk/gsklayer.c b/gsk/gsklayer.c
index 570bba1..6f4d81a 100644
--- a/gsk/gsklayer.c
+++ b/gsk/gsklayer.c
@@ -26,6 +26,7 @@
 #include "config.h"
 
 #include "gsklayerprivate.h"
+#include "gsklayoutmanager.h"
 #include "gskdebug.h"
 
 /**
@@ -58,6 +59,8 @@ typedef struct {
 
   GdkFrameClock *frame_clock;
 
+  GskLayoutManager *layout_manager;
+
   /* Bitfields: keep at the end */
   guint hidden : 1;
   guint needs_redraw : 1;
@@ -179,6 +182,11 @@ static gboolean
 gsk_layer_real_queue_relayout (GskLayer *self,
                                GskLayer *origin)
 {
+  GskLayerPrivate *priv = gsk_layer_get_instance_private (self);
+
+  if (priv->layout_manager != NULL)
+    return gsk_layout_manager_queue_relayout (priv->layout_manager, self, origin);
+
   return TRUE;
 }
 
@@ -186,11 +194,17 @@ static void
 gsk_layer_real_get_preferred_size (GskLayer        *self,
                                    graphene_size_t *size)
 {
-  const GeometryInfo *info;
+  GskLayerPrivate *priv = gsk_layer_get_instance_private (self);
 
-  info = gsk_layer_state_peek_geometry_info (gsk_layer_get_state (self));
+  if (priv->layout_manager == NULL)
+    {
+      const GeometryInfo *info;
 
-  graphene_size_init_from_size (size, &info->bounds.size);
+      info = gsk_layer_state_peek_geometry_info (gsk_layer_get_state (self));
+      graphene_size_init_from_size (size, &info->bounds.size);
+    }
+  else
+    gsk_layout_manager_get_preferred_size (priv->layout_manager, self, size);
 }
 
 static gboolean
@@ -222,6 +236,10 @@ gsk_layer_real_draw (GskLayer *self,
 static void
 gsk_layer_real_layout_children (GskLayer *layer)
 {
+  GskLayerPrivate *priv = gsk_layer_get_instance_private (layer);
+
+  if (priv->layout_manager != NULL)
+    gsk_layout_manager_layout_children (priv->layout_manager, layer);
 }
 
 static void
@@ -1800,3 +1818,26 @@ gsk_layer_set_frame_clock (GskLayer *self,
         }
     }
 }
+
+void
+gsk_layer_set_layout_manager (GskLayer         *self,
+                              GskLayoutManager *manager)
+{
+  GskLayerPrivate *priv = gsk_layer_get_instance_private (self);
+
+  g_return_if_fail (GSK_IS_LAYER (self));
+  g_return_if_fail (manager == NULL || GSK_IS_LAYOUT_MANAGER (manager));
+
+  if (g_set_object (&priv->layout_manager, manager))
+    {
+      gsk_layer_queue_relayout (self);
+    }
+}
+
+GskLayoutManager *
+gsk_layer_get_layout_manager (GskLayer *self)
+{
+  g_return_val_if_fail (GSK_IS_LAYER (self), NULL);
+
+  return GSK_LAYER_PRIV (self)->layout_manager;
+}
diff --git a/gsk/gsklayer.h b/gsk/gsklayer.h
index ff582fb..288780d 100644
--- a/gsk/gsklayer.h
+++ b/gsk/gsklayer.h
@@ -175,10 +175,6 @@ GDK_AVAILABLE_IN_3_18
 void                    gsk_layer_get_position                  (GskLayer               *self,
                                                                  graphene_point_t       *position);
 
-GDK_AVAILABLE_IN_3_18
-void                    gsk_layer_get_preferred_size            (GskLayer               *self,
-                                                                 graphene_size_t        *size);
-
 /* Transformations */
 
 GDK_AVAILABLE_IN_3_18
@@ -218,6 +214,18 @@ GDK_AVAILABLE_IN_3_18
 void                    gsk_layer_set_frame_clock               (GskLayer                 *self,
                                                                  GdkFrameClock            *frame_clock);
 
+/* Layout */
+
+GDK_AVAILABLE_IN_3_18
+void                    gsk_layer_get_preferred_size            (GskLayer               *self,
+                                                                 graphene_size_t        *size);
+
+GDK_AVAILABLE_IN_3_18
+void                    gsk_layer_set_layout_manager            (GskLayer               *self,
+                                                                 GskLayoutManager       *manager);
+GDK_AVAILABLE_IN_3_18
+GskLayoutManager *      gsk_layer_get_layout_manager            (GskLayer               *self);
+
 G_END_DECLS
 
 #endif /* __GSK_LAYER_H__ */


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