2008-04-24 Emmanuele Bassi <ebassi@openedhand.com>
[clutter-gtk] / examples / gtk-clutter-test.c
index 646b232..937e716 100644 (file)
@@ -2,13 +2,14 @@
 #include <clutter/clutter.h>
 #include <math.h>
 
-#include <clutter-gtk/gtk-clutter.h>
+#include <clutter-gtk/gtk-clutter-embed.h>
+#include <clutter-gtk/gtk-clutter-util.h>
 
 #define TRAILS 0
 #define NHANDS  2
-#define WINWIDTH   800
-#define WINHEIGHT  800
-#define RADIUS     250
+#define WINWIDTH   400
+#define WINHEIGHT  400
+#define RADIUS     150
 
 typedef struct SuperOH
 {
@@ -28,18 +29,14 @@ input_cb (ClutterStage *stage,
 {
   if (event->type == CLUTTER_BUTTON_PRESS)
     {
-      ClutterButtonEvent *bev = (ClutterButtonEvent *) event;
-      ClutterActor *e;
+      ClutterActor *a;
+      gint x, y;
 
-      g_print ("*** button press event (button:%d) ***\n",
-              bev->button);
+      clutter_event_get_coords (event, &x, &y);
 
-      e = clutter_stage_get_actor_at_pos (stage, 
-                                           clutter_button_event_x (bev),
-                                           clutter_button_event_y (bev));
-
-      if (e)
-       clutter_actor_hide(e);
+      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)
     {
@@ -49,7 +46,7 @@ input_cb (ClutterStage *stage,
               clutter_key_event_symbol (kev));
       
       if (clutter_key_event_symbol (kev) == CLUTTER_q)
-       clutter_main_quit ();
+       gtk_main_quit ();
     }
 }
 
@@ -74,23 +71,24 @@ frame_cb (ClutterTimeline *timeline,
 #endif
 
   /* Rotate everything clockwise about stage center*/
-  clutter_actor_rotate_z (CLUTTER_ACTOR(oh->group),
-                           frame_num,
-                           WINWIDTH/2,
-                           WINHEIGHT/2);
+  clutter_actor_set_rotation (CLUTTER_ACTOR (oh->group),
+                              CLUTTER_Z_AXIS,
+                              frame_num,
+                              WINWIDTH / 2, WINHEIGHT / 2, 0);
+
   for (i = 0; i < NHANDS; i++)
     {
       /* rotate each hand around there centers */
-      clutter_actor_rotate_z (oh->hand[i],
-                               - 6.0 * frame_num,
-                               clutter_actor_get_width (oh->hand[i])/2,
-                               clutter_actor_get_height (oh->hand[i])/2);
-      if (fade == TRUE) {
-              clutter_actor_set_opacity (oh->hand[i], (255 - (frame_num % 255)));
-      }
+      clutter_actor_set_rotation (oh->hand[i],
+                                  CLUTTER_Z_AXIS,
+                                  - 6.0 * frame_num,
+                                  clutter_actor_get_width (oh->hand[i]) / 2,
+                                  clutter_actor_get_height (oh->hand[i]) / 2,
+                                  0);
+      if (fade == TRUE)
+        clutter_actor_set_opacity (oh->hand[i], (255 - (frame_num % 255)));
     }
 
-          
   /*
   clutter_actor_rotate_x (CLUTTER_ACTOR(oh->group),
                            75.0,
@@ -109,17 +107,16 @@ int
 main (int argc, char *argv[])
 {
   ClutterTimeline *timeline;
-  ClutterActor  *stage;
+  ClutterActor    *stage;
   ClutterColor     stage_color = { 0x61, 0x64, 0x8c, 0xff };
-  GtkWidget       *window, *clutter;
+  GtkWidget       *window, *clutter, *socket_box;
   GtkWidget       *label, *button, *vbox;
   GdkPixbuf       *pixbuf;
   SuperOH         *oh;
   gint             i;
 
-  clutter_init (&argc, &argv);
-  gtk_init (&argc, &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);
 
@@ -133,13 +130,12 @@ main (int argc, char *argv[])
   vbox = gtk_vbox_new (FALSE, 6);
   gtk_container_add (GTK_CONTAINER (window), vbox);
 
-  clutter = gtk_clutter_new ();
-  stage = gtk_clutter_get_stage (GTK_CLUTTER (clutter));
-  
+  clutter = gtk_clutter_embed_new ();
+  gtk_widget_set_size_request (clutter, WINWIDTH, WINHEIGHT);
+
   gtk_container_add (GTK_CONTAINER (vbox), clutter);
 
-  /* Set our stage size */
-/*   clutter_actor_set_size (stage, WINWIDTH, WINHEIGHT); */
+  stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter));
 
   label = gtk_label_new ("This is a label");
   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
@@ -148,6 +144,12 @@ main (int argc, char *argv[])
   g_signal_connect (button, "clicked",
                     G_CALLBACK (clickity), NULL);
   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+  button = gtk_button_new_from_stock (GTK_STOCK_QUIT);
+  g_signal_connect_swapped (button, "clicked",
+                            G_CALLBACK (gtk_widget_destroy),
+                            window);
+  gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
   
   /* and its background color */
 
@@ -164,7 +166,7 @@ main (int argc, char *argv[])
 #endif
 
   /* create a new group to hold multiple actors in a group */
-  oh->group = CLUTTER_GROUP (clutter_group_new());
+  oh->group = CLUTTER_GROUP (clutter_group_new ());
   
   for (i = 0; i < NHANDS; i++)
     {
@@ -172,9 +174,9 @@ main (int argc, char *argv[])
 #if 1
       /* Create a texture from pixbuf, then clone in to same resources */
       if (i == 0)
-       oh->hand[i] = clutter_texture_new_from_pixbuf (pixbuf);
+       oh->hand[i] = gtk_clutter_texture_new_from_pixbuf (pixbuf);
      else
-       oh->hand[i] = clutter_clone_texture_new (CLUTTER_TEXTURE(oh->hand[0]));
+       oh->hand[i] = clutter_clone_texture_new (CLUTTER_TEXTURE (oh->hand[0]));
 #else
       ClutterColor colour = { 255, 0, 0, 255 };
 
@@ -195,10 +197,8 @@ main (int argc, char *argv[])
     }
 
   /* Add the group to the stage */
-  clutter_group_add (CLUTTER_GROUP (stage), CLUTTER_ACTOR(oh->group));
-
-  /* Show everying ( and map window ) */
-  clutter_group_show_all (oh->group);
+  clutter_container_add_actor (CLUTTER_CONTAINER (clutter),
+                               CLUTTER_ACTOR (oh->group));
 
   g_signal_connect (stage, "button-press-event",
                    G_CALLBACK (input_cb), 
@@ -209,6 +209,12 @@ main (int argc, char *argv[])
 
   gtk_widget_show_all (window);
 
+  /* Only show the actors after parent show otherwise it will just be
+   * unrealized when the clutter foreign window is set. widget_show
+   * will call show on the stage.
+   */
+  clutter_actor_show_all (CLUTTER_ACTOR (oh->group));
+
   /* Create a timeline to manage animation */
   timeline = clutter_timeline_new (360, 60); /* num frames, fps */
   g_object_set(timeline, "loop", TRUE, NULL);   /* have it loop */