[gtk+/wip/ebassi/gsk: 8/11] gsk: Add GskLayoutManager



commit ea47ac810e9fa59aaa1dd911ac5c8ac1d669d6fe
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Mar 18 10:46:35 2015 +0000

    gsk: Add GskLayoutManager
    
    The GskLayoutManager type is an interface to be implemented by delegate
    objects that want to be responsible for the layout of children of a
    specific layer.
    
    GskLayoutManager implementations can provide overrides for the layout
    management related virtual functions inside GskLayer; GskLayer itself
    will query the layout manager instance, if one is set up.

 gsk/Makefile.am        |    2 +
 gsk/gsk.h              |    1 +
 gsk/gsklayoutmanager.c |   99 ++++++++++++++++++++++++++++++++++++++++++++++++
 gsk/gsklayoutmanager.h |   64 +++++++++++++++++++++++++++++++
 gsk/gsktypes.h         |    7 ++-
 5 files changed, 170 insertions(+), 3 deletions(-)
---
diff --git a/gsk/Makefile.am b/gsk/Makefile.am
index 70d4489..7494d8e 100644
--- a/gsk/Makefile.am
+++ b/gsk/Makefile.am
@@ -41,6 +41,7 @@ gsk_public_source_h = \
        gskdebug.h \
        gsklayer.h \
        gsklayeriter.h \
+       gsklayoutmanager.h \
        gskmacros.h \
        gskrenderer.h \
        gsktypes.h
@@ -55,6 +56,7 @@ gsk_source_c = \
        gsklayer.c \
        gsklayeriter.c \
        gsklayerstate.c \
+       gsklayoutmanager.c \
        gskrenderer.c
 
 all_sources = $(gsk_private_source_c) $(gsk_source_c) $(gsk_public_source_h) $(gsk_private_source_h) 
$(BUILT_SOURCES)
diff --git a/gsk/gsk.h b/gsk/gsk.h
index f43461a..04078e9 100644
--- a/gsk/gsk.h
+++ b/gsk/gsk.h
@@ -26,6 +26,7 @@
 #include <gsk/gskdebug.h>
 #include <gsk/gsklayer.h>
 #include <gsk/gsklayeriter.h>
+#include <gsk/gsklayoutmanager.h>
 #include <gsk/gskrenderer.h>
 
 #undef __GSK_H_INSIDE__
diff --git a/gsk/gsklayoutmanager.c b/gsk/gsklayoutmanager.c
new file mode 100644
index 0000000..f5f2458
--- /dev/null
+++ b/gsk/gsklayoutmanager.c
@@ -0,0 +1,99 @@
+/* GSK - The GTK scene graph toolkit
+ * Copyright 2015  Emmanuele Bassi 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gsklayoutmanager.h"
+#include "gsklayerprivate.h"
+
+G_DEFINE_INTERFACE (GskLayoutManager, gsk_layout_manager, G_TYPE_OBJECT)
+
+static void
+layout_manager_get_preferred_size (GskLayoutManager *self,
+                                   GskLayer         *layer,
+                                   graphene_size_t  *size)
+{
+  const GeometryInfo *info;
+
+  info = gsk_layer_state_get_geometry_info (gsk_layer_get_state (layer));
+  graphene_size_init_from_size (size, &info->bounds.size);
+}
+
+static void
+layout_manager_layout_children (GskLayoutManager *self,
+                                GskLayer         *layer)
+{
+}
+
+static gboolean
+layout_manager_queue_relayout (GskLayoutManager *self,
+                               GskLayer         *layer,
+                               GskLayer         *origin)
+{
+  return TRUE;
+}
+
+static void
+gsk_layout_manager_default_init (GskLayoutManagerInterface *iface)
+{
+  iface->get_preferred_size = layout_manager_get_preferred_size;
+  iface->layout_children = layout_manager_layout_children;
+  iface->queue_relayout = layout_manager_queue_relayout;
+}
+
+void
+gsk_layout_manager_get_preferred_size (GskLayoutManager *manager,
+                                       GskLayer         *layer,
+                                       graphene_size_t  *size)
+{
+  GskLayoutManagerInterface *iface;
+
+  g_return_if_fail (GSK_IS_LAYOUT_MANAGER (manager));
+  g_return_if_fail (GSK_IS_LAYER (layer));
+  g_return_if_fail (size != NULL);
+
+  iface = GSK_LAYOUT_MANAGER_GET_IFACE (manager);
+  iface->get_preferred_size (manager, layer, size);
+}
+
+void
+gsk_layout_manager_layout_children (GskLayoutManager *manager,
+                                    GskLayer         *layer)
+{
+  GskLayoutManagerInterface *iface;
+
+  g_return_if_fail (GSK_IS_LAYOUT_MANAGER (manager));
+  g_return_if_fail (GSK_IS_LAYER (layer));
+
+  iface = GSK_LAYOUT_MANAGER_GET_IFACE (manager);
+  iface->layout_children (manager, layer);
+}
+
+gboolean
+gsk_layout_manager_queue_relayout (GskLayoutManager *manager,
+                                   GskLayer         *layer,
+                                   GskLayer         *origin)
+{
+  GskLayoutManagerInterface *iface;
+
+  g_return_val_if_fail (GSK_IS_LAYOUT_MANAGER (manager), FALSE);
+  g_return_val_if_fail (GSK_IS_LAYER (layer), FALSE);
+  g_return_val_if_fail (GSK_IS_LAYER (origin), FALSE);
+
+  iface = GSK_LAYOUT_MANAGER_GET_IFACE (manager);
+  return iface->queue_relayout (manager, layer, origin);
+}
diff --git a/gsk/gsklayoutmanager.h b/gsk/gsklayoutmanager.h
new file mode 100644
index 0000000..660a1d9
--- /dev/null
+++ b/gsk/gsklayoutmanager.h
@@ -0,0 +1,64 @@
+/* GSK - The GTK scene graph toolkit
+ * Copyright 2015  Emmanuele Bassi 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GSK_LAYOUT_MANAGER_H__
+#define __GSK_LAYOUT_MANAGER_H__
+
+#if !defined (__GSK_H_INSIDE__) && !defined (GSK_COMPILATION)
+#error "Only <gsk/gsk.h> can be included directly."
+#endif
+
+#include <gsk/gsktypes.h>
+
+G_BEGIN_DECLS
+
+#define GSK_TYPE_LAYOUT_MANAGER (gsk_layout_manager_get_type ())
+
+GDK_AVAILABLE_IN_3_18
+G_DECLARE_INTERFACE (GskLayoutManager, gsk_layout_manager, GSK, LAYOUT_MANAGER, GObject)
+
+struct _GskLayoutManagerInterface
+{
+  GTypeInterface g_iface;
+
+  void (* get_preferred_size) (GskLayoutManager *manager,
+                               GskLayer         *layer,
+                               graphene_size_t  *size);
+
+  void (* layout_children) (GskLayoutManager *manager,
+                            GskLayer         *layer);
+
+  gboolean (* queue_relayout) (GskLayoutManager *manager,
+                               GskLayer         *layer,
+                               GskLayer         *origin);
+};
+
+GDK_AVAILABLE_IN_3_18
+void            gsk_layout_manager_get_preferred_size   (GskLayoutManager *manager,
+                                                         GskLayer         *layer,
+                                                         graphene_size_t  *size);
+GDK_AVAILABLE_IN_3_18
+void            gsk_layout_manager_layout_children      (GskLayoutManager *manager,
+                                                         GskLayer         *layer);
+GDK_AVAILABLE_IN_3_18
+gboolean        gsk_layout_manager_queue_relayout       (GskLayoutManager *manager,
+                                                         GskLayer         *layer,
+                                                         GskLayer         *origin);
+
+G_END_DECLS
+
+#endif /* __GSK_LAYOUT_MANAGER_H__ */
diff --git a/gsk/gsktypes.h b/gsk/gsktypes.h
index d6143ad..0593a2d 100644
--- a/gsk/gsktypes.h
+++ b/gsk/gsktypes.h
@@ -29,9 +29,10 @@
 
 G_BEGIN_DECLS
 
-typedef struct _GskLayer        GskLayer;
-typedef struct _GskLayerIter    GskLayerIter;
-typedef struct _GskRenderer     GskRenderer;
+typedef struct _GskLayer                GskLayer;
+typedef struct _GskLayerIter            GskLayerIter;
+typedef struct _GskRenderer             GskRenderer;
+typedef struct _GskLayoutManager        GskLayoutManager;
 
 G_END_DECLS
 


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