+2008-02-29 Matthew Allum <mallum@openedhand.com>
+
+ * clutter-gtk.pc.in:
+ * configure.ac:
+ Bump up to unstable 0.7 version and clutter req.
+
+ * clutter-gtk/gtk-clutter-embed.c:
+ * clutter-gtk/gtk-clutter-embed.h:
+ Add clutter_gtk_init(), as to use new API to share DISPLAY and
+ turn off Clutter 'automatic' event collection.
+ Add methods for;
+ expose - Queue a Clutter redraw.
+ map - set Actor mapped flag.
+ show/hide - Forward to stage also.
+ Minor doc additions.
+
+ * examples/gtk-clutter-events.c:
+ Add some minor comments re when to call show_all().
+
+ * examples/gtk-clutter-test.c:
+ Fix event->actor mapping.
+
2008-02-21 Emmanuele Bassi <ebassi@openedhand.com>
* clutter-gtk/gtk-clutter-embed.c:
Name: clutter-gtk
Description: GTK+ widget for Clutter
Version: @VERSION@
-Libs: -L${libdir} -lclutter-gtk-0.6
+Libs: -L${libdir} -lclutter-gtk-0.7
Cflags: -I${includedir}/clutter-0.6/clutter-gtk
-Requires: clutter-x11-0.6 gtk+-2.0
+Requires: clutter-x11-0.7 gtk+-2.0
* #GtkClutterEmbed widget. Instead, resize the widget using
* gtk_widget_set_size_request().</note>
*
+ * <note>You should only call #clutter_actor_show_all() after the
+ * widget itself has been shown</note>
+ *
+ * <note>Only a single #GtkClutterEmbed instace per application is
+ * currently supported</note>
+ *
* Since: 0.6
*/
}
static void
+gtk_clutter_embed_show (GtkWidget *widget)
+{
+ GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
+
+ /* Make sure the widget is realised before we show */
+ gtk_widget_realize(widget);
+
+ GTK_WIDGET_CLASS (gtk_clutter_embed_parent_class)->show (widget);
+
+ clutter_actor_show (priv->stage);
+}
+
+static void
+gtk_clutter_embed_hide (GtkWidget *widget)
+{
+ GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
+
+ GTK_WIDGET_CLASS (gtk_clutter_embed_parent_class)->hide (widget);
+
+ clutter_actor_hide (priv->stage);
+}
+
+static void
gtk_clutter_embed_realize (GtkWidget *widget)
{
GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
clutter_x11_set_stage_foreign (CLUTTER_STAGE (priv->stage),
GDK_WINDOW_XID (widget->window));
-
- /* allow a redraw here */
- clutter_actor_queue_redraw (priv->stage);
+ clutter_redraw ();
gtk_clutter_embed_send_configure (GTK_CLUTTER_EMBED (widget));
}
return TRUE;
}
+static gboolean
+gtk_clutter_embed_expose_event (GtkWidget *widget, GdkEventExpose *event)
+{
+ GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
+
+ if (CLUTTER_ACTOR_IS_VISIBLE (priv->stage))
+ clutter_actor_queue_redraw (priv->stage);
+
+ return TRUE;
+}
+
+static gboolean
+gtk_clutter_embed_map_event (GtkWidget *widget,
+ GdkEventAny *event)
+{
+ GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
+
+ /* The backend wont get the XEvent as we go strait to do_event().
+ * So we have to make sure we set the event here.
+ */
+ CLUTTER_ACTOR_SET_FLAGS (priv->stage, CLUTTER_ACTOR_MAPPED);
+
+ return TRUE;
+}
+
static void
gtk_clutter_embed_class_init (GtkClutterEmbedClass *klass)
{
widget_class->size_allocate = gtk_clutter_embed_size_allocate;
widget_class->realize = gtk_clutter_embed_realize;
+ widget_class->show = gtk_clutter_embed_show;
+ widget_class->hide = gtk_clutter_embed_hide;
widget_class->button_press_event = gtk_clutter_embed_button_event;
widget_class->button_release_event = gtk_clutter_embed_button_event;
widget_class->key_press_event = gtk_clutter_embed_key_event;
widget_class->key_release_event = gtk_clutter_embed_key_event;
+ widget_class->expose_event = gtk_clutter_embed_expose_event;
+ widget_class->map_event = gtk_clutter_embed_map_event;
}
static void
}
/**
+ * gtk_clutter_init:
+ *
+ * This function should be called instead of #clutter_init() and after
+ * #gtk_init()
+ *
+ * Return value: 1 on success, < 0 on failure.
+ *
+ * Since: 0.8
+ */
+ClutterInitError
+gtk_clutter_init (int *argc, char ***argv)
+{
+ clutter_x11_set_display (GDK_DISPLAY());
+ clutter_x11_disable_event_retrieval ();
+
+ /* FIXME: call gtk_init() here? */
+
+ return clutter_init (argc, argv);
+}
+
+/**
* gtk_clutter_embed_new:
*
- * FIXME
+ * Creates a new embedded Clutter widget.
*
* Return value: the newly created #GtkClutterEmbed
*
GtkWidget * gtk_clutter_embed_new (void);
ClutterActor *gtk_clutter_embed_get_stage (GtkClutterEmbed *embed);
+ClutterInitError gtk_clutter_init (int *argc, char ***argv);
+
G_END_DECLS
#endif /* __GTK_CLUTTER_EMBED_H__ */
# An odd micro number indicates in-progress development, (eg. from CVS)
# An even micro number indicates a released version.
m4_define([clutter_major_version], [0])
-m4_define([clutter_minor_version], [6])
+m4_define([clutter_minor_version], [7])
m4_define([clutter_micro_version], [0])
m4_define([clutter_version],
AC_FUNC_MMAP
AC_CHECK_FUNCS([memset munmap strcasecmp strdup])
-CLUTTER_REQUIRED=0.6.0
+CLUTTER_REQUIRED=0.7.0
-PKG_CHECK_MODULES(CLUTTER, clutter-x11-0.6 >= $CLUTTER_REQUIRED)
+PKG_CHECK_MODULES(CLUTTER, clutter-x11-0.7 >= $CLUTTER_REQUIRED)
AC_SUBST(CLUTTER_CFLAGS)
AC_SUBST(CLUTTER_LIBS)
ClutterColor stage_color = {255, 255, 255, 255};
ClutterColor text_color = {0, 0, 0, 255};
- clutter_init (&argc, &argv);
-
gtk_init (&argc, &argv);
+ gtk_clutter_init (&argc, &argv);
/* Create the inital gtk window and widgets, just like normal */
widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
g_signal_connect (button, "value-changed", G_CALLBACK (on_opacity_changed), app);
- clutter_actor_show_all (app->stage);
gtk_widget_show_all (app->window);
+ /* Only show/show_all the stage after parent show. widget_show will call
+ * show on the stage.
+ */
+ clutter_actor_show_all (app->stage);
+
gtk_main ();
return 0;
{
if (event->type == CLUTTER_BUTTON_PRESS)
{
- ClutterActor *actor;
+ ClutterActor *a;
gint x, y;
clutter_event_get_coords (event, &x, &y);
- actor = clutter_stage_get_actor_at_pos (stage, x, y);
- if (actor)
- clutter_actor_hide (actor);
+ a = clutter_stage_get_actor_at_pos (stage, x, y);
+ if (a && (CLUTTER_IS_TEXTURE (a) || CLUTTER_IS_CLONE_TEXTURE (a)))
+ clutter_actor_hide (a);
}
else if (event->type == CLUTTER_KEY_PRESS)
{
SuperOH *oh;
gint i;
- clutter_init (&argc, &argv);
gtk_init (&argc, &argv);
+ gtk_clutter_init (&argc, &argv);
pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL);
/* Add the group to the stage */
clutter_group_add (CLUTTER_GROUP (stage), CLUTTER_ACTOR(oh->group));
- /* Show everying ( and map window ) */
+ /* Show our group, widget show will show the stage */
clutter_actor_show_all (CLUTTER_ACTOR (oh->group));
g_signal_connect (stage, "button-press-event",