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