3c67178b1a7469382a4ab22b1f8c574cbd1ce115
[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 (timer)
14     g_print ("%s: load time: %.3f secs\n",
15              G_STRLOC,
16              g_timer_elapsed (timer, NULL));
17 }
18
19 int
20 main (int argc, char *argv[])
21 {
22   ClutterActor    *stage, *viewport, *tex;
23   ClutterColor     stage_color = { 0x61, 0x64, 0x8c, 0xff };
24   GtkWidget       *window, *embed; 
25   GtkWidget       *table, *scrollbar;
26   GtkAdjustment   *h_adjustment, *v_adjustment;
27
28   g_thread_init (NULL);
29   gdk_threads_init ();
30   clutter_threads_init ();
31
32   if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
33     g_error ("Unable to initialize GtkClutter");
34
35   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
36   g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
37
38   table = gtk_table_new (2, 2, FALSE);
39   gtk_container_add (GTK_CONTAINER (window), table);
40   gtk_widget_show (table);
41
42   embed = gtk_clutter_embed_new ();
43   gtk_table_attach (GTK_TABLE (table), embed,
44                     0, 1,
45                     0, 1,
46                     GTK_EXPAND | GTK_FILL,
47                     GTK_EXPAND | GTK_FILL,
48                     0, 0);
49   gtk_widget_set_size_request (embed, 320, 240);
50   gtk_widget_show (embed);
51
52   stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (embed));
53   clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
54
55   viewport = gtk_clutter_viewport_new (NULL, NULL, NULL);
56   clutter_actor_set_size (viewport, 320, 240);
57   clutter_container_add_actor (CLUTTER_CONTAINER (stage), viewport);
58
59   if (argc < 2)
60     tex = gtk_clutter_texture_new_from_stock (embed,
61                                               GTK_STOCK_DIALOG_INFO,
62                                               GTK_ICON_SIZE_DIALOG);
63   else
64     {
65       GError *error = NULL;
66
67       tex = clutter_texture_new ();
68       g_object_set (G_OBJECT (tex), "load-async", TRUE, NULL);
69       g_signal_connect (tex,
70                         "load-finished", G_CALLBACK (on_load_finished),
71                         NULL);
72
73       timer = g_timer_new ();
74
75       clutter_texture_set_from_file (CLUTTER_TEXTURE (tex), argv[1], &error);
76       if (error)
77         {
78           g_warning ("Unable to open `%s': %s", argv[1], error->message);
79           g_error_free (error);
80         }
81       else
82         g_print ("%s: load time: %.3f secs\n",
83                  G_STRLOC,
84                  g_timer_elapsed (timer, NULL));
85
86       g_print ("%s: tex.size = %.2f, %.2f\n",
87                G_STRLOC,
88                clutter_actor_get_width (tex),
89                clutter_actor_get_height (tex));
90     }
91
92   clutter_container_add_actor (CLUTTER_CONTAINER (viewport), tex); 
93
94   gtk_clutter_scrollable_get_adjustments (GTK_CLUTTER_SCROLLABLE (viewport),
95                                           &h_adjustment,
96                                           &v_adjustment);
97
98   scrollbar = gtk_vscrollbar_new (v_adjustment);
99   gtk_table_attach (GTK_TABLE (table), scrollbar,
100                     1, 2,
101                     0, 1,
102                     0, GTK_EXPAND | GTK_FILL,
103                     0, 0);
104   gtk_widget_show (scrollbar);
105
106   scrollbar = gtk_hscrollbar_new (h_adjustment);
107   gtk_table_attach (GTK_TABLE (table), scrollbar,
108                     0, 1,
109                     1, 2,
110                     GTK_EXPAND | GTK_FILL, 0,
111                     0, 0);
112   gtk_widget_show (scrollbar);
113
114   gtk_widget_show (window);
115
116   gtk_main();
117
118   return 0;
119 }