[gtk+/wip/ebassi/gsk: 8/11] gsk: Add GskLayoutManager
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/ebassi/gsk: 8/11] gsk: Add GskLayoutManager
- Date: Sun, 9 Aug 2015 15:51:15 +0000 (UTC)
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]