1/* Spinner
2 *
3 * GtkSpinner allows to show that background activity is on-going.
4 */
5
6#include <glib/gi18n.h>
7#include <gtk/gtk.h>
8
9static GtkWidget *spinner_sensitive = NULL;
10static GtkWidget *spinner_unsensitive = NULL;
11
12static void
13on_play_clicked (GtkButton *button, gpointer user_data)
14{
15 gtk_spinner_start (GTK_SPINNER (spinner_sensitive));
16 gtk_spinner_start (GTK_SPINNER (spinner_unsensitive));
17}
18
19static void
20on_stop_clicked (GtkButton *button, gpointer user_data)
21{
22 gtk_spinner_stop (GTK_SPINNER (spinner_sensitive));
23 gtk_spinner_stop (GTK_SPINNER (spinner_unsensitive));
24}
25
26GtkWidget *
27do_spinner (GtkWidget *do_widget)
28{
29 static GtkWidget *window = NULL;
30 GtkWidget *content_area;
31 GtkWidget *vbox;
32 GtkWidget *hbox;
33 GtkWidget *button;
34 GtkWidget *spinner;
35
36 if (!window)
37 {
38 window = gtk_dialog_new_with_buttons (title: "Spinner",
39 GTK_WINDOW (do_widget),
40 flags: 0,
41 _("_Close"),
42 GTK_RESPONSE_NONE,
43 NULL);
44 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
45
46 g_signal_connect (window, "response",
47 G_CALLBACK (gtk_window_destroy), NULL);
48 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
49
50 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
51
52 vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 5);
53 gtk_widget_set_margin_start (widget: vbox, margin: 5);
54 gtk_widget_set_margin_end (widget: vbox, margin: 5);
55 gtk_widget_set_margin_top (widget: vbox, margin: 5);
56 gtk_widget_set_margin_bottom (widget: vbox, margin: 5);
57 gtk_box_append (GTK_BOX (content_area), child: vbox);
58
59 /* Sensitive */
60 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 5);
61 spinner = gtk_spinner_new ();
62 gtk_box_append (GTK_BOX (hbox), child: spinner);
63 gtk_box_append (GTK_BOX (hbox), child: gtk_entry_new ());
64 gtk_box_append (GTK_BOX (vbox), child: hbox);
65 spinner_sensitive = spinner;
66
67 /* Disabled */
68 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 5);
69 spinner = gtk_spinner_new ();
70 gtk_box_append (GTK_BOX (hbox), child: spinner);
71 gtk_box_append (GTK_BOX (hbox), child: gtk_entry_new ());
72 gtk_box_append (GTK_BOX (vbox), child: hbox);
73 spinner_unsensitive = spinner;
74 gtk_widget_set_sensitive (widget: hbox, FALSE);
75
76 button = gtk_button_new_with_label (_("Play"));
77 g_signal_connect (G_OBJECT (button), "clicked",
78 G_CALLBACK (on_play_clicked), spinner);
79 gtk_box_append (GTK_BOX (vbox), child: button);
80
81 button = gtk_button_new_with_label (_("Stop"));
82 g_signal_connect (G_OBJECT (button), "clicked",
83 G_CALLBACK (on_stop_clicked), spinner);
84 gtk_box_append (GTK_BOX (vbox), child: button);
85
86 /* Start by default to test for:
87 * https://bugzilla.gnome.org/show_bug.cgi?id=598496 */
88 on_play_clicked (NULL, NULL);
89 }
90
91 if (!gtk_widget_get_visible (widget: window))
92 gtk_widget_show (widget: window);
93 else
94 gtk_window_destroy (GTK_WINDOW (window));
95
96 return window;
97}
98

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