1 /* Revealer
2 *
3 * GtkRevealer is a container that animates showing and hiding
4 * of its sole child with nice transitions.
5 */
6
7 #include <gtk/gtk.h>
8
9 static gint count = 0;
10 static guint timeout = 0;
11
12 static void
change_direction(GtkRevealer * revealer)13 change_direction (GtkRevealer *revealer)
14 {
15 if (gtk_widget_get_mapped (GTK_WIDGET (revealer)))
16 {
17 gboolean revealed;
18
19 revealed = gtk_revealer_get_child_revealed (revealer);
20 gtk_revealer_set_reveal_child (revealer, !revealed);
21 }
22 }
23
24 static gboolean
reveal_one(gpointer data)25 reveal_one (gpointer data)
26 {
27 GtkWidget *window = data;
28 GtkBuilder *builder;
29 gchar *name;
30 GtkRevealer *revealer;
31
32 builder = GTK_BUILDER (g_object_get_data (G_OBJECT (window), "builder"));
33 name = g_strdup_printf ("revealer%d", count);
34 revealer = (GtkRevealer *)gtk_builder_get_object (builder, name);
35
36 gtk_revealer_set_reveal_child (revealer, TRUE);
37
38 g_signal_connect (revealer, "notify::child-revealed",
39 G_CALLBACK (change_direction), NULL);
40 count++;
41
42 if (count >= 9)
43 {
44 timeout = 0;
45 return FALSE;
46 }
47 else
48 return TRUE;
49 }
50
51 static GtkWidget *window = NULL;
52
53 static void
on_destroy(gpointer data)54 on_destroy (gpointer data)
55 {
56 window = NULL;
57 if (timeout != 0)
58 {
59 g_source_remove (timeout);
60 timeout = 0;
61 }
62 }
63
64 GtkWidget *
do_revealer(GtkWidget * do_widget)65 do_revealer (GtkWidget *do_widget)
66 {
67 if (!window)
68 {
69 GtkBuilder *builder;
70
71 builder = gtk_builder_new_from_resource ("/revealer/revealer.ui");
72 gtk_builder_connect_signals (builder, NULL);
73 window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
74 gtk_window_set_screen (GTK_WINDOW (window),
75 gtk_widget_get_screen (do_widget));
76 g_signal_connect (window, "destroy",
77 G_CALLBACK (on_destroy), NULL);
78 g_object_set_data_full (G_OBJECT (window), "builder", builder, g_object_unref);
79 }
80
81 if (!gtk_widget_get_visible (window))
82 {
83 count = 0;
84 timeout = g_timeout_add (690, reveal_one, window);
85 gtk_widget_show_all (window);
86 }
87 else
88 {
89 gtk_widget_destroy (window);
90 }
91
92
93 return window;
94 }
95