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
9static int count = 0;
10static guint timeout = 0;
11
12static void
13change_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, reveal_child: !revealed);
21 }
22}
23
24static gboolean
25reveal_one (gpointer data)
26{
27 GtkWidget *window = data;
28 char *name;
29 GtkRevealer *revealer;
30
31 name = g_strdup_printf (format: "revealer%d", count);
32 revealer = GTK_REVEALER (g_object_get_data (G_OBJECT (window), name));
33 g_free (mem: name);
34
35 gtk_revealer_set_reveal_child (revealer, TRUE);
36
37 g_signal_connect (revealer, "notify::child-revealed",
38 G_CALLBACK (change_direction), NULL);
39 count++;
40
41 if (count >= 9)
42 {
43 timeout = 0;
44 return FALSE;
45 }
46 else
47 return TRUE;
48}
49
50static GtkWidget *window = NULL;
51
52static void
53on_destroy (gpointer data)
54{
55 window = NULL;
56 if (timeout != 0)
57 {
58 g_source_remove (tag: timeout);
59 timeout = 0;
60 }
61
62}
63
64GtkWidget *
65do_revealer (GtkWidget *do_widget)
66{
67 if (!window)
68 {
69 GtkBuilder *builder;
70 int i;
71
72 builder = gtk_builder_new_from_resource (resource_path: "/revealer/revealer.ui");
73 window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
74 for (i = 0; i < 10; i++)
75 {
76 char *name = g_strdup_printf (format: "revealer%d", i);
77 GtkWidget *revealer = GTK_WIDGET (gtk_builder_get_object (builder, name));
78 g_object_set_data (G_OBJECT (window), key: name, data: revealer);
79 g_free (mem: name);
80 }
81 gtk_window_set_display (GTK_WINDOW (window),
82 display: gtk_widget_get_display (widget: do_widget));
83 g_signal_connect (window, "destroy",
84 G_CALLBACK (on_destroy), NULL);
85
86 g_object_unref (object: builder);
87 }
88
89 if (!gtk_widget_get_visible (widget: window))
90 {
91 count = 0;
92 timeout = g_timeout_add (interval: 690, function: reveal_one, data: window);
93 gtk_widget_show (widget: window);
94 }
95 else
96 {
97 gtk_window_destroy (GTK_WINDOW (window));
98 }
99
100
101 return window;
102}
103

source code of gtk/demos/gtk-demo/revealer.c