bb2f04e1d4441fe73c3166ae061b797a91335c4d
[clutter-gtk] / examples / gtk-clutter-events.c
1 #include <gtk/gtk.h>
2 #include <clutter/clutter.h>
3
4 #include <clutter-gtk/gtk-clutter-embed.h>
5
6 typedef struct {
7
8   GtkWidget    *window;
9   GtkWidget    *popup;
10   GtkWidget    *gtk_entry;
11
12   ClutterActor *stage;
13   ClutterActor *hand;
14   ClutterActor *clutter_entry;
15
16 } EventApp;
17
18 static void
19 on_gtk_entry_changed (GtkEditable *editable, EventApp *app)
20 {
21   const gchar *text = gtk_entry_get_text (GTK_ENTRY (editable));
22
23   clutter_entry_set_text (CLUTTER_ENTRY (app->clutter_entry), text);
24 }
25
26 static void
27 on_x_changed (GtkSpinButton *button, EventApp *app)
28 {
29   clutter_actor_set_rotation (app->hand, CLUTTER_X_AXIS,
30                               gtk_spin_button_get_value (button),
31                               0,
32                               clutter_actor_get_height (app->hand) / 2,
33                               0);
34 }
35
36 static void
37 on_y_changed (GtkSpinButton *button, EventApp *app)
38 {
39   clutter_actor_set_rotation (app->hand, CLUTTER_Y_AXIS,
40                               gtk_spin_button_get_value (button),
41                               clutter_actor_get_width (app->hand) / 2,
42                               0,
43                               0);
44 }
45
46 static void
47 on_z_changed (GtkSpinButton *button, EventApp *app)
48 {
49   clutter_actor_set_rotation (app->hand, CLUTTER_Z_AXIS,
50                               gtk_spin_button_get_value (button),
51                               clutter_actor_get_width (app->hand) / 2,
52                               clutter_actor_get_height (app->hand) / 2,
53                               0);
54 }
55
56 static void
57 on_opacity_changed (GtkSpinButton *button, EventApp *app)
58 {
59   clutter_actor_set_opacity (app->hand, gtk_spin_button_get_value (button)); 
60 }
61
62 /* Set the clutter colors form the current gtk theme */
63 static void
64 create_colors (EventApp *app, ClutterColor *stage, ClutterColor *text)
65 {
66   GtkStyle *style = gtk_widget_get_style (app->window);
67   GdkColor color;
68
69   /* Set the stage color to base[NORMAL] */
70   color = style->bg[GTK_STATE_NORMAL];
71   stage->red = (guint8) ((color.red/65535.0) * 255);
72   stage->green = (guint8) ((color.green/65535.0) * 255);
73   stage->blue  = (guint8) ((color.blue/65535.0) * 255);
74   
75   /* Now the text color */
76   color = style->text[GTK_STATE_NORMAL];
77   text->red =(guint8) ((color.red/65535.0) * 255);
78   text->green = (guint8) ((color.green/65535.0) * 255);
79   text->blue = (guint8) ((color.blue/65535.0) * 255);
80 }
81
82 static gboolean
83 on_stage_capture (ClutterActor *actor,
84                   ClutterEvent *event,
85                   gpointer      dummy)
86 {
87   if (event->type == CLUTTER_BUTTON_RELEASE)
88     {
89       gint x, y;
90
91       clutter_event_get_coords (event, &x, &y);
92
93       g_print ("Event captured at (%d, %d)\n", x, y);
94     }
95
96   return FALSE;
97 }
98
99 static gboolean
100 on_hand_button_press (ClutterActor       *actor,
101                       ClutterButtonEvent *event,
102                       gpointer            dummy)
103 {
104   g_print ("Button press on hand ('%s')\n",
105            g_type_name (G_OBJECT_TYPE (actor)));
106
107   return FALSE;
108 }
109
110 gint
111 main (gint argc, gchar **argv)
112 {
113   EventApp      *app = g_new0 (EventApp, 1);
114   GtkWidget     *widget, *vbox, *hbox, *button, *label, *box;
115   ClutterActor  *actor;
116   GdkPixbuf     *pixbuf = NULL;
117   guint          width, height;
118   ClutterColor   stage_color = {255, 255, 255, 255};
119   ClutterColor   text_color = {0, 0, 0, 255};
120
121   if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
122     g_error ("Unable to initialize GtkClutter");
123
124   /* Create the inital gtk window and widgets, just like normal */
125   widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
126   app->window = widget;
127   gtk_window_set_title (GTK_WINDOW (widget), "Gtk-Clutter Interaction demo");
128   gtk_window_set_default_size (GTK_WINDOW (widget), 800, 600);
129   gtk_window_set_resizable (GTK_WINDOW (widget), FALSE);
130   gtk_container_set_border_width (GTK_CONTAINER (widget), 12);
131   g_signal_connect (widget, "destroy", G_CALLBACK (gtk_main_quit), NULL);
132  
133   /* Create our layout box */
134   vbox = gtk_vbox_new (FALSE, 12);
135   gtk_container_add (GTK_CONTAINER (app->window), vbox);
136
137   widget = gtk_entry_new ();
138   app->gtk_entry = widget;
139   gtk_entry_set_text (GTK_ENTRY (widget), "Enter some text");
140   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
141   g_signal_connect (widget, "changed", G_CALLBACK (on_gtk_entry_changed), app);
142
143   hbox = gtk_hbox_new (FALSE, 12);
144   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
145   
146   /* Set up clutter & create our stage */
147   create_colors (app, &stage_color, &text_color);
148   widget = gtk_clutter_embed_new ();
149   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
150   app->stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (widget));
151   clutter_stage_set_color (CLUTTER_STAGE (app->stage), &stage_color);
152   gtk_widget_set_size_request (widget, 640, 480);
153   g_signal_connect (app->stage, "captured-event",
154                     G_CALLBACK (on_stage_capture),
155                     NULL);
156
157   /* Create the main texture that the spin buttons manipulate */
158   pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL);
159   if (pixbuf == NULL)
160     g_error ("Unable to load pixbuf\n");
161
162   actor = clutter_texture_new_from_pixbuf (pixbuf);
163   app->hand = actor;
164   clutter_group_add (CLUTTER_GROUP (app->stage), actor);
165   clutter_actor_get_size (actor, &width, &height);
166   clutter_actor_set_position (actor,
167                               (CLUTTER_STAGE_WIDTH ()/2) - (width/2),
168                               (CLUTTER_STAGE_HEIGHT ()/2) - (height/2));
169   clutter_actor_set_reactive (actor, TRUE);
170   g_signal_connect (actor, "button-press-event",
171                     G_CALLBACK (on_hand_button_press),
172                     NULL);
173
174   /* Setup the clutter entry */
175   actor = clutter_entry_new_full ("Sans 10", "", &text_color);
176   app->clutter_entry = actor;
177   clutter_group_add (CLUTTER_GROUP (app->stage), actor);
178   clutter_actor_set_position (actor, 0, 0);
179   clutter_actor_set_size (actor, 500, 20);
180
181   /* Create our adjustment widgets */
182   vbox = gtk_vbox_new (FALSE, 6);
183   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
184
185   box = gtk_hbox_new (TRUE, 6);
186   gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
187   label = gtk_label_new ("Rotate x-axis");
188   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
189   button = gtk_spin_button_new_with_range (0, 360, 1);
190   gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
191   g_signal_connect (button, "value-changed", G_CALLBACK (on_x_changed), app);
192   
193   box = gtk_hbox_new (TRUE, 6);
194   gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
195   label = gtk_label_new ("Rotate y-axis");
196   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
197   button = gtk_spin_button_new_with_range (0, 360, 1);
198   gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
199   g_signal_connect (button, "value-changed", G_CALLBACK (on_y_changed), app);
200
201   box = gtk_hbox_new (TRUE, 6);
202   gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
203   label = gtk_label_new ("Rotate z-axis");
204   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
205   button = gtk_spin_button_new_with_range (0, 360, 1);
206   gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
207   g_signal_connect (button, "value-changed", G_CALLBACK (on_z_changed), app);
208
209   box = gtk_hbox_new (TRUE, 6);
210   gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
211   label = gtk_label_new ("Adjust opacity");
212   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
213   button = gtk_spin_button_new_with_range (0, 255, 1);
214   gtk_spin_button_set_value (GTK_SPIN_BUTTON (button), 255);
215   gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
216   g_signal_connect (button, "value-changed", G_CALLBACK (on_opacity_changed), app);
217
218   gtk_widget_show_all (app->window);
219
220   /* Only show/show_all the stage after parent show. widget_show will call
221    * show on the stage.
222   */
223   clutter_actor_show_all (app->stage);
224
225   gtk_main ();
226   
227   return 0;
228 }