Update the Viewport example
[clutter-gtk] / examples / gtk-clutter-viewport.c
1 #include <gtk/gtk.h>
2 #include <clutter/clutter.h>
3
4 #include <clutter-gtk/clutter-gtk.h>
5
6 static GTimer *timer = NULL;
7
8 static void
9 on_load_finished (ClutterTexture *texture,
10                   const GError   *error,
11                   gpointer        user_data)
12 {
13   if (error)
14     g_warning ("Unable to load texture: %s", error->message);
15
16   if (timer)
17     g_print ("%s: load time: %.3f secs\n",
18              G_STRLOC,
19              g_timer_elapsed (timer, NULL));
20 }
21
22 static void
23 on_size_change (ClutterTexture *texture,
24                 gint            width,
25                 gint            height)
26 {
27   g_print ("%s: tex.size = %d, %d\n", G_STRLOC, width, height);
28 }
29
30 int
31 main (int argc, char *argv[])
32 {
33   ClutterActor    *stage, *viewport, *tex;
34   ClutterColor     stage_color = { 0x61, 0x64, 0x8c, 0xff };
35   GtkWidget       *window, *embed;
36   GtkWidget       *table, *scrollbar, *slider;
37   GtkAdjustment   *h_adjustment, *v_adjustment, *z_adjustment;
38
39   g_thread_init (NULL);
40   gdk_threads_init ();
41   clutter_threads_init ();
42
43   if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
44     g_error ("Unable to initialize GtkClutter");
45
46   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
47   g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
48
49   table = gtk_table_new (3, 2, FALSE);
50   gtk_container_add (GTK_CONTAINER (window), table);
51   gtk_widget_show (table);
52
53   embed = gtk_clutter_embed_new ();
54   gtk_table_attach (GTK_TABLE (table), embed,
55                     0, 1,
56                     0, 1,
57                     GTK_EXPAND | GTK_FILL,
58                     GTK_EXPAND | GTK_FILL,
59                     0, 0);
60   gtk_widget_set_size_request (embed, 320, 240);
61   gtk_widget_show (embed);
62
63   stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (embed));
64   clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
65
66   viewport = gtk_clutter_viewport_new (NULL, NULL, NULL);
67   clutter_actor_set_size (viewport, 320, 240);
68   clutter_container_add_actor (CLUTTER_CONTAINER (stage), viewport);
69
70   if (argc < 2)
71     tex = gtk_clutter_texture_new_from_stock (embed,
72                                               GTK_STOCK_DIALOG_INFO,
73                                               GTK_ICON_SIZE_DIALOG);
74   else
75     {
76       GError *error = NULL;
77
78       tex = clutter_texture_new ();
79       clutter_texture_set_load_async (CLUTTER_TEXTURE (tex), TRUE);
80       g_signal_connect (tex,
81                         "size-change", G_CALLBACK (on_size_change),
82                         NULL);
83       g_signal_connect (tex,
84                         "load-finished", G_CALLBACK (on_load_finished),
85                         NULL);
86
87       timer = g_timer_new ();
88
89       clutter_texture_set_from_file (CLUTTER_TEXTURE (tex), argv[1], &error);
90       if (error)
91         {
92           g_warning ("Unable to open `%s': %s", argv[1], error->message);
93           g_error_free (error);
94         }
95       else
96         g_print ("%s: load time: %.3f secs\n",
97                  G_STRLOC,
98                  g_timer_elapsed (timer, NULL));
99
100       g_print ("%s: tex.size = %.2f, %.2f\n",
101                G_STRLOC,
102                clutter_actor_get_width (tex),
103                clutter_actor_get_height (tex));
104     }
105
106   clutter_container_add_actor (CLUTTER_CONTAINER (viewport), tex); 
107
108   gtk_clutter_scrollable_get_adjustments (GTK_CLUTTER_SCROLLABLE (viewport),
109                                           &h_adjustment,
110                                           &v_adjustment);
111
112   scrollbar = gtk_vscrollbar_new (v_adjustment);
113   gtk_table_attach (GTK_TABLE (table), scrollbar,
114                     1, 2,
115                     0, 1,
116                     0, GTK_EXPAND | GTK_FILL,
117                     0, 0);
118   gtk_widget_show (scrollbar);
119
120   scrollbar = gtk_hscrollbar_new (h_adjustment);
121   gtk_table_attach (GTK_TABLE (table), scrollbar,
122                     0, 1,
123                     1, 2,
124                     GTK_EXPAND | GTK_FILL, 0,
125                     0, 0);
126   gtk_widget_show (scrollbar);
127
128   z_adjustment =
129     gtk_clutter_zoomable_get_adjustment (GTK_CLUTTER_ZOOMABLE (viewport));
130
131   slider = gtk_hscale_new (z_adjustment);
132   gtk_table_attach (GTK_TABLE (table), slider,
133                     0, 1,
134                     2, 3,
135                     GTK_EXPAND | GTK_FILL, 0,
136                     0, 0);
137   gtk_widget_show (slider);
138
139   gtk_widget_show (window);
140
141   gtk_main();
142
143   return 0;
144 }