diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2009-09-14 18:54:37 +1000 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2009-11-18 12:18:31 +1100 |
commit | 4a7e3dc46c27ae7043e3f72c00cd5db33ab059ff (patch) | |
tree | a51e816a68a7dd38ddae224ed72c585f4fdb9336 | |
parent | 3470a14fa8cf99f5636189c24eaedd798cd91448 (diff) | |
download | clutter-gtk-4a7e3dc46c27ae7043e3f72c00cd5db33ab059ff.tar.gz |
Make the code for binding width/height between actors a util function
-rw-r--r-- | clutter-gtk/gtk-clutter-util.c | 53 | ||||
-rw-r--r-- | clutter-gtk/gtk-clutter-util.h | 20 | ||||
-rw-r--r-- | clutter-gtk/gtk-clutter-window.c | 20 | ||||
-rw-r--r-- | examples/gtk-clutter-window-test.c | 4 |
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); |