Hi
I have been playing around with Clutter and I must admit that I am impressed
by the toolkit.
I was trying to embed the Clutter to a GTK window. But I ended up with
problems. I was
trying to handle all mouse motion, press and release events on the GTK
window level,
but Clutter doesn't propagate these events to upper levels. The key press
events are nicely
delivered to the GTK main window level.
And also a small annoyance when using Clutter embedded into GTK window is
that the I need to call
clutter_actor_show_all() for stage even I am calling later on the
gtk_widget_show_all()
Am I misinterpreting how the Clutter toolkit should be used?
Below is a sample code which illustrates the my problem. I used the version
0.6.0 of Clutter
and Clutter-GTK.
Oskar
-----------------------------------
main.c
-----------------------------------
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <clutter/clutter.h>
#include <clutter-gtk/gtk-clutter-embed.h>
gboolean key_press_cb(GtkWidget * widget, GdkEventKey * event)
{
switch (event->keyval) {
case GDK_Escape:
gtk_main_quit ();
return TRUE;
default:
g_print ("Key %d pressed\n", event->keyval);
}
return TRUE;
}
gboolean button_press_event_cb ( GtkWidget *window, GdkEventButton *event )
{
g_print ("Mouse press: (%dx%d)\n", (gint)event->x,
(gint)event->x);
return TRUE;
}
gboolean button_release_event_cb ( GtkWidget *window, GdkEventButton *event
)
{
g_print ("Mouse release: (%dx%d)\n", (gint)event->x,
(gint)event->x);
return TRUE;
}
gboolean motion_event_cb ( GtkWidget *window, GdkEventMotion *event)
{
g_print ("Mouse move: (%dx%d)\n", (gint)event->x,
(gint)event->x);
return TRUE;
}
int main( int argc, char *argv[] )
{
clutter_init(&argc, &argv);
gtk_init(&argc, &argv);
/* create main window */
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Clutter Tester");
gtk_window_resize (GTK_WINDOW (window), 640, 480);
/* Connect signals to callbacks */
g_signal_connect ( G_OBJECT(window), "delete_event",
G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect ( G_OBJECT(window), "key_press_event",
G_CALLBACK(key_press_cb), NULL);
g_signal_connect ( G_OBJECT(window), "button_press_event",
G_CALLBACK (button_press_event_cb), NULL);
g_signal_connect ( G_OBJECT(window), "button_release_event",
G_CALLBACK (button_release_event_cb), NULL);
g_signal_connect ( G_OBJECT (window), "motion_notify_event",
G_CALLBACK (motion_event_cb), NULL);
/* Create image pixbuf */
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL);
if (pixbuf == NULL) {
g_print ("Failed to open 'redhand.png'\n");
return 1;
}
/* Test with Clutter widget */
GtkWidget* clutter = gtk_clutter_embed_new ();
ClutterActor* stage = gtk_clutter_embed_get_stage (
GTK_CLUTTER_EMBED (clutter) );
ClutterActor* actor = clutter_texture_new_from_pixbuf (pixbuf);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
clutter_actor_show_all (stage);
gtk_container_add (GTK_CONTAINER (window), clutter);
/* Test with GTK Widget */
/*
GtkWidget* box = gtk_event_box_new ();
GtkWidget* image = gtk_image_new_from_pixbuf (pixbuf);
gtk_container_add (GTK_CONTAINER (box), image);
gtk_container_add (GTK_CONTAINER (window), box);
*/
/* Show everything */
gtk_widget_show_all(GTK_WIDGET(window));
gtk_main ();
return 0;
}