summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2009-09-14 18:54:37 +1000
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2009-11-18 12:18:31 +1100
commit4a7e3dc46c27ae7043e3f72c00cd5db33ab059ff (patch)
treea51e816a68a7dd38ddae224ed72c585f4fdb9336
parent3470a14fa8cf99f5636189c24eaedd798cd91448 (diff)
downloadclutter-gtk-4a7e3dc46c27ae7043e3f72c00cd5db33ab059ff.tar.gz
Make the code for binding width/height between actors a util function
-rw-r--r--clutter-gtk/gtk-clutter-util.c53
-rw-r--r--clutter-gtk/gtk-clutter-util.h20
-rw-r--r--clutter-gtk/gtk-clutter-window.c20
-rw-r--r--examples/gtk-clutter-window-test.c4
4 files changed, 76 insertions, 21 deletions
diff --git a/clutter-gtk/gtk-clutter-util.c b/clutter-gtk/gtk-clutter-util.c
index c8a4f09..0465789 100644
--- a/clutter-gtk/gtk-clutter-util.c
+++ b/clutter-gtk/gtk-clutter-util.c
@@ -685,3 +685,56 @@ gtk_clutter_init_with_args (int *argc,
NULL,
error);
}
+
+static void
+gtk_clutter_bind_dimensions_width_changed (ClutterActor *src,
+ GParamSpec *pspec,
+ ClutterActor *dest)
+{
+ /* push these dimensions to the actor */
+ clutter_actor_set_width (dest, clutter_actor_get_width (src));
+}
+
+static void
+gtk_clutter_bind_dimensions_height_changed (ClutterActor *src,
+ GParamSpec *pspec,
+ ClutterActor *dest)
+{
+ /* push these dimensions to the actor */
+ clutter_actor_set_height (dest, clutter_actor_get_height (src));
+}
+
+/**
+ * gtk_clutter_bind_dimensions:
+ * @src: actor to copy the dimensions from
+ * @dest: actor to copy the dimensions to
+ * @dir: the direction to copy the dimensions in
+ *
+ * This utility function copies the width/height from the actor @src to the
+ * actor @dest.
+ *
+ * The primary use for this function is for packing actors in the
+ * top-level #GtkClutterWindow, and having them resize with the window.
+ */
+void
+gtk_clutter_bind_dimensions (ClutterActor *src,
+ ClutterActor *dest,
+ GtkClutterBindDirection dir)
+{
+ g_return_if_fail (CLUTTER_IS_ACTOR (src));
+ g_return_if_fail (CLUTTER_IS_ACTOR (dest));
+
+ if (dir & GTK_CLUTTER_BIND_HORIZONTAL)
+ {
+ gtk_clutter_bind_dimensions_width_changed (src, NULL, dest);
+ g_signal_connect_object (src, "notify::width",
+ G_CALLBACK (gtk_clutter_bind_dimensions_width_changed), dest, 0);
+ }
+
+ if (dir & GTK_CLUTTER_BIND_VERTICAL)
+ {
+ gtk_clutter_bind_dimensions_height_changed (src, NULL, dest);
+ g_signal_connect_object (src, "notify::height",
+ G_CALLBACK (gtk_clutter_bind_dimensions_height_changed), dest, 0);
+ }
+}
diff --git a/clutter-gtk/gtk-clutter-util.h b/clutter-gtk/gtk-clutter-util.h
index 9b42e9a..dd700d7 100644
--- a/clutter-gtk/gtk-clutter-util.h
+++ b/clutter-gtk/gtk-clutter-util.h
@@ -54,13 +54,28 @@ typedef enum {
* An enumeration of error types used in ClutterGtk texture functions
*
* Since: 0.10
- * */
+ */
typedef enum {
CLUTTER_GTK_TEXTURE_INVALID_STOCK_ID,
CLUTTER_GTK_TEXTURE_ERROR_LAST
} ClutterGtkTextureError;
+/**
+ * GtkClutterBindDirection
+ * @GTK_CLUTTER_BIND_HORIZONTAL: bind horizontal size
+ * @GTK_CLUTTER_BIND_VERTICAL: bind vertical size
+ * @GTK_CLUTTER_BIND_BOTH: bind both vertical and horizontal size
+ *
+ * Since: 1.0
+ */
+typedef enum {
+ GTK_CLUTTER_BIND_HORIZONTAL = 1 << 0,
+ GTK_CLUTTER_BIND_VERTICAL = 1 << 1,
+
+ GTK_CLUTTER_BIND_BOTH = 3
+} GtkClutterBindDirection;
+
#define CLUTTER_GTK_TEXTURE_ERROR gtk_clutter_texture_error_quark ()
ClutterInitError gtk_clutter_init (int *argc,
@@ -118,6 +133,9 @@ gboolean gtk_clutter_texture_set_from_icon_name (ClutterTexture *texture,
const gchar *icon_name,
GtkIconSize size,
GError **error);
+void gtk_clutter_bind_dimensions (ClutterActor *src,
+ ClutterActor *dest,
+ GtkClutterBindDirection dir);
G_END_DECLS
diff --git a/clutter-gtk/gtk-clutter-window.c b/clutter-gtk/gtk-clutter-window.c
index f193fd1..0cced73 100644
--- a/clutter-gtk/gtk-clutter-window.c
+++ b/clutter-gtk/gtk-clutter-window.c
@@ -34,6 +34,7 @@
#include "gtk-clutter-window.h"
#include "gtk-clutter-actor.h"
#include "gtk-clutter-embed.h"
+#include "gtk-clutter-util.h"
#include <glib-object.h>
@@ -236,19 +237,6 @@ gtk_clutter_window_class_init (GtkClutterWindowClass *klass)
}
static void
-gtk_clutter_window_stage_dimensions_changed (GtkClutterWindow *self,
- GParamSpec *pspec,
- ClutterActor *stage)
-{
- GtkClutterWindowPrivate *priv = self->priv;
- float w, h;
-
- /* push these dimensions to the actor */
- clutter_actor_get_size (stage, &w, &h);
- clutter_actor_set_size (priv->actor, w, h);
-}
-
-static void
gtk_clutter_window_init (GtkClutterWindow *self)
{
GtkClutterWindowPrivate *priv;
@@ -266,10 +254,8 @@ gtk_clutter_window_init (GtkClutterWindow *self)
priv->actor = gtk_clutter_actor_new ();
clutter_container_add_actor (CLUTTER_CONTAINER (stage), priv->actor);
- g_signal_connect_swapped (stage, "notify::width",
- G_CALLBACK (gtk_clutter_window_stage_dimensions_changed), self);
- g_signal_connect_swapped (stage, "notify::height",
- G_CALLBACK (gtk_clutter_window_stage_dimensions_changed), self);
+ gtk_clutter_bind_dimensions (stage, priv->actor,
+ GTK_CLUTTER_BIND_BOTH);
}
/**
diff --git a/examples/gtk-clutter-window-test.c b/examples/gtk-clutter-window-test.c
index fbfdaa4..daeec31 100644
--- a/examples/gtk-clutter-window-test.c
+++ b/examples/gtk-clutter-window-test.c
@@ -108,9 +108,7 @@ main (int argc, char **argv)
gtk_widget_show_all (toolbar);
ClutterActor *actor = gtk_clutter_actor_new_with_contents (toolbar);
-
- // FIXME: resize to window width
- clutter_actor_set_width (actor, 200.);
+ gtk_clutter_bind_dimensions (stage, actor, GTK_CLUTTER_BIND_HORIZONTAL);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
clutter_actor_set_opacity (actor, 0xa0);