+2008-04-21 Emmanuele Bassi <ebassi@openedhand.com>
+
+ * clutter-gtk/gtk-clutter-util.h:
+ * clutter-gtk/gtk-clutter-util.c:
+ (gtk_clutter_texture_new_from_pixbuf),
+ (gtk_clutter_texture_new_from_stock),
+ (gtk_clutter_texture_new_from_icon_name): Add utility functions
+ to create a ClutterTexture from a Pixbuf (to replace the
+ clutter_texture_from_pixbuf() call when it will be removed
+ from Clutter core); from a stock id; and from an icon name.
+
+ * examples/Makefile.am: Clean up.
+
+ * examples/gtk-clutter-events.c:
+ * examples/gtk-clutter-multistage.c: Use the new utility API.
+
2008-04-17 Emmanuele Bassi <ebassi@openedhand.com>
* README: Update requirements
#include "config.h"
#endif
+#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
#include <clutter/clutter.h>
gtk_clutter_get_component (widget, GTK_RC_BASE, state, color);
}
+/**
+ * gtk_clutter_texture_new_from_pixbuf:
+ * @pixbuf: a #GdkPixbuf
+ *
+ * FIXME
+ *
+ * Return value: the newly created #ClutterTexture
+ *
+ * Since: 0.8
+ */
+ClutterActor *
+gtk_clutter_texture_new_from_pixbuf (GdkPixbuf *pixbuf)
+{
+ ClutterActor *retval;
+ GError *error;
+
+ g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
+
+ retval = clutter_texture_new ();
+
+ error = NULL;
+ clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (retval),
+ gdk_pixbuf_get_pixels (pixbuf),
+ gdk_pixbuf_get_has_alpha (pixbuf),
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf),
+ gdk_pixbuf_get_rowstride (pixbuf),
+ 4, 0,
+ &error);
+ if (error)
+ {
+ g_warning ("Unable to set the pixbuf: %s", error->message);
+ g_error_free (error);
+ }
+
+ return retval;
+}
+
+/**
+ * gtk_clutter_texture_new_from_stock:
+ * @widget: a #GtkWidget
+ * @stock_id: FIXME
+ * @size: FIXME
+ *
+ * FIXME
+ *
+ * Return value: the newly created #ClutterTexture
+ *
+ * Since: 0.8
+ */
+ClutterActor *
+gtk_clutter_texture_new_from_stock (GtkWidget *widget,
+ const gchar *stock_id,
+ GtkIconSize size)
+{
+ GdkPixbuf *pixbuf;
+ ClutterActor *retval;
+
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+ g_return_val_if_fail (stock_id != NULL, NULL);
+ g_return_val_if_fail (size > GTK_ICON_SIZE_INVALID || size == -1, NULL);
+
+ pixbuf = gtk_widget_render_icon (widget, stock_id, size, NULL);
+ if (!pixbuf)
+ pixbuf = gtk_widget_render_icon (widget,
+ GTK_STOCK_MISSING_IMAGE, size,
+ NULL);
+
+ retval = gtk_clutter_texture_new_from_pixbuf (pixbuf);
+ g_object_unref (pixbuf);
+
+ return retval;
+}
+
+/**
+ * gtk_clutter_texture_new_from_icon_name:
+ * @widget: a #GtkWidget
+ * @icon_name: FIXME
+ * @size: FIXME
+ *
+ * FIXME
+ *
+ * Return value: the newly created #ClutterTexture
+ *
+ * Since: 0.8
+ */
+ClutterActor *
+gtk_clutter_texture_new_from_icon_name (GtkWidget *widget,
+ const gchar *icon_name,
+ GtkIconSize size)
+{
+ GtkSettings *settings;
+ GtkIconTheme *icon_theme;
+ gint width, height;
+ GdkPixbuf *pixbuf;
+ GError *error;
+ ClutterActor *retval;
+
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+ g_return_val_if_fail (icon_name != NULL, NULL);
+ g_return_val_if_fail (size > GTK_ICON_SIZE_INVALID || size == -1, NULL);
+
+ if (gtk_widget_has_screen (widget))
+ {
+ GdkScreen *screen;
+
+ screen = gtk_widget_get_screen (widget);
+ settings = gtk_settings_get_for_screen (screen);
+ icon_theme = gtk_icon_theme_get_for_screen (screen);
+ }
+ else
+ {
+ settings = gtk_settings_get_default ();
+ icon_theme = gtk_icon_theme_get_default ();
+ }
+
+ if (!gtk_icon_size_lookup_for_settings (settings, size, &width, &height))
+ {
+ g_warning ("Invalid icon size");
+ width = height = 48;
+ }
+
+ error = NULL;
+ pixbuf = gtk_icon_theme_load_icon (icon_theme,
+ icon_name,
+ MIN (width, height), 0,
+ &error);
+ if (error)
+ {
+ g_error_free (error);
+ return gtk_clutter_texture_new_from_stock (widget,
+ GTK_STOCK_MISSING_IMAGE,
+ size);
+ }
+
+ retval = gtk_clutter_texture_new_from_pixbuf (pixbuf);
+ g_object_unref (pixbuf);
+
+ return retval;
+}
GtkStateType state,
ClutterColor *color);
+ClutterActor *gtk_clutter_texture_new_from_pixbuf (GdkPixbuf *pixbuf);
+ClutterActor *gtk_clutter_texture_new_from_stock (GtkWidget *widget,
+ const gchar *stock_id,
+ GtkIconSize size);
+ClutterActor *gtk_clutter_texture_new_from_icon_name (GtkWidget *widget,
+ const gchar *icon_name,
+ GtkIconSize size);
+
G_END_DECLS
#endif /* __GTK_CLUTTER_UTIL_H__ */
-noinst_PROGRAMS = gtk-clutter-test gtk-clutter-events gtk-clutter-multistage
+NULL =
+
+noinst_PROGRAMS = \
+ gtk-clutter-test \
+ gtk-clutter-events \
+ gtk-clutter-multistage
INCLUDES = \
-I$(srcdir) \
- -I$(top_srcdir) \
- $(CLUTTER_CFLAGS) \
- $(GTK_CFLAGS)
+ -I$(top_srcdir)
+
+AM_CPPFLAGS = $(CLUTTER_CFLAGS) $(GTK_CFLAGS)
-gtk_clutter_test_DEPENDENCIES = \
+common_deps = \
$(top_builddir)/clutter-gtk/libclutter-gtk-0.7.la
-gtk_clutter_test_SOURCES = gtk-clutter-test.c
-gtk_clutter_test_LDADD = \
+
+common_ldadd = \
$(top_builddir)/clutter-gtk/libclutter-gtk-0.7.la \
$(CLUTTER_LIBS) \
$(GTK_LIBS)
-gtk_clutter_events_DEPENDENCIES = \
- $(top_builddir)/clutter-gtk/libclutter-gtk-0.7.la
+gtk_clutter_test_SOURCES = gtk-clutter-test.c
+gtk_clutter_test_DEPENDENCIES = $(common_deps)
+gtk_clutter_test_LDADD = $(common_ldadd)
+
gtk_clutter_events_SOURCES = gtk-clutter-events.c
-gtk_clutter_events_LDADD = \
- $(top_builddir)/clutter-gtk/libclutter-gtk-0.7.la \
- $(CLUTTER_LIBS) \
- $(GTK_LIBS)
+gtk_clutter_events_DEPENDENCIES = $(common_deps)
+gtk_clutter_events_LDADD = $(common_ldadd)
-gtk_clutter_multistage_DEPENDENCIES = \
- $(top_builddir)/clutter-gtk/libclutter-gtk-0.7.la
gtk_clutter_multistage_SOURCES = gtk-clutter-multistage.c
-gtk_clutter_multistage_LDADD = \
- $(top_builddir)/clutter-gtk/libclutter-gtk-0.7.la \
- $(CLUTTER_LIBS) \
- $(GTK_LIBS)
+gtk_clutter_multistage_DEPENDENCIES = $(common_deps)
+gtk_clutter_multistage_LDADD = $(common_ldadd)
EXTRA_DIST = redhand.png
if (pixbuf == NULL)
g_error ("Unable to load pixbuf\n");
- actor = clutter_texture_new_from_pixbuf (pixbuf);
+ actor = gtk_clutter_texture_new_from_pixbuf (pixbuf);
app->hand = actor;
clutter_group_add (CLUTTER_GROUP (app->stage), actor);
clutter_actor_get_size (actor, &width, &height);
#include <gtk/gtk.h>
#include <clutter/clutter.h>
+
#include <clutter-gtk/gtk-clutter-embed.h>
+#include <clutter-gtk/gtk-clutter-util.h>
int
main (int argc, char *argv[])
if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
g_error ("Unable to initialize GtkClutter");
- pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL);
-
- if (!pixbuf)
- g_error("pixbuf load failed");
-
- tex1 = clutter_texture_new_from_pixbuf (pixbuf);
- tex2 = clutter_clone_texture_new (tex1);
-
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_set_size_request (clutter1, 320, 240);
stage1 = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter1));
clutter_stage_set_color (CLUTTER_STAGE(stage1), &col1);
+ tex1 = gtk_clutter_texture_new_from_stock (clutter1,
+ GTK_STOCK_DIALOG_INFO,
+ GTK_ICON_SIZE_DIALOG);
+ clutter_actor_set_anchor_point (tex1,
+ clutter_actor_get_width (tex1) / 2,
+ clutter_actor_get_height (tex1) / 2);
+ clutter_actor_set_position (tex1, 160, 120);
clutter_stage_add (stage1, tex1);
+ clutter_actor_show (tex1);
gtk_container_add (GTK_CONTAINER (vbox), clutter1);
clutter2 = gtk_clutter_embed_new ();
gtk_widget_set_size_request (clutter2, 320, 240);
stage2 = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter2));
-
clutter_stage_set_color (CLUTTER_STAGE(stage2), &col2);
+ tex2 = gtk_clutter_texture_new_from_icon_name (clutter1,
+ "user-info",
+ GTK_ICON_SIZE_BUTTON);
+ clutter_actor_set_anchor_point (tex2,
+ clutter_actor_get_width (tex2) / 2,
+ clutter_actor_get_height (tex2) / 2);
+ clutter_actor_set_position (tex2, 160, 120);
clutter_stage_add (stage2, tex2);
gtk_container_add (GTK_CONTAINER (vbox), clutter2);