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 
9 static GtkWidget *spinner_sensitive = NULL;
10 static GtkWidget *spinner_unsensitive = NULL;
11 
12 static void
on_play_clicked(GtkButton * button,gpointer user_data)13 on_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 
19 static void
on_stop_clicked(GtkButton * button,gpointer user_data)20 on_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 
26 GtkWidget *
do_spinner(GtkWidget * do_widget)27 do_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 ("Spinner",
39                                           GTK_WINDOW (do_widget),
40                                           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), (gpointer *)&window);
49 
50     content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
51 
52     vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
53     gtk_widget_set_margin_start (vbox, 5);
54     gtk_widget_set_margin_end (vbox, 5);
55     gtk_widget_set_margin_top (vbox, 5);
56     gtk_widget_set_margin_bottom (vbox, 5);
57     gtk_box_append (GTK_BOX (content_area), vbox);
58 
59     /* Sensitive */
60     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
61     spinner = gtk_spinner_new ();
62     gtk_box_append (GTK_BOX (hbox), spinner);
63     gtk_box_append (GTK_BOX (hbox), gtk_entry_new ());
64     gtk_box_append (GTK_BOX (vbox), hbox);
65     spinner_sensitive = spinner;
66 
67     /* Disabled */
68     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
69     spinner = gtk_spinner_new ();
70     gtk_box_append (GTK_BOX (hbox), spinner);
71     gtk_box_append (GTK_BOX (hbox), gtk_entry_new ());
72     gtk_box_append (GTK_BOX (vbox), hbox);
73     spinner_unsensitive = spinner;
74     gtk_widget_set_sensitive (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), 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), 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 (window))
92     gtk_widget_show (window);
93   else
94     gtk_window_destroy (GTK_WINDOW (window));
95 
96   return window;
97 }
98