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 int count = 0; |
10 | static guint timeout = 0; |
11 | |
12 | static void |
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, reveal_child: !revealed); |
21 | } |
22 | } |
23 | |
24 | static gboolean |
25 | reveal_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 | |
50 | static GtkWidget *window = NULL; |
51 | |
52 | static void |
53 | on_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 | |
64 | GtkWidget * |
65 | do_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 | |