1 /*-
2  * vi:set et ai sts=2 sw=2 cindent:
3  *
4  * Copyright (c) 2016 Eric Koegel <eric@xfce.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General
17  * Public License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 
26 #include <stdlib.h>
27 
28 #include <gtk/gtk.h>
29 #include <glib.h>
30 #include <libxfce4ui/libxfce4ui.h>
31 
32 
33 static const gchar *APP_NAME = "libxfce4ui: Test";
34 
35 static void
main_window_destroy(GtkWidget * window)36 main_window_destroy (GtkWidget *window)
37 {
38   gtk_main_quit ();
39 }
40 
41 static void
show_xfce_message_dialog(GtkButton * button,gpointer unused)42 show_xfce_message_dialog (GtkButton *button,
43                           gpointer unused)
44 {
45   GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size ("../icons/48x48/xfce4-logo.png", 24, 24, NULL);
46 
47   xfce_message_dialog (NULL, "Question - Gtk3 version with no deprecated symbols",
48                        "dialog-question",
49                        "There are unsaved modifications",
50                        "The menu has been modified, do you want to save it before quitting?",
51                        XFCE_BUTTON_TYPE_MIXED, "document-save", "Save", GTK_RESPONSE_YES,
52                        XFCE_BUTTON_TYPE_MIXED, "edit-delete", "Forget modifications", GTK_RESPONSE_APPLY,
53                        XFCE_BUTTON_TYPE_PIXBUF, pixbuf, "Quit", GTK_RESPONSE_NO,
54                        XFCE_BUTTON_TYPE_MIXED, "process-stop", "Cancel", GTK_RESPONSE_CANCEL,
55                        NULL);
56 
57   if (pixbuf != NULL)
58     {
59       g_object_unref (G_OBJECT (pixbuf));
60     }
61 }
62 
63 static void
show_xfce_dialog_show_help(GtkButton * button,gpointer unused)64 show_xfce_dialog_show_help (GtkButton *button,
65                             gpointer unused)
66 {
67   xfce_dialog_show_help (NULL, "xfce4-session", "preferences", NULL);
68 }
69 
70 static void
show_xfce_dialog_show_help_with_version(GtkButton * button,gpointer unused)71 show_xfce_dialog_show_help_with_version (GtkButton *button,
72                                          gpointer unused)
73 {
74   xfce_dialog_show_help_with_version (NULL, "xfce4-power-manager", "start", NULL, "4.14");
75 }
76 
77 static void
remove_auto_online(GtkButton * button,gpointer unused)78 remove_auto_online (GtkButton *button,
79                     gpointer unused)
80 {
81   XfceRc   *rc;
82   gboolean  response;
83 
84   response = xfce_dialog_confirm (NULL, "system-run", "Execute",
85                                   "Removing this will enable the show help "
86                                   "dialogs to appear. Do you want to do this?",
87                                   "Remove auto-online in rc file? (Gtk3)");
88 
89   if (response == FALSE)
90     return;
91 
92   rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "xfce4/help.rc", FALSE);
93   if (rc != NULL)
94     {
95       xfce_rc_write_bool_entry (rc, "auto-online", FALSE);
96       xfce_rc_close (rc);
97     }
98 }
99 
100 static void
show_xfce_dialog_show_info(GtkButton * button,gpointer unused)101 show_xfce_dialog_show_info (GtkButton *button,
102                             gpointer unused)
103 {
104   xfce_dialog_show_info(NULL, NULL, "%s", "xfburn_transcoder_get_description (priv->trans)");
105 }
106 
107 static void
show_xfce_dialog_show_warning(GtkButton * button,gpointer unused)108 show_xfce_dialog_show_warning (GtkButton *button,
109                                gpointer unused)
110 {
111   xfce_dialog_show_warning(NULL, NULL, _("A file named \"%s\" already exists in this directory, the file hasn't been added."), "name");
112 }
113 
114 static void
show_xfce_dialog_show_error(GtkButton * button,gpointer unused)115 show_xfce_dialog_show_error (GtkButton *button,
116                              gpointer unused)
117 {
118   GError *error = NULL;
119 
120   g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_NOENT, "This isn't a real error");
121 
122   xfce_dialog_show_error (NULL, error, _("Failed to migrate the old panel configuration"));
123 
124   g_clear_error (&error);
125 }
126 
127 static void
show_xfce_dialog_confirm(GtkButton * button,gpointer unused)128 show_xfce_dialog_confirm (GtkButton *button,
129                           gpointer unused)
130 {
131   xfce_dialog_confirm (NULL, "system-run", "Execute",
132                        "Do you want to start the panel? If you do, make sure "
133                        "you save the session on logout, so the panel is "
134                        "automatically started the next time you login.",
135                        "No running instance of %s was found", G_LOG_DOMAIN);
136 }
137 
138 static void
show_xfce_dialog_confirm_close_tabs(GtkButton * button,gpointer unused)139 show_xfce_dialog_confirm_close_tabs (GtkButton *button,
140                                      gpointer unused)
141 {
142   gboolean checked = TRUE;
143   xfce_dialog_confirm_close_tabs (NULL,
144                                   3,
145                                   TRUE,
146                                   &checked);
147 }
148 
149 static void
close_window(GtkDialog * dialog,gint response_id,gpointer user_data)150 close_window (GtkDialog *dialog,
151               gint       response_id,
152               gpointer   user_data)
153 {
154   gtk_widget_destroy (GTK_WIDGET (dialog));
155 }
156 
157 static void
show_xfce_titled_dialog_new_with_buttons(GtkButton * button,gpointer unused)158 show_xfce_titled_dialog_new_with_buttons (GtkButton *button,
159                                           gpointer unused)
160 {
161   GtkWidget *dialog_gtk3;
162 
163   dialog_gtk3 = xfce_titled_dialog_new_with_buttons ("Settings Editor (Gtk3)", NULL,
164                                                 GTK_DIALOG_DESTROY_WITH_PARENT,
165                                                 "help-browser", GTK_RESPONSE_HELP,
166                                                 "window-close-symbolic", GTK_RESPONSE_OK,
167                                                 NULL);
168 
169   xfce_titled_dialog_set_subtitle (XFCE_TITLED_DIALOG (dialog_gtk3),
170                                    _("Customize settings stored by Xfconf"));
171 
172   gtk_window_set_icon_name (GTK_WINDOW (dialog_gtk3), "preferences-system");
173   gtk_window_set_type_hint (GTK_WINDOW (dialog_gtk3), GDK_WINDOW_TYPE_HINT_NORMAL);
174 
175   g_signal_connect (dialog_gtk3, "response", G_CALLBACK (close_window), NULL);
176 
177   gtk_widget_show_all (dialog_gtk3);
178 }
179 
180 static void
show_xfce_titled_dialog_new_with_mixed_buttons(GtkButton * button,gpointer unused)181 show_xfce_titled_dialog_new_with_mixed_buttons (GtkButton *button,
182                                                 gpointer unused)
183 {
184   GtkWidget *dialog_gtk3;
185 
186   dialog_gtk3 = xfce_titled_dialog_new_with_mixed_buttons ("Settings Editor (Gtk3)", NULL,
187                                                            GTK_DIALOG_DESTROY_WITH_PARENT,
188                                                            "help-browser", "Help", GTK_RESPONSE_HELP,
189                                                            "weather-snow", "Snow!", GTK_RESPONSE_APPLY,
190                                                            "", "no icon", GTK_RESPONSE_CANCEL,
191                                                            "window-close-symbolic", "Close", GTK_RESPONSE_OK,
192                                                            NULL);
193 
194   xfce_titled_dialog_set_subtitle (XFCE_TITLED_DIALOG (dialog_gtk3),
195                                    _("Customize settings stored by Xfconf"));
196 
197   gtk_window_set_icon_name (GTK_WINDOW (dialog_gtk3), "preferences-system");
198   gtk_window_set_type_hint (GTK_WINDOW (dialog_gtk3), GDK_WINDOW_TYPE_HINT_NORMAL);
199 
200   g_signal_connect (dialog_gtk3, "response", G_CALLBACK (close_window), NULL);
201 
202   gtk_widget_show_all (dialog_gtk3);
203 
204 }
205 
206 static void
show_xfce_gdk_screen_get_active(GtkButton * button,gpointer unused)207 show_xfce_gdk_screen_get_active (GtkButton *button,
208                                  gpointer unused)
209 {
210   gint       monitor_num;
211   GdkScreen *screen;
212 
213   screen = xfce_gdk_screen_get_active (&monitor_num);
214 
215   xfce_dialog_show_info (NULL, NULL, "monitor num: %d of %d",
216                          monitor_num, gdk_screen_get_n_monitors (screen));
217 }
218 
219 static void
show_xfce_filename_input_dialog(GtkButton * button,gpointer unused)220 show_xfce_filename_input_dialog (GtkButton *button,
221                                  gpointer   unused)
222 {
223   GtkWidget         *dialog;
224   XfceFilenameInput *filename_input;
225 
226   dialog = gtk_dialog_new_with_buttons ("Enter file name",
227                                         NULL,
228                                         GTK_DIALOG_MODAL
229                                         | GTK_DIALOG_DESTROY_WITH_PARENT,
230                                         "Cancel", GTK_RESPONSE_CANCEL,
231                                         "Submit", GTK_RESPONSE_OK,
232                                         NULL);
233   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
234   gtk_window_set_default_size (GTK_WINDOW (dialog), 250, -1);
235 
236   filename_input = g_object_new (XFCE_TYPE_FILENAME_INPUT,
237                                  "original-filename", "example.txt", "max-text-length", 30, NULL);
238   gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
239                      GTK_WIDGET (filename_input));
240   gtk_widget_show_all (GTK_WIDGET (filename_input));
241 
242   g_signal_connect_swapped (filename_input, "text-invalid", G_CALLBACK (xfce_filename_input_desensitise_widget),
243                             gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK));
244   g_signal_connect_swapped (filename_input, "text-valid", G_CALLBACK (xfce_filename_input_sensitise_widget),
245                             gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK));
246   xfce_filename_input_check (filename_input); /* this call ensures that the "Submit" button has its
247                                                 sensitivity set correctly */
248   gtk_dialog_run (GTK_DIALOG (dialog));
249   gtk_widget_destroy (dialog);
250 }
251 
252 
253 
254 static void
create_main_window(void)255 create_main_window (void)
256 {
257   GtkWidget *window;
258   GtkWidget *grid;
259   GtkWidget *button;
260   GtkWidget *label;
261 
262   /* Create main window */
263   window = xfce_titled_dialog_new_with_mixed_buttons (APP_NAME, NULL,
264                                                       GTK_DIALOG_DESTROY_WITH_PARENT,
265                                                       "window-close-symbolic", "_Close", GTK_RESPONSE_CLOSE,
266                                                       NULL);
267 
268 
269   gtk_window_set_icon_name (GTK_WINDOW (window), "xfce4-logo");
270   gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
271   gtk_container_set_border_width (GTK_CONTAINER (window), 12);
272 
273   /* Exit main loop when when the window is closed */
274   g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (main_window_destroy), NULL);
275   g_signal_connect (G_OBJECT (window), "response", G_CALLBACK (main_window_destroy), NULL);
276 
277   /* Create the grid to hold all the stuff */
278   grid = gtk_grid_new ();
279   gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
280   gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
281   gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (window))), grid);
282 
283   /* Create buttons */
284   /* Xfce Dialogs */
285   label = gtk_label_new ("Xfce Dialogs");
286   gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
287 
288   /* xfce_message_dialog */
289   button = gtk_button_new_with_label ("xfce_message_dialog");
290   gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 1, 1);
291   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_message_dialog), NULL);
292 
293   /* xfce_dialog_show_info */
294   button = gtk_button_new_with_label ("xfce_dialog_show_info");
295   gtk_grid_attach (GTK_GRID (grid), button, 0, 2, 1, 1);
296   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_show_info), NULL);
297 
298   /* xfce_dialog_show_warning */
299   button = gtk_button_new_with_label ("xfce_dialog_show_warning");
300   gtk_grid_attach (GTK_GRID (grid), button, 0, 3, 1, 1);
301   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_show_warning), NULL);
302 
303   /* xfce_dialog_show_error */
304   button = gtk_button_new_with_label ("xfce_dialog_show_error");
305   gtk_grid_attach (GTK_GRID (grid), button, 0, 4, 1, 1);
306   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_show_error), NULL);
307 
308   /* xfce_dialog_confirm */
309   button = gtk_button_new_with_label ("xfce_dialog_confirm");
310   gtk_grid_attach (GTK_GRID (grid), button, 0, 5, 1, 1);
311   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_confirm), NULL);
312 
313   /* xfce_dialog_confirm_close_tabs */
314   button = gtk_button_new_with_label ("xfce_dialog_confirm_close_tabs");
315   gtk_grid_attach (GTK_GRID (grid), button, 0, 6, 1, 1);
316   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_confirm_close_tabs), NULL);
317 
318   /* Online Help Dialogs */
319   label = gtk_label_new ("Online Help Dialogs");
320   gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
321 
322   /* xfce_dialog_show_help */
323   button = gtk_button_new_with_label ("xfce_dialog_show_help");
324   gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
325   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_show_help), NULL);
326 
327   /* xfce_dialog_show_help_with_version */
328   button = gtk_button_new_with_label ("xfce_dialog_show_help_with_version");
329   gtk_grid_attach (GTK_GRID (grid), button, 1, 2, 1, 1);
330   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_dialog_show_help_with_version), NULL);
331 
332   /* remove auto-online check from rc file */
333   button = gtk_button_new_with_label ("remove auto-online check from rc file");
334   gtk_grid_attach (GTK_GRID (grid), button, 1, 3, 1, 1);
335   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (remove_auto_online), NULL);
336 
337   /* Xfce Titled Dialogs */
338   label = gtk_label_new ("Xfce Titled Dialog");
339   gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1);
340 
341   /* xfce_titled_dialog_new_with_buttons */
342   button = gtk_button_new_with_label ("xfce_titled_dialog_new_with_buttons");
343   gtk_grid_attach (GTK_GRID (grid), button, 2, 1, 1, 1);
344   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_titled_dialog_new_with_buttons), NULL);
345 
346   /* xfce_titled_dialog_new_with_mixed_buttons */
347   button = gtk_button_new_with_label ("xfce_titled_dialog_new_with_mixed_buttons");
348   gtk_grid_attach (GTK_GRID (grid), button, 2, 2, 1, 1);
349   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_titled_dialog_new_with_mixed_buttons), NULL);
350 
351   /* Other Dialogs */
352   label = gtk_label_new ("Other Dialogs and Widgets");
353   gtk_grid_attach (GTK_GRID (grid), label, 3, 0, 1, 1);
354 
355   /* xfce_gdk_screen_get_active */
356   button = gtk_button_new_with_label ("xfce_gdk_screen_get_active");
357   gtk_grid_attach (GTK_GRID (grid), button, 3, 1, 1, 1);
358   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_gdk_screen_get_active), NULL);
359 
360   /* xfce_filename_input */
361   button = gtk_button_new_with_label ("XfceFilenameInput");
362   gtk_grid_attach (GTK_GRID (grid), button, 3, 2, 1, 1);
363   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_xfce_filename_input_dialog), NULL);
364 
365   gtk_widget_show_all (window);
366 }
367 
368 
369 
370 gint
main(gint argc,gchar ** argv)371 main (gint    argc,
372       gchar **argv)
373 {
374   gint    exit_code = EXIT_SUCCESS;
375 
376   /* Initialize GTK+ */
377   gtk_init (&argc, &argv);
378 
379   /* create the main window */
380   create_main_window ();
381 
382   /* Enter main loop */
383   gtk_main ();
384 
385   return exit_code;
386 }
387