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