diff options
author | Logan Rathbone <poprocks@gmail.com> | 2023-01-26 19:33:49 -0500 |
---|---|---|
committer | Logan Rathbone <poprocks@gmail.com> | 2023-01-26 19:33:49 -0500 |
commit | b33e643229f4b03ca6943edc2b2c2dff7967bdd2 (patch) | |
tree | 95d1ba24baaface207f61ff215178f339c3afed6 /src | |
parent | 92eca1e32d433fd4ce45abb0b62306b1d6e0339f (diff) | |
parent | a0c55e36136eb4469156f57877829ea39c016cbb (diff) | |
download | zenity-b33e643229f4b03ca6943edc2b2c2dff7967bdd2.tar.gz |
Merge branch 'gtk4-port'
Diffstat (limited to 'src')
-rw-r--r-- | src/about.c | 83 | ||||
-rw-r--r-- | src/calendar.c | 159 | ||||
-rw-r--r-- | src/color.c | 75 | ||||
-rw-r--r-- | src/entry.c | 186 | ||||
-rw-r--r-- | src/fileselection.c | 206 | ||||
-rw-r--r-- | src/forms.c | 392 | ||||
-rwxr-xr-x | src/gdialog.in | 353 | ||||
-rw-r--r-- | src/main.c | 115 | ||||
-rw-r--r-- | src/meson.build | 42 | ||||
-rw-r--r-- | src/msg.c | 183 | ||||
-rw-r--r-- | src/notification.c | 369 | ||||
-rw-r--r-- | src/option.c | 2118 | ||||
-rw-r--r-- | src/option.h | 19 | ||||
-rw-r--r-- | src/password.c | 209 | ||||
-rw-r--r-- | src/progress.c | 338 | ||||
-rw-r--r-- | src/scale.c | 133 | ||||
-rw-r--r-- | src/text.c | 268 | ||||
-rw-r--r-- | src/tree.c | 555 | ||||
-rw-r--r-- | src/util.c | 478 | ||||
-rw-r--r-- | src/util.h | 89 | ||||
-rw-r--r-- | src/zenity.gresource.xml.in | 28 | ||||
-rw-r--r-- | src/zenity.h | 141 | ||||
-rw-r--r-- | src/zenity.ui | 1639 |
23 files changed, 3686 insertions, 4492 deletions
diff --git a/src/about.c b/src/about.c index c0baa9e..b71ea13 100644 --- a/src/about.c +++ b/src/about.c @@ -1,12 +1,15 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * about.c * - * Copyright (C) 2002 Sun Microsystems, Inc. - * Copyright (C) 2001 CodeFactory AB - * Copyright (C) 2001, 2002 Anders Carlsson + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2001 CodeFactory AB + * Copyright © 2001, 2002 Anders Carlsson + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * @@ -15,7 +18,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. @@ -24,22 +27,19 @@ * Anders Carlsson <andersca@gnu.org> */ -#include "config.h" #include "util.h" #include "zenity.h" -#include <gdk/gdkkeysyms.h> + #include <string.h> -#define GTK_RESPONSE_CREDITS 0 -#define ZENITY_HELP_PATH ZENITY_DATADIR "/help/" +#include <config.h> static GtkWidget *dialog; -static void zenity_about_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static void zenity_about_close_cb (GtkWindow *window, gpointer data); /* Sync with the people in the THANKS file */ -static const gchar *const authors[] = {"Glynn Foster <glynn foster sun com>", +static const char *const authors[] = {"Glynn Foster <glynn foster sun com>", "Lucas Rocha <lucasr gnome org>", "Mike Newman <mikegtn gnome org>", NULL}; @@ -50,8 +50,6 @@ static const char *documenters[] = {"Glynn Foster <glynn.foster@sun.com>", "GNOME Documentation Project", NULL}; -static gchar *translators; - static const char *license[] = { N_ ("This program is free software; you can redistribute it and/or modify " "it under the terms of the GNU Lesser General Public License as " @@ -69,72 +67,55 @@ static const char *license[] = { "02110-1301, USA.")}; void -zenity_about (ZenityData *data) { - GdkPixbuf *logo; +zenity_about (ZenityData *data) +{ char *license_trans; - translators = _ ("translator-credits"); - logo = - gdk_pixbuf_new_from_file (ZENITY_IMAGE_FULLPATH ("zenity.png"), NULL); - license_trans = g_strconcat ( - _ (license[0]), "\n", _ (license[1]), "\n", _ (license[2]), "\n", NULL); + _(license[0]), "\n", _(license[1]), "\n", _(license[2]), "\n", NULL); dialog = gtk_about_dialog_new (); g_object_set (G_OBJECT (dialog), - "name", + "program-name", "Zenity", "version", VERSION, "copyright", - "Copyright \xc2\xa9 2003 Sun Microsystems", + "Copyright \xc2\xa9 2003 Sun Microsystems\n" + "Copyright \xc2\xa9 2021-2023 Logan Rathbone\n", "comments", - _ ("Display dialog boxes from shell scripts"), + _("Display dialog boxes from shell scripts"), "authors", authors, "documenters", documenters, - "translator-credits", - translators, "website", - "http://live.gnome.org/Zenity", - "logo", - logo, + "https://gitlab.gnome.org/GNOME/zenity", "wrap-license", TRUE, "license", license_trans, + "icon-name", + "zenity", + "logo-icon-name", + "zenity", NULL); g_free (license_trans); - zenity_util_set_window_icon ( - dialog, NULL, ZENITY_IMAGE_FULLPATH ("zenity.png")); + g_signal_connect (dialog, "close-request", + G_CALLBACK(zenity_about_close_cb), data); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_about_dialog_response), - data); - - zenity_util_show_dialog (dialog, data->attach); - gtk_main (); + zenity_util_show_dialog (dialog); + zenity_util_gapp_main (GTK_WINDOW (dialog)); } static void -zenity_about_dialog_response (GtkWidget *widget, int response, gpointer data) { +zenity_about_close_cb (GtkWindow *window, gpointer data) +{ ZenityData *zen_data = data; - switch (response) { - case GTK_RESPONSE_CLOSE: - zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - break; - - default: - /* Esc dialog */ - zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); - break; - } - - gtk_main_quit (); + zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); + zenity_util_gapp_quit (window, zen_data); } diff --git a/src/calendar.c b/src/calendar.c index 9aaf927..f5237d1 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -1,19 +1,22 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * calendar.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. @@ -21,55 +24,50 @@ * Authors: Glynn Foster <glynn.foster@sun.com> */ -#include "config.h" #include "util.h" #include "zenity.h" + #include <time.h> +#include <config.h> + static GtkWidget *calendar; static ZenityCalendarData *zen_cal_data; -static void zenity_calendar_dialog_response ( - GtkWidget *widget, int response, gpointer data); -static void zenity_calendar_double_click (GtkCalendar *calendar, gpointer data); +static void zenity_calendar_dialog_response (GtkWidget *widget, char *rstr, gpointer data); void -zenity_calendar (ZenityData *data, ZenityCalendarData *cal_data) { - GtkBuilder *builder; +zenity_calendar (ZenityData *data, ZenityCalendarData *cal_data) +{ + g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; - GtkWidget *button; GObject *text; zen_cal_data = cal_data; - builder = zenity_util_load_ui_file ("zenity_calendar_dialog", NULL); + builder = zenity_util_load_ui_file ("zenity_calendar_dialog", "zenity_calendar_box", NULL); if (builder == NULL) { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); - - dialog = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_calendar_dialog")); + dialog = GTK_WIDGET (gtk_builder_get_object (builder, + "zenity_calendar_dialog")); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_calendar_dialog_response), - data); + g_signal_connect (dialog, "response", + G_CALLBACK(zenity_calendar_dialog_response), data); if (data->dialog_title) gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); - zenity_util_set_window_icon (dialog, - data->window_icon, - ZENITY_IMAGE_FULLPATH ("zenity-calendar.png")); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "x-office-calendar"); if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); + gtk_window_set_default_size (GTK_WINDOW(dialog), + data->width, data->height); if (data->modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); @@ -77,24 +75,28 @@ zenity_calendar (ZenityData *data, ZenityCalendarData *cal_data) { text = gtk_builder_get_object (builder, "zenity_calendar_text"); if (cal_data->dialog_text) - gtk_label_set_markup ( - GTK_LABEL (text), g_strcompress (cal_data->dialog_text)); + gtk_label_set_markup (GTK_LABEL(text), + g_strcompress (cal_data->dialog_text)); - calendar = GTK_WIDGET (gtk_builder_get_object (builder, "zenity_calendar")); + calendar = GTK_WIDGET(gtk_builder_get_object (builder, "zenity_calendar")); if (cal_data->month > 0 || cal_data->year > 0) - gtk_calendar_select_month ( - GTK_CALENDAR (calendar), cal_data->month - 1, cal_data->year); - if (cal_data->day > 0) - gtk_calendar_select_day (GTK_CALENDAR (calendar), cal_data->day); + { + g_object_set (calendar, + "month", cal_data->month - 1, + "year", cal_data->year, + NULL); + } - g_signal_connect (calendar, - "day-selected-double-click", - G_CALLBACK (zenity_calendar_double_click), - data); + if (cal_data->day > 0) + { + g_object_set (calendar, + "day", cal_data->day - 1, + NULL); + } gtk_label_set_mnemonic_widget (GTK_LABEL (text), calendar); - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, @@ -102,60 +104,58 @@ zenity_calendar (ZenityData *data, ZenityCalendarData *cal_data) { dialog); } - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } - if (data->ok_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_calendar_ok_button")); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); + if (data->ok_label) + { + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); } - if (data->cancel_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_calendar_cancel_button")); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); } - g_object_unref (builder); - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } + static void -zenity_calendar_dialog_output (void) { - guint day, month, year; - gchar time_string[128]; - GDate *date = NULL; - - gtk_calendar_get_date (GTK_CALENDAR (calendar), &day, &month, &year); - date = g_date_new_dmy (year, month + 1, day); - g_date_strftime (time_string, 127, zen_cal_data->date_format, date); +zenity_calendar_dialog_output (void) +{ + int day, month, year; + g_autofree char *time_string = NULL; + g_autoptr(GDateTime) date = NULL; + + g_object_get (calendar, + "day", &day, + "month", &month, + "year", &year, + NULL); + + date = g_date_time_new_local (year, month + 1, day + 1, + 0, 0, 0); + + time_string = g_date_time_format (date, zen_cal_data->date_format); g_print ("%s\n", time_string); - - if (date != NULL) - g_date_free (date); } static void -zenity_calendar_dialog_response ( - GtkWidget *widget, int response, gpointer data) { - ZenityData *zen_data; - - zen_data = data; - - switch (response) { - case GTK_RESPONSE_OK: +zenity_calendar_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ + ZenityData *zen_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); + + switch (response) + { + case ZENITY_OK: zenity_calendar_dialog_output (); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; @@ -166,15 +166,10 @@ zenity_calendar_dialog_response ( default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) printf ("%s\n", zen_data->extra_label[response]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - gtk_main_quit (); -} - -static void -zenity_calendar_double_click (GtkCalendar *cal, gpointer data) { - zenity_calendar_dialog_response (NULL, GTK_RESPONSE_OK, data); + zenity_util_gapp_quit (GTK_WINDOW(gtk_widget_get_native (widget)), zen_data); } diff --git a/src/color.c b/src/color.c index 9ef233e..d1f7c8e 100644 --- a/src/color.c +++ b/src/color.c @@ -1,19 +1,22 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * color.c * - * Copyright (C) 2010 Berislav Kovacki + * Copyright © 2010 Berislav Kovacki + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. @@ -27,51 +30,34 @@ #include "zenity.h" #include <string.h> +/* TODO: port to GtkColorDialog */ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + static ZenityData *zen_data; -static void zenity_colorselection_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static void zenity_colorselection_dialog_response (GtkWidget *widget, int response, gpointer data); void -zenity_colorselection (ZenityData *data, ZenityColorData *color_data) { +zenity_colorselection (ZenityData *data, ZenityColorData *color_data) +{ GtkWidget *dialog; - GtkWidget *button; GdkRGBA color; zen_data = data; dialog = gtk_color_chooser_dialog_new (data->dialog_title, NULL); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_colorselection_dialog_response), - color_data); + g_signal_connect (dialog, "response", G_CALLBACK (zenity_colorselection_dialog_response), color_data); - if (color_data->color) { - if (gdk_rgba_parse (&color, color_data->color)) { - gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog), &color); - } + if (color_data->color && + gdk_rgba_parse (&color, color_data->color)) + { + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(dialog), &color); } - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } - } - - if (data->ok_label) { - g_object_get (G_OBJECT (dialog), "ok-button", &button, NULL); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); - g_object_unref (G_OBJECT (button)); - } - - if (data->cancel_label) { - g_object_get (G_OBJECT (dialog), "cancel-button", &button, NULL); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); - g_object_unref (G_OBJECT (button)); + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } if (data->modal) @@ -79,23 +65,23 @@ zenity_colorselection (ZenityData *data, ZenityColorData *color_data) { g_object_set (dialog, "show-editor", !color_data->show_palette, NULL); - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); } - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_colorselection_dialog_response ( - GtkWidget *widget, int response, gpointer data) { +zenity_colorselection_dialog_response (GtkWidget *widget, int response, gpointer data) +{ GdkRGBA color; - switch (response) { + switch (response) + { case GTK_RESPONSE_OK: zenity_util_exit_code_with_data (ZENITY_OK, zen_data); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (widget), &color); @@ -108,11 +94,12 @@ zenity_colorselection_dialog_response ( default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) printf ("%s\n", zen_data->extra_label[response]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } + +G_GNUC_END_IGNORE_DEPRECATIONS diff --git a/src/entry.c b/src/entry.c index bf3db71..bf94cd4 100644 --- a/src/entry.c +++ b/src/entry.c @@ -1,19 +1,22 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * entry.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. @@ -21,98 +24,88 @@ * Authors: Glynn Foster <glynn.foster@sun.com> */ -#include "config.h" - #include "util.h" #include "zenity.h" -static void zenity_entry_dialog_response ( - GtkWidget *widget, int response, gpointer data); +#include <config.h> + +static void zenity_entry_dialog_response (GtkWidget *widget, char *rstr, gpointer data); static GtkWidget *entry; -static gint n_entries = 0; +static int n_entries = 0; static void -zenity_entry_fill_entries (GSList **entries, const gchar **args) { - gint i = 0; - - while (args[i] != NULL) { - *entries = g_slist_append (*entries, (gchar *) args[i]); - i++; +zenity_entry_fill_entries (GSList **entries, const char **args) +{ + for (int i = 0; args[i] != NULL; ++i) + { + *entries = g_slist_append (*entries, (char *)args[i]); } } static void -zenity_entry_combo_activate_default (GtkEntry *entry, gpointer window) { - gtk_window_activate_default (GTK_WINDOW (window)); +zenity_entry_combo_activate_default (GtkEntry *entry, gpointer window) +{ + g_signal_emit_by_name (window, "activate-default"); } void -zenity_entry (ZenityData *data, ZenityEntryData *entry_data) { - GtkBuilder *builder = NULL; +zenity_entry (ZenityData *data, ZenityEntryData *entry_data) +{ + g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; - GtkWidget *button; GObject *text; GSList *entries = NULL; GSList *tmp; GObject *vbox; - builder = zenity_util_load_ui_file ("zenity_entry_dialog", NULL); + builder = zenity_util_load_ui_file ("zenity_entry_dialog", "zenity_entry_box", NULL); - if (builder == NULL) { + if (builder == NULL) + { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_entry_dialog")); - dialog = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_entry_dialog")); - - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_entry_dialog_response), - data); + g_signal_connect (dialog, "response", G_CALLBACK(zenity_entry_dialog_response), data); if (data->dialog_title) - gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); + gtk_window_set_title (GTK_WINDOW(dialog), data->dialog_title); - zenity_util_set_window_icon ( - dialog, data->window_icon, ZENITY_IMAGE_FULLPATH ("zenity-entry.png")); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "insert-text"); if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); + gtk_window_set_default_size (GTK_WINDOW (dialog), + data->width, data->height); if (data->modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } - if (data->ok_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_entry_ok_button")); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); + if (data->ok_label) + { + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); } - if (data->cancel_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_entry_cancel_button")); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); } text = gtk_builder_get_object (builder, "zenity_entry_text"); - if (entry_data->dialog_text) - gtk_label_set_text_with_mnemonic ( - GTK_LABEL (text), g_strcompress (entry_data->dialog_text)); + if (entry_data->dialog_text) { + gtk_label_set_text_with_mnemonic (GTK_LABEL (text), + g_strcompress (entry_data->dialog_text)); + } vbox = gtk_builder_get_object (builder, "vbox4"); @@ -120,78 +113,97 @@ zenity_entry (ZenityData *data, ZenityEntryData *entry_data) { n_entries = g_slist_length (entries); - if (n_entries > 1) { + if (n_entries > 1) + { + GtkWidget *child; + entry = gtk_combo_box_text_new_with_entry (); + child = gtk_combo_box_get_child (GTK_COMBO_BOX(entry)); - for (tmp = entries; tmp; tmp = tmp->next) { - gtk_combo_box_text_append_text ( - GTK_COMBO_BOX_TEXT (entry), tmp->data); + for (tmp = entries; tmp; tmp = tmp->next) + { + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(entry), + tmp->data); } - if (entry_data->entry_text) { - gtk_combo_box_text_prepend_text ( - GTK_COMBO_BOX_TEXT (entry), entry_data->entry_text); - gtk_combo_box_set_active (GTK_COMBO_BOX (entry), 0); + if (entry_data->entry_text) + { + gtk_combo_box_text_prepend_text (GTK_COMBO_BOX_TEXT(entry), + entry_data->entry_text); + gtk_combo_box_set_active (GTK_COMBO_BOX(entry), 0); } - g_signal_connect (gtk_bin_get_child (GTK_BIN (entry)), - "activate", + g_signal_connect (child, "activate", G_CALLBACK (zenity_entry_combo_activate_default), GTK_WINDOW (dialog)); - } else { + } + else + { + GtkEntryBuffer *buffer; + entry = gtk_entry_new (); + buffer = gtk_entry_get_buffer (GTK_ENTRY(entry)); - gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_entry_set_activates_default (GTK_ENTRY(entry), TRUE); - if (entry_data->entry_text) - gtk_entry_set_text (GTK_ENTRY (entry), entry_data->entry_text); + if (entry_data->entry_text) { + gtk_entry_buffer_set_text (buffer, entry_data->entry_text, -1); + } - if (entry_data->hide_text) - g_object_set (G_OBJECT (entry), "visibility", FALSE, NULL); + if (entry_data->hide_text) { + gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); + } } - gtk_widget_show (entry); - - gtk_box_pack_end (GTK_BOX (vbox), entry, FALSE, FALSE, 0); + gtk_box_append (GTK_BOX(vbox), entry); gtk_label_set_mnemonic_widget (GTK_LABEL (text), entry); - g_object_unref (builder); - - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); } - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_entry_dialog_output (void) { - const gchar *text; +zenity_entry_dialog_output (void) +{ + const char *text; + if (n_entries > 1) - text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (entry)); + { + text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(entry)); + } else - text = gtk_entry_get_text (GTK_ENTRY (entry)); + { + GtkEntryBuffer *buffer; + + buffer = gtk_entry_get_buffer (GTK_ENTRY(entry)); + text = gtk_entry_buffer_get_text (buffer); + } if (text != NULL) g_print ("%s\n", text); } static void -zenity_entry_dialog_response (GtkWidget *widget, int response, gpointer data) { +zenity_entry_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ ZenityData *zen_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); - switch (response) { - case GTK_RESPONSE_OK: + switch (response) + { + case ZENITY_OK: zenity_entry_dialog_output (); zenity_util_exit_code_with_data (ZENITY_OK, zen_data); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; @@ -202,10 +214,10 @@ zenity_entry_dialog_response (GtkWidget *widget, int response, gpointer data) { default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) printf ("%s\n", zen_data->extra_label[response]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } diff --git a/src/fileselection.c b/src/fileselection.c index 465f08a..cf6a481 100644 --- a/src/fileselection.c +++ b/src/fileselection.c @@ -1,142 +1,119 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * fileselection.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Glynn Foster <glynn.foster@sun.com> + * Original Author: Glynn Foster <glynn.foster@sun.com> */ -#include "config.h" - #include "util.h" #include "zenity.h" + #include <string.h> +#include <config.h> + +/* TODO: port to GtkFileDialog. + */ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + static ZenityData *zen_data; -static void zenity_fileselection_dialog_response ( - gpointer obj, int response, gpointer data); +static void zenity_fileselection_dialog_response (GtkWidget *widget, int response, gpointer data); void -zenity_fileselection (ZenityData *data, ZenityFileData *file_data) { - gchar *dir; - gchar *basename; +zenity_fileselection (ZenityData *data, ZenityFileData *file_data) +{ GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; -#if GTK_CHECK_VERSION(3, 20, 0) GtkFileChooserNative *dialog; -#else - GtkWidget *dialog; -#endif zen_data = data; if (file_data->directory) { - if (file_data->save) - action = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER; - else - action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; - } else { - if (file_data->save) - action = GTK_FILE_CHOOSER_ACTION_SAVE; + action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; + } + else if (file_data->save) { + action = GTK_FILE_CHOOSER_ACTION_SAVE; } -#if GTK_CHECK_VERSION(3, 20, 0) dialog = gtk_file_chooser_native_new (data->dialog_title, - NULL, /* TODO: Get parent from xid */ + NULL, /* parent */ action, - _ ("_OK"), - _ ("_Cancel")); + _("_OK"), + _("_Cancel")); if (data->modal) - gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE); + gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG(dialog), TRUE); if (data->extra_label) g_warning ("Cannot add extra labels to GtkFileChooserNative"); -#else - dialog = gtk_file_chooser_dialog_new (NULL, - NULL, - action, - _ ("_Cancel"), - GTK_RESPONSE_CANCEL, - _ ("_OK"), - GTK_RESPONSE_ACCEPT, - NULL); - if (data->dialog_title) - gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); + g_signal_connect (dialog, "response", G_CALLBACK(zenity_fileselection_dialog_response), file_data); - if (data->modal) - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - zenity_util_set_window_icon ( - dialog, data->window_icon, ZENITY_IMAGE_FULLPATH ("zenity-file.png")); + if (file_data->uri) + { + if (g_path_is_absolute (file_data->uri) == TRUE) + { + g_autofree char *dir = g_path_get_dirname (file_data->uri); + g_autoptr(GFile) dir_gfile = g_file_new_for_path (dir); - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog), + dir_gfile, + NULL); /* GError */ } - } -#endif - - gtk_file_chooser_set_do_overwrite_confirmation ( - GTK_FILE_CHOOSER (dialog), file_data->confirm_overwrite); - - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_fileselection_dialog_response), - file_data); - - if (file_data->uri) { - dir = g_path_get_dirname (file_data->uri); - - if (g_path_is_absolute (file_data->uri) == TRUE) - gtk_file_chooser_set_current_folder ( - GTK_FILE_CHOOSER (dialog), dir); - if (file_data->uri[strlen (file_data->uri) - 1] != '/') { - basename = g_path_get_basename (file_data->uri); + if (file_data->uri[strlen (file_data->uri) - 1] != '/') + { if (file_data->save) - gtk_file_chooser_set_current_name ( - GTK_FILE_CHOOSER (dialog), basename); + { + g_autofree char *basename = g_path_get_basename (file_data->uri); + + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), + basename); + } else - (void) gtk_file_chooser_set_filename ( - GTK_FILE_CHOOSER (dialog), file_data->uri); - g_free (basename); + { + g_autoptr(GFile) file = g_file_new_for_uri (file_data->uri); + + gtk_file_chooser_set_file (GTK_FILE_CHOOSER(dialog), + file, + NULL); /* GError */ + } } - g_free (dir); } if (file_data->multi) - gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(dialog), TRUE); - if (file_data->filter) { + if (file_data->filter) + { /* Filter format: Executables | *.exe *.bat *.com */ - gint filter_i; - - for (filter_i = 0; file_data->filter[filter_i]; filter_i++) { + for (int filter_i = 0; file_data->filter[filter_i]; filter_i++) + { GtkFileFilter *filter = gtk_file_filter_new (); - gchar *filter_str = file_data->filter[filter_i]; - gchar **pattern, **patterns; - gchar *name = NULL; - gint i; + char *filter_str = file_data->filter[filter_i]; + GStrv pattern; + g_auto(GStrv) patterns = NULL; + g_autofree char *name = NULL; + int i; /* Set name */ for (i = 0; filter_str[i] != '\0'; i++) @@ -165,20 +142,10 @@ zenity_fileselection (ZenityData *data, ZenityFileData *file_data) { for (pattern = patterns; *pattern; pattern++) gtk_file_filter_add_pattern (filter, *pattern); - if (name) - g_free (name); - - g_strfreev (patterns); - - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); } } - -#if GTK_CHECK_VERSION(3, 20, 0) gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog)); -#else - zenity_util_show_dialog (dialog, data->attach); -#endif if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, @@ -186,39 +153,47 @@ zenity_fileselection (ZenityData *data, ZenityFileData *file_data) { dialog); } - gtk_main (); + /* Since a native dialog is not a GtkWindow, we can't use our handy + * util function. + */ + gtk_native_dialog_show (GTK_NATIVE_DIALOG(dialog)); + + zenity_util_gapp_main (NULL); } static void -zenity_fileselection_dialog_output ( - GtkFileChooser *chooser, ZenityFileData *file_data) { - GSList *selections, *iter; - selections = gtk_file_chooser_get_filenames (chooser); - for (iter = selections; iter != NULL; iter = iter->next) { - g_print ("%s", - g_filename_to_utf8 ((gchar *) iter->data, -1, NULL, NULL, NULL)); - g_free (iter->data); - if (iter->next != NULL) +zenity_fileselection_dialog_output (GtkFileChooser *chooser, + ZenityFileData *file_data) +{ + g_autoptr(GListModel) model = gtk_file_chooser_get_files (chooser); + guint items = g_list_model_get_n_items (model); + + for (guint i = 0; i < items; ++i) + { + g_autoptr(GFile) file = g_list_model_get_item (model, i); + + g_print ("%s", g_file_get_path (file)); + + if (i != items - 1) g_print ("%s", file_data->separator); } g_print ("\n"); - g_slist_free (selections); } static void -zenity_fileselection_dialog_response ( - gpointer obj, int response, gpointer data) { +zenity_fileselection_dialog_response (GtkWidget *widget, int response, gpointer data) +{ ZenityFileData *file_data = data; + GtkFileChooser *chooser = GTK_FILE_CHOOSER (widget); - GtkFileChooser *chooser = GTK_FILE_CHOOSER (obj); - - switch (response) { + switch (response) + { case GTK_RESPONSE_ACCEPT: zenity_fileselection_dialog_output (chooser, file_data); zenity_util_exit_code_with_data (ZENITY_OK, zen_data); break; - case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_REJECT: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; @@ -229,10 +204,13 @@ zenity_fileselection_dialog_response ( default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) { printf ("%s\n", zen_data->extra_label[response]); + } zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - gtk_main_quit (); + zenity_util_gapp_quit (NULL, zen_data); } + +G_GNUC_END_IGNORE_DEPRECATIONS diff --git a/src/forms.c b/src/forms.c index 15df718..4e4a60e 100644 --- a/src/forms.c +++ b/src/forms.c @@ -1,47 +1,54 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * forms.c * - * Copyright (C) 2010 Arx Cruz + * Copyright © 2010 Arx Cruz + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 121 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Arx Cruz <arxcruz@gnome.org> + * Original Author: Arx Cruz <arxcruz@gnome.org> */ -#include "config.h" #include "util.h" #include "zenity.h" + #include <string.h> +#include <config.h> + static ZenityData *zen_data; static GSList *selected; -static void zenity_forms_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static void zenity_forms_dialog_response (GtkWidget *widget, char *rstr, gpointer data); static void zenity_forms_dialog_get_selected (GtkTreeModel *model, GtkTreePath *path_buf, - GtkTreeIter *iter, GtkTreeView *tree_view) { - gint n_columns = 0; - gint i = 0; - GValue value = { - 0, - }; + GtkTreeIter *iter, gpointer data) +{ + int n_columns = 0; + GValue value = G_VALUE_INIT; + GtkTreeView *tree_view = GTK_TREE_VIEW(data); + + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); n_columns = gtk_tree_model_get_n_columns (model); - for (i = 0; i < n_columns; i++) { + + for (int i = 0; i < n_columns; ++i) + { gtk_tree_model_get_value (model, iter, i, &value); selected = g_slist_append (selected, g_value_dup_string (&value)); g_value_unset (&value); @@ -49,95 +56,115 @@ zenity_forms_dialog_get_selected (GtkTreeModel *model, GtkTreePath *path_buf, } static GtkWidget * -zenity_forms_create_and_fill_combo ( - ZenityFormsData *forms_data, int combo_number) { - GtkListStore *list_store; +zenity_forms_create_and_fill_combo (ZenityFormsData *forms_data, + int combo_number) +{ + g_autoptr(GtkListStore) list_store = NULL; GtkWidget *combo_box; GtkCellRenderer *renderer; - gchar *combo_values; list_store = gtk_list_store_new (1, G_TYPE_STRING); - if (forms_data->combo_values) { - combo_values = + if (forms_data->combo_values) + { + g_autofree char *combo_values = g_slist_nth_data (forms_data->combo_values, combo_number); - if (combo_values) { - gchar **row_values = g_strsplit_set (combo_values, "|", -1); - if (row_values) { - gint i = 0; + + if (combo_values) + { + char **row_values = g_strsplit_set (combo_values, "|", -1); + + if (row_values) + { + int i = 0; GtkTreeIter iter; - gchar *row = row_values[i]; + char *row = row_values[i]; - while (row != NULL) { + while (row != NULL) + { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, row, -1); row = row_values[++i]; } g_strfreev (row_values); } - g_free (combo_values); } } - combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (list_store)); - g_object_unref (G_OBJECT (list_store)); + combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL(list_store)); renderer = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, TRUE); - gtk_cell_layout_set_attributes ( - GTK_CELL_LAYOUT (combo_box), renderer, "text", 0, NULL); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(combo_box), + renderer, + TRUE); /* gboolean expand */ + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(combo_box), renderer, + "text", 0, + NULL); return combo_box; } static GtkWidget * -zenity_forms_create_and_fill_list ( - ZenityFormsData *forms_data, int list_number, gchar *header) { - GtkListStore *list_store; +zenity_forms_create_and_fill_list (ZenityFormsData *forms_data, + int list_number, char *header) +{ + g_autoptr(GtkListStore) list_store = NULL; GtkWidget *tree_view; GtkWidget *scrolled_window; - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; GType *column_types = NULL; - gchar *list_values; - gchar *column_values; - gint i = 0; + int i = 0; /* If no column names available, default is one */ - gint n_columns = 1; - gint column_index = 0; + int n_columns = 1; + int column_index = 0; tree_view = gtk_tree_view_new (); - if (forms_data->column_values) { - int columns_values_count = - g_slist_length (forms_data->column_values); + if (forms_data->column_values) + { + char *column_values; + int columns_values_count = g_slist_length (forms_data->column_values); int column_number = 0; + if (list_number < columns_values_count) { column_number = list_number; } - column_values = - g_slist_nth_data (forms_data->column_values, column_number); - if (column_values) { - gchar **values = g_strsplit_set (column_values, "|", -1); - if (values) { + column_values = g_slist_nth_data (forms_data->column_values, + column_number); + + if (column_values) + { + char **values = g_strsplit_set (column_values, "|", -1); + + if (values) + { n_columns = g_strv_length (values); column_types = g_new (GType, n_columns); + for (i = 0; i < n_columns; i++) column_types[i] = G_TYPE_STRING; - for (i = 0; i < n_columns; i++) { - gchar *column_name = values[i]; + for (i = 0; i < n_columns; i++) + { + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + char *column_name = values[i]; + renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ( - column_name, renderer, "text", column_index, NULL); - gtk_tree_view_append_column ( - GTK_TREE_VIEW (tree_view), column); + column = + gtk_tree_view_column_new_with_attributes (column_name, + renderer, + "text", column_index, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), + column); column_index++; } } - } else { + } + else + { /* If no values available, add one with string type*/ column_types = g_new (GType, n_columns); column_types[0] = G_TYPE_STRING; @@ -148,18 +175,26 @@ zenity_forms_create_and_fill_list ( gtk_list_store_set_column_types (list_store, n_columns, column_types); - if (forms_data->list_values) { - list_values = g_slist_nth_data (forms_data->list_values, list_number); - if (list_values) { - gchar **row_values = g_strsplit_set (list_values, "|", -1); - if (row_values) { + if (forms_data->list_values) + { + g_autofree char *list_values = + g_slist_nth_data (forms_data->list_values, list_number); + + if (list_values) + { + char **row_values = g_strsplit_set (list_values, "|", -1); + + if (row_values) + { GtkTreeIter iter; - gchar *row = row_values[0]; - gint position = -1; + char *row = row_values[0]; + int position = -1; i = 0; - while (row != NULL) { - if (position >= n_columns || position == -1) { + while (row != NULL) + { + if (position >= n_columns || position == -1) + { position = 0; gtk_list_store_append (list_store, &iter); } @@ -169,34 +204,29 @@ zenity_forms_create_and_fill_list ( } g_strfreev (row_values); } - g_free (list_values); } } - gtk_tree_view_set_model ( - GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (list_store)); - g_object_unref (list_store); - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - // gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW - // (scrolled_window), - // GTK_WIDGET (tree_view)); - gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (tree_view)); - gtk_widget_set_size_request (GTK_WIDGET (scrolled_window), -1, 100); + gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), + GTK_TREE_MODEL (list_store)); gtk_tree_view_set_headers_visible ( GTK_TREE_VIEW (tree_view), forms_data->show_header); + scrolled_window = gtk_scrolled_window_new (); + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW(scrolled_window), + tree_view); + gtk_widget_set_size_request (scrolled_window, -1, 100); + return scrolled_window; } void -zenity_forms_dialog (ZenityData *data, ZenityFormsData *forms_data) { - GtkBuilder *builder = NULL; +zenity_forms_dialog (ZenityData *data, ZenityFormsData *forms_data) +{ + g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; GtkWidget *grid; GtkWidget *text; - GtkWidget *button; - - GSList *tmp; int list_count = 0; int combo_count = 0; @@ -204,49 +234,40 @@ zenity_forms_dialog (ZenityData *data, ZenityFormsData *forms_data) { zen_data = data; - builder = zenity_util_load_ui_file ("zenity_forms_dialog", NULL); + builder = zenity_util_load_ui_file ("zenity_forms_dialog", "zenity_forms_box", NULL); if (builder == NULL) { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_forms_dialog")); - dialog = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_forms_dialog")); - - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_forms_dialog_response), - forms_data); + g_signal_connect (dialog, "response", + G_CALLBACK (zenity_forms_dialog_response), forms_data); if (data->dialog_title) - gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); - - if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); - - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + gtk_window_set_title (GTK_WINDOW(dialog), data->dialog_title); + + if (data->width > -1 || data->height > -1) { + gtk_window_set_default_size (GTK_WINDOW(dialog), + data->width, data->height); + } + + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } - if (data->ok_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_forms_ok_button")); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); + if (data->ok_label) + { + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); } - if (data->cancel_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_forms_cancel_button")); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); } text = GTK_WIDGET (gtk_builder_get_object (builder, "zenity_forms_text")); @@ -257,37 +278,48 @@ zenity_forms_dialog (ZenityData *data, ZenityFormsData *forms_data) { grid = GTK_WIDGET (gtk_builder_get_object (builder, "zenity_forms_grid")); - for (tmp = forms_data->list; tmp; tmp = tmp->next) { - ZenityFormsValue *zenity_value = (ZenityFormsValue *) tmp->data; + i = 0; + for (GSList *tmp = forms_data->list; + tmp != NULL; + tmp = tmp->next) + { + ZenityFormsValue *zenity_value = tmp->data; GtkWidget *label; label = gtk_label_new (zenity_value->option_value); gtk_widget_set_halign (label, GTK_ALIGN_START); gtk_grid_attach (GTK_GRID (grid), label, 0, i, 1, 1); - switch (zenity_value->type) { + switch (zenity_value->type) + { case ZENITY_FORMS_ENTRY: zenity_value->forms_widget = gtk_entry_new (); break; + case ZENITY_FORMS_PASSWORD: zenity_value->forms_widget = gtk_entry_new (); - gtk_entry_set_visibility ( - GTK_ENTRY (zenity_value->forms_widget), FALSE); + gtk_entry_set_visibility (GTK_ENTRY(zenity_value->forms_widget), + FALSE); break; + case ZENITY_FORMS_CALENDAR: zenity_value->forms_widget = gtk_calendar_new (); break; + case ZENITY_FORMS_LIST: - zenity_value->forms_widget = zenity_forms_create_and_fill_list ( - forms_data, list_count, zenity_value->option_value); + zenity_value->forms_widget = + zenity_forms_create_and_fill_list (forms_data, + list_count, zenity_value->option_value); list_count++; break; + case ZENITY_FORMS_COMBO: zenity_value->forms_widget = - zenity_forms_create_and_fill_combo ( - forms_data, combo_count); + zenity_forms_create_and_fill_combo (forms_data, + combo_count); combo_count++; break; + default: zenity_value->forms_widget = gtk_entry_new (); break; @@ -300,90 +332,98 @@ zenity_forms_dialog (ZenityData *data, ZenityFormsData *forms_data) { 1, 1); - i++; + ++i; } - gtk_widget_show_all (GTK_WIDGET (dialog)); + zenity_util_show_dialog (dialog); - g_object_unref (builder); - - if (data->timeout_delay > 0) { + if (data->timeout_delay > 0) + { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); } - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_forms_dialog_output (ZenityFormsData *forms_data) { +zenity_forms_dialog_output (ZenityFormsData *forms_data) +{ GSList *tmp, *tmp2; guint day, year, month; - GDate *date = NULL; - gchar time_string[128]; - gchar *combo_value = NULL; + g_autoptr(GDate) date = NULL; + char time_string[128]; + g_autofree char *combo_value = NULL; GtkTreeSelection *selection; - GtkListStore *list_store; + g_autoptr(GtkListStore) list_store = NULL; GtkTreeIter iter; - for (tmp = forms_data->list; tmp; tmp = tmp->next) { - ZenityFormsValue *zenity_value = (ZenityFormsValue *) tmp->data; - switch (zenity_value->type) { + for (tmp = forms_data->list; tmp; tmp = tmp->next) + { + ZenityFormsValue *zenity_value = tmp->data; + + switch (zenity_value->type) + { case ZENITY_FORMS_PASSWORD: case ZENITY_FORMS_ENTRY: g_print ("%s", - gtk_entry_get_text ( - GTK_ENTRY (zenity_value->forms_widget))); + gtk_entry_buffer_get_text (gtk_entry_get_buffer + (GTK_ENTRY(zenity_value->forms_widget)))); break; + case ZENITY_FORMS_LIST: - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW ( - gtk_bin_get_child (GTK_BIN (zenity_value->forms_widget)))); + selection = + gtk_tree_view_get_selection + (GTK_TREE_VIEW(gtk_scrolled_window_get_child + (GTK_SCROLLED_WINDOW(zenity_value->forms_widget)))); + gtk_tree_selection_selected_foreach (selection, - (GtkTreeSelectionForeachFunc) - zenity_forms_dialog_get_selected, - GTK_TREE_VIEW (gtk_bin_get_child ( - GTK_BIN (zenity_value->forms_widget)))); + zenity_forms_dialog_get_selected, + GTK_TREE_VIEW(gtk_scrolled_window_get_child + (GTK_SCROLLED_WINDOW(zenity_value->forms_widget)))); - for (tmp2 = selected; tmp2; tmp2 = tmp2->next) { + for (tmp2 = selected; tmp2; tmp2 = tmp2->next) + { if (tmp->next != NULL) { - g_print ("%s,", (gchar *) tmp2->data); + g_print ("%s,", (char *)tmp2->data); } else - g_print ("%s", (gchar *) tmp2->data); + g_print ("%s", (char *)tmp2->data); } - g_slist_foreach (selected, (GFunc) g_free, NULL); - selected = NULL; - + g_slist_free_full (g_steal_pointer (&selected), g_free); break; + case ZENITY_FORMS_CALENDAR: - gtk_calendar_get_date ( - GTK_CALENDAR (zenity_value->forms_widget), - &day, - &month, - &year); - date = g_date_new_dmy (year, month + 1, day); - g_date_strftime ( - time_string, 127, forms_data->date_format, date); + g_object_get (zenity_value->forms_widget, + "day", &day, + "month", &month, + "year", &year, + NULL); + date = g_date_new_dmy (day, month + 1, year); + g_date_strftime (time_string, sizeof time_string, forms_data->date_format, date); g_print ("%s", time_string); break; + case ZENITY_FORMS_COMBO: - if (gtk_combo_box_get_active_iter ( - GTK_COMBO_BOX (zenity_value->forms_widget), &iter)) { - list_store = GTK_LIST_STORE (gtk_combo_box_get_model ( - GTK_COMBO_BOX (zenity_value->forms_widget))); - gtk_tree_model_get (GTK_TREE_MODEL (list_store), + if (gtk_combo_box_get_active_iter + (GTK_COMBO_BOX(zenity_value->forms_widget), &iter)) + { + list_store = + GTK_LIST_STORE(gtk_combo_box_get_model + (GTK_COMBO_BOX(zenity_value->forms_widget))); + + gtk_tree_model_get (GTK_TREE_MODEL(list_store), &iter, 0, &combo_value, -1); - g_object_unref (G_OBJECT (list_store)); g_print ("%s", combo_value); - g_free (combo_value); - } else + } + else g_print (" "); break; + } if (tmp->next != NULL) g_print ("%s", forms_data->separator); @@ -392,16 +432,19 @@ zenity_forms_dialog_output (ZenityFormsData *forms_data) { } static void -zenity_forms_dialog_response (GtkWidget *widget, int response, gpointer data) { - ZenityFormsData *forms_data = (ZenityFormsData *) data; - - switch (response) { - case GTK_RESPONSE_OK: +zenity_forms_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ + ZenityFormsData *forms_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); + + switch (response) + { + case ZENITY_OK: zenity_forms_dialog_output (forms_data); zenity_util_exit_code_with_data (ZENITY_OK, zen_data); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; @@ -412,11 +455,10 @@ zenity_forms_dialog_response (GtkWidget *widget, int response, gpointer data) { default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) printf ("%s\n", zen_data->extra_label[response]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } diff --git a/src/gdialog.in b/src/gdialog.in deleted file mode 100755 index 2fc4633..0000000 --- a/src/gdialog.in +++ /dev/null @@ -1,353 +0,0 @@ -#!@PERL@ - -# gdialog -> zenity conversion wrapper -# -# by Mike Newman <mikegtn@gnome.org> -# -# This is all, of course, horrible - but it should translate -# most commond gdialog types to zenity equivalents. It will mostly drop -# the pointless and unused (even by gdialog!) size arguments -# but hopefully will translate all the others. -# -# For testing purposes, I've used a couple of the nautilus scripts -# available at http://g-scripts.sourceforge.net - what is sometimes -# unclear is what is a gdialog/zenity translation problem, and what is -# a problem with the original script - -my @command = ("zenity"); # the command line we build up to execute -my $element = ""; # current bit of command line -my $argn = 0; # counter for walking args -my $args = $#ARGV + 1; # total number of command line arguments -my $separator = 0; # set if --separate-output is in use - - -# Additon by: Kevin C. Krinke (kck) <kckrinke@opendoorsoftware.com> -# -# gdialog itself supports both the X-Windows interface as well as a console -# interface. Here's a fix to use regular dialog when appropriate. -# This should probably be a more advanced test of some sort, but I don't know -# of any other easy way of detecting and X-Windows environment. If someone does -# know better, please let me know. So for now this works: "no DISPLAY; no X". - -unless (defined $ENV{'DISPLAY'} && length($ENV{'DISPLAY'})) { - - # reset the command string - - @command = (); - - # examine all the available/default paths - - my $PATHS = ($ENV{'PATH'}||'/bin:/usr/bin:/usr/local/bin:/opt/bin'); - - BIN: foreach my $PATH (split(/\:/,$PATHS)) { - - if (-x $PATH."/gdialog.real") { - - # Some GNU/Linux distributions divert binaries when - # other packages are installed. If this exists, chances - # are it's the real gdialog and not the Zenity wrapper. - # gdialog has full support for the Console medium and - # as such is the preference over using the "regular" - # dialog interface. - - @command = ($PATH."/gdialog.real"); - last BIN; - - } elsif (-x $PATH."/dialog") { - - # change the command and skip ahead! - - @command = ($PATH."/dialog"); - last BIN; - - } - - - } - - unless (@command) { - - # we didn't find the dialog binary, exit(254) with a message - # to STDERR. - - print STDERR "missing DISPLAY and a console dialog could". - " not be found.\n"; - - # exit code 254 is used because 255, 1, 2, 3 are used by Zenity - # and cDialog. This error, is a very _bad_ error so it's semi- - # non-standard at 254. - - exit(254); - - } - - # all is well if we've made it this far - - # so join the arguments double-quoting things so that proper shell - # notation is saved. - - push @command, @ARGV; - - # and fork the process - - exec(@command); - -} - -# Got DISPLAY, has X continue as normal... -# End Addtition by: KCK - -# this just loads the current arg into $element - -sub get_arg () { - $element = $ARGV[$argn]; -} - -# walk the command line - -ARG: while ($argn < $args) { - - get_arg; - -# Informational stuff - - if ($element eq "--help" || $element eq "--about") { - print ( "gdialog is a compatibility wrapper around zenity, " . - "provided to hopefully\nallow older scripts to run. " . - "If you are reading this message, you should\n" . - "probably be using zenity directly\n\n" . - "type: 'zenity --help' or 'man zenity' for more information\n"); - exit (1); - } - -# Section 1 : Args which gdialog expects BEFORE box options -# --clear, --backtitle have no obvious effect - ignored - - if ($element eq "--title") { - - # --title argument is almost analogous in gdialog and - # zenity - so pass it almost entirely as is - - $argn++; - get_arg; - push @command, "--title=$element"; - - # keep processing args - $argn++; - next ARG; - } - - if ($element eq "--separate-output") { - - # set the flag to pring list output line by line - $separator = 1; - - # keep processing args - $argn++; - next ARG; - } - -# Section 2 : Box Options and subsequent args - - if ($element eq "--msgbox" || $element eq "--infobox") { - - # This bit is common to almost all of the dialogs - # the arg following the dialog type in gdialog is usually - # equivalent to zenity's --text arg. - - $argn++; - get_arg; - push @command, "--info", "--text=$element"; - - # this also happens a lot - gdialog accepted size args - # for dialog compatability - which it pretty much ignored - # and we will do the same - - $argn+=2; - last ARG; - } - - if ($element eq "--yesno") { - - # this will silently ignore the gdialog option to set - # the default button in question dialogs - which is - # highly hig-norant anyway! - - $argn++; - get_arg; - push @command, "--question", "--text=$element"; - last ARG; - } - - if ($element eq "--inputbox") { - $argn++; - get_arg; - push @command, "--entry", "--text=$element"; - - # ignore size elements and maybe there is some - # default text to initialize the entry with? - - $argn+=3; - get_arg; - push @command, "--entry-text=$element"; - last ARG; - } - - if ($element eq "--textbox") { - push @command, "--text-info"; - - # the arg immediately following the dialog type in - # gdialog is the filename, so pass this to zenity - - $argn++; - get_arg; - push @command, "--filename=$element"; - - # width and height matter for this one, so get them - # and apply the same multipliers as used in gdialog - - $argn++; - get_arg; - $element = $element * 7; - push @command, "--height=$element"; - $argn++; - get_arg; - $element = $element * 8; - push @command, "--width=$element"; - last ARG; - } - - if ($element eq "--checklist" || $element eq "--radiolist") { - $list=$element; - $argn++; - get_arg; - - # Conveniently, zenity and gdialog use the same names - # for list types, so pass this to zenity intact along with - # an untitled column for the check or radio buttons - # and the 'text' arg as a second column header - - push @command, "--list", $list, "--column=''", "--column=''", "--column", $element; - - # should output be line by line? - if ($separator) { - push @command, "--separator=\n"; - } - - # Skip to the first 'item' arg of the list content - # bypassing height, width and list-height - # from here args run [tag] [item] [status] ... - - $argn += 4; - - # Loop over the remainder of the commandline - # discarding the 'status' args of each item - # and using the 'item' for display in our second column - # also pass a fake NULL argument since zenity can't set - # the status of a row like gdialog can - - while ($argn < $args) { - get_arg; - push @command, "NULL", $element; - $argn += 1; - get_arg; - push @command, $element; - $argn += 2; - } - last ARG; - } - - if ($element eq "--menu") { - $list=$element; - $argn++; - get_arg; - - # a gdialog --menu is just a two column zenity --list - # Leave the first column blank (not provided) - # Use the 'text' arg as a second column header - # FIXME: or should it be the dialog text, or both? - - push @command, "--list", "--column", "", "--column", $element; - - # Skip to the first 'item' arg of the list content - # after using height, width and bypassing list-height - # from here args run [tag] [item] ... - - $argn += 1; - - get_arg; - # Height and width in characters to be displayed, so adjust - # cdialog uses 6 height for non-list, zenity uses ~24 pixels - # per list entry (default font), and 103 pixels for non-list - # This appears to be almost exact - $element = $element*24 - 35; - push @command, "--height", $element; - - $argn += 1; - get_arg; - # cdialog uses 6 width for non-list, zenity uses ~7 pixels - # per character (default font), and 22 pixels for non-list - # This is not exact, but close enough - $element = $element*7 - 20; - push @command, "--width", $element; - - $argn += 2; - - # Loop over the remainder of the commandline - # keeping 'tag' args of each item (required to return) - # and using the 'item' for display in our second column - - while ($argn < $args) { - get_arg; - push @command, $element; - $argn += 1; - } - last ARG; - } - - if ($element eq "--gauge") { - $argn++; - get_arg; - push @command, "--progress", "--text=$element"; - - # discard the size args as usually, and see if - # a percentage value was supplied to initialize the - # dialog - - $argn += 3; - get_arg; - if ($element) { - push @command, "--percentage=$element"; - } - last ARG; - } - - $argn++; -} - -# save STDOUT and STDERR -open(ORG_STDOUT, ">&STDOUT"); -open(ORG_STDERR, ">&STDERR"); - -# redirect STDERR to /dev/null (GTK messages ie: -# (zenity:637): Gtk-WARNING **: Unable to locate theme engine in module_path: "mist",) -open(STDERR, ">/dev/null"); - -# redirect STDOUT to STDERR (gdialog direct output to STDERR by default) -open(STDOUT, ">&ORG_STDERR"); - -# execute the constructed zenity command line - -# perl doc: The return value of system() is the exit status of the -#program as returned by the wait() call. To get the actual exit value -# divide by 256. - -my $return = system(@command)/256; - -# restore STDOUT and STDERR -open(STDOUT, ">&ORG_STDOUT"); -open(STDERR, ">&ORG_STDERR"); -close(ORG_STDOUT); -close(ORG_STDERR); - -exit $return; @@ -1,120 +1,163 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * main.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Glynn Foster <glynn.foster@sun.com> + * Original Author: Glynn Foster <glynn.foster@sun.com> */ -#include <config.h> - #include "option.h" #include "zenity.h" -#include <glib.h> -#include <gtk/gtk.h> -#include <langinfo.h> -#include <stdlib.h> -#ifdef HAVE_LOCALE_H +#include <adwaita.h> #include <locale.h> -#endif +#include <stdlib.h> -gint -main (gint argc, gchar **argv) { - ZenityParsingOptions *results; - gint retval; +#include <config.h> -#ifdef HAVE_LOCALE_H - setlocale (LC_ALL, ""); -#endif +typedef struct { + int argc; + char **argv; +} ZenityArgs; - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - gtk_init (&argc, &argv); +static void +command_line_cb (GApplication *app, + GApplicationCommandLine *command_line, + gpointer user_data) +{ + ZenityArgs *args = user_data; + ZenityParsingOptions *results; - results = zenity_option_parse (argc, argv); + results = zenity_option_parse (args->argc, args->argv); - switch (results->mode) { + switch (results->mode) + { case MODE_CALENDAR: zenity_calendar (results->data, results->calendar_data); break; + case MODE_ENTRY: - results->entry_data->data = (const gchar **) argv + 1; + /* allow for a series of tokens (or even a bash array!) to be + * passed as arguments so as to auto-populate the entry with + * a list of options as a combo-box. + */ + results->entry_data->data = (const char **) args->argv + 1; zenity_entry (results->data, results->entry_data); break; + case MODE_ERROR: case MODE_QUESTION: case MODE_WARNING: case MODE_INFO: zenity_msg (results->data, results->msg_data); break; + case MODE_SCALE: zenity_scale (results->data, results->scale_data); break; + case MODE_FILE: zenity_fileselection (results->data, results->file_data); break; + case MODE_LIST: - results->tree_data->data = (const gchar **) argv + 1; + results->tree_data->data = (const char **) args->argv + 1; zenity_tree (results->data, results->tree_data); break; -#ifdef HAVE_LIBNOTIFY + case MODE_NOTIFICATION: zenity_notification (results->data, results->notification_data); break; -#endif + case MODE_PROGRESS: zenity_progress (results->data, results->progress_data); break; + case MODE_TEXTINFO: zenity_text (results->data, results->text_data); break; + case MODE_COLOR: zenity_colorselection (results->data, results->color_data); break; + case MODE_PASSWORD: zenity_password_dialog (results->data, results->password_data); break; + case MODE_ABOUT: zenity_about (results->data); break; + case MODE_FORMS: zenity_forms_dialog (results->data, results->forms_data); break; + case MODE_VERSION: g_print ("%s\n", VERSION); break; + case MODE_LAST: g_printerr (_ ("You must specify a dialog type. See 'zenity " "--help' for details\n")); - zenity_option_free (); exit (-1); + default: g_assert_not_reached (); - zenity_option_free (); exit (-1); } - retval = results->data->exit_code; + g_free (args); +} + +static void dummy_log_func (void) { } + +int +main (int argc, char *argv[]) +{ + ZenityArgs *args; + g_autoptr(AdwApplication) app = NULL; + int status; + + /* <i18n> */ + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + /* </i18n> */ + + /* Turn off g_message's from libadwaita - this is to suppress the 'this is + * discouraged' message re: mapping dialogs without a transient parent. + */ + g_log_set_handler ("Adwaita", G_LOG_LEVEL_MESSAGE, (GLogFunc)dummy_log_func, NULL); + + args = g_new0 (ZenityArgs, 1); + args->argc = argc; + args->argv = argv; + + app = adw_application_new (APP_ID, G_APPLICATION_HANDLES_COMMAND_LINE); + g_signal_connect (app, "command-line", G_CALLBACK(command_line_cb), args); - zenity_option_free (); + status = g_application_run (G_APPLICATION(app), 0, NULL); - exit (retval); + return status; } diff --git a/src/meson.build b/src/meson.build index 748fe31..2ee1889 100644 --- a/src/meson.build +++ b/src/meson.build @@ -15,15 +15,27 @@ zenity_sources = [ 'scale.c', 'text.c', 'tree.c', - 'util.c' + 'util.c', ] -zenity_deps = [ - gtk_dep, - libnotify, - webkitgtk, - x11 -] +zenity_enums = gnome.mkenums_simple('zenity-enums', + sources: 'zenity.h', +) + +zenity_res_conf = configuration_data() +zenity_res_conf.set('resource_base_path', resource_base_path) + +zenity_res_in = configure_file( + input: 'zenity.gresource.xml.in', + output: 'zenity.gresource.xml', + configuration: zenity_res_conf +) + +zenity_res = gnome.compile_resources( + 'zenity-resources', + zenity_res_in, + c_name: 'zenity' +) zenity_c_args = [ '-DG_LOG_DOMAIN="Zenity"' @@ -31,21 +43,9 @@ zenity_c_args = [ zenity = executable( meson.project_name(), - zenity_sources, + zenity_sources + zenity_enums + zenity_res, include_directories: zenity_root_dir, - dependencies: zenity_deps, c_args: zenity_c_args, + dependencies: [adw_dep, webkitgtk_dep], install: true ) - -if perl.found() - configure_file( - input: 'gdialog.in', - output: 'gdialog', - configuration: zenity_conf, - install_dir: zenity_bindir, - install: true - ) -endif - -install_data('zenity.ui') @@ -1,7 +1,10 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * msg.c * * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,38 +24,17 @@ * Authors: Glynn Foster <glynn.foster@sun.com> */ -#include "config.h" +#include <config.h> #include "util.h" #include "zenity.h" -static void zenity_msg_dialog_response ( - GtkWidget *widget, int response, gpointer data); -static void -zenity_msg_construct_question_dialog ( - GtkWidget *dialog, ZenityMsgData *msg_data, ZenityData *data) { - - GtkWidget *cancel_button, *ok_button; - - cancel_button = gtk_dialog_add_button ( - GTK_DIALOG (dialog), _ ("_No"), GTK_RESPONSE_CANCEL); - ok_button = gtk_dialog_add_button ( - GTK_DIALOG (dialog), _ ("_Yes"), GTK_RESPONSE_OK); - - gtk_widget_grab_focus ( - msg_data->default_cancel ? cancel_button : ok_button); - - if (data->cancel_label) { - gtk_button_set_label (GTK_BUTTON (cancel_button), data->cancel_label); - } - - if (data->ok_label) { - gtk_button_set_label (GTK_BUTTON (ok_button), data->ok_label); - } -} +static void zenity_msg_dialog_response (GtkWidget *widget, char *rstr, gpointer data); +/* FIXME - Is this still necessary with gtk4? */ static void -zenity_label_widget_clipboard_selection (GtkWidget *widget) { +zenity_label_widget_clipboard_selection (GtkWidget *widget) +{ /* Workaround hotfix for suspected toolkit issue: since focus change of the dialog's focussed widget (text) somehow currently chooses to destroy @@ -76,52 +58,46 @@ zenity_label_widget_clipboard_selection (GtkWidget *widget) { } void -zenity_msg (ZenityData *data, ZenityMsgData *msg_data) { - GtkBuilder *builder; +zenity_msg (ZenityData *data, ZenityMsgData *msg_data) +{ + g_autoptr(GtkBuilder) builder; GtkWidget *dialog; - GtkWidget *ok_button; GObject *text; GObject *image; - switch (msg_data->mode) { + switch (msg_data->mode) + { case ZENITY_MSG_WARNING: - builder = zenity_util_load_ui_file ("zenity_warning_dialog", NULL); + builder = zenity_util_load_ui_file ("zenity_warning_dialog", "zenity_warning_box", NULL); dialog = GTK_WIDGET ( gtk_builder_get_object (builder, "zenity_warning_dialog")); text = gtk_builder_get_object (builder, "zenity_warning_text"); image = gtk_builder_get_object (builder, "zenity_warning_image"); - ok_button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_warning_ok_button")); break; case ZENITY_MSG_QUESTION: case ZENITY_MSG_SWITCH: - builder = zenity_util_load_ui_file ("zenity_question_dialog", NULL); - dialog = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_question_dialog")); + builder = zenity_util_load_ui_file ("zenity_question_dialog", "zenity_question_box", NULL); + dialog = GTK_WIDGET (gtk_builder_get_object (builder, + "zenity_question_dialog")); text = gtk_builder_get_object (builder, "zenity_question_text"); image = gtk_builder_get_object (builder, "zenity_question_image"); - ok_button = NULL; break; case ZENITY_MSG_ERROR: - builder = zenity_util_load_ui_file ("zenity_error_dialog", NULL); - dialog = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_error_dialog")); + builder = zenity_util_load_ui_file ("zenity_error_dialog", "zenity_error_box", NULL); + dialog = GTK_WIDGET (gtk_builder_get_object (builder, + "zenity_error_dialog")); text = gtk_builder_get_object (builder, "zenity_error_text"); image = gtk_builder_get_object (builder, "zenity_error_image"); - ok_button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_error_ok_button")); break; case ZENITY_MSG_INFO: - builder = zenity_util_load_ui_file ("zenity_info_dialog", NULL); - dialog = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_info_dialog")); + builder = zenity_util_load_ui_file ("zenity_info_dialog", "zenity_info_box", NULL); + dialog = GTK_WIDGET (gtk_builder_get_object (builder, + "zenity_info_dialog")); text = gtk_builder_get_object (builder, "zenity_info_text"); image = gtk_builder_get_object (builder, "zenity_info_image"); - ok_button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_info_ok_button")); break; default: @@ -129,18 +105,13 @@ zenity_msg (ZenityData *data, ZenityMsgData *msg_data) { dialog = NULL; text = NULL; image = NULL; - ok_button = NULL; g_assert_not_reached (); break; } - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } if (builder == NULL) { @@ -148,89 +119,90 @@ zenity_msg (ZenityData *data, ZenityMsgData *msg_data) { return; } - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_msg_dialog_response), - data); - - gtk_builder_connect_signals (builder, NULL); + g_signal_connect (dialog, "response", G_CALLBACK(zenity_msg_dialog_response), data); if (data->dialog_title) gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); - if (ok_button) { - if (data->ok_label) { - gtk_button_set_label (GTK_BUTTON (ok_button), data->ok_label); - } + if (data->ok_label) + { + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog) } - switch (msg_data->mode) { + switch (msg_data->mode) + { case ZENITY_MSG_WARNING: - zenity_util_set_window_icon_from_icon_name ( - dialog, data->window_icon, "dialog-warning"); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "dialog-warning"); break; case ZENITY_MSG_QUESTION: - zenity_util_set_window_icon_from_icon_name ( - dialog, data->window_icon, "dialog-question"); - zenity_msg_construct_question_dialog (dialog, msg_data, data); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "dialog-question"); break; case ZENITY_MSG_SWITCH: - zenity_util_set_window_icon_from_icon_name ( - dialog, data->window_icon, "dialog-question"); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "dialog-question"); break; case ZENITY_MSG_ERROR: - zenity_util_set_window_icon_from_icon_name ( - dialog, data->window_icon, "dialog-error"); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "dialog-error"); break; case ZENITY_MSG_INFO: - zenity_util_set_window_icon_from_icon_name ( - dialog, data->window_icon, "dialog-information"); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "dialog-information"); break; default: break; } + if (data->width > -1 || data->height > -1) { + gtk_window_set_default_size (GTK_WINDOW(dialog), + data->width, data->height); + } - if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); - - if (data->width > -1) + if (data->width > -1) { gtk_widget_set_size_request (GTK_WIDGET (text), data->width, -1); + } else if (!msg_data->ellipsize && !msg_data->no_wrap) { - /* The magic number 60 is taken from gtk+/gtk/ui/gtkmessagedialog.ui - with 10 as a minimum width. */ - gtk_label_set_width_chars (GTK_LABEL (text), 10); - gtk_label_set_max_width_chars (GTK_LABEL (text), 60); + /* the magic number 60 is picked from gtk+/gtk/ui/gtkmessagedialog.ui + */ + gtk_label_set_max_width_chars (GTK_LABEL(text), 60); } if (data->modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - if (msg_data->dialog_text) { - if (msg_data->no_markup) + if (msg_data->dialog_text) + { + if (msg_data->no_markup) { gtk_label_set_text (GTK_LABEL (text), msg_data->dialog_text); - else - gtk_label_set_markup ( - GTK_LABEL (text), g_strcompress (msg_data->dialog_text)); + } + else { + gtk_label_set_markup (GTK_LABEL (text), + g_strcompress (msg_data->dialog_text)); + } zenity_label_widget_clipboard_selection (GTK_WIDGET (text)); } if (msg_data->ellipsize) - gtk_label_set_ellipsize (GTK_LABEL (text), PANGO_ALIGN_RIGHT); + gtk_label_set_ellipsize (GTK_LABEL (text), PANGO_ELLIPSIZE_END); if (msg_data->dialog_icon) - gtk_image_set_from_icon_name ( - GTK_IMAGE (image), msg_data->dialog_icon, GTK_ICON_SIZE_DIALOG); + { + g_autoptr(GIcon) icon = NULL; + + icon = zenity_util_gicon_from_string (msg_data->dialog_icon); + gtk_image_set_from_gicon (GTK_IMAGE (image), icon); + } if (msg_data->no_wrap) - gtk_label_set_line_wrap (GTK_LABEL (text), FALSE); + gtk_label_set_wrap (GTK_LABEL(text), FALSE); - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, @@ -238,30 +210,31 @@ zenity_msg (ZenityData *data, ZenityMsgData *msg_data) { NULL); } - g_object_unref (builder); - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_msg_dialog_response (GtkWidget *widget, int response, gpointer data) { +zenity_msg_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ ZenityData *zen_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); - switch (response) { - case GTK_RESPONSE_OK: + switch (response) + { + case ZENITY_OK: zenity_util_exit_code_with_data (ZENITY_OK, zen_data); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) printf ("%s\n", zen_data->extra_label[response]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } diff --git a/src/notification.c b/src/notification.c index eb0e79e..295c1c2 100644 --- a/src/notification.c +++ b/src/notification.c @@ -1,8 +1,11 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * notification.c * - * Copyright (C) 2002 Sun Microsystems, Inc. - * Copyright (C) 2006 Christian Persch + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2006 Christian Persch + * Copyright © 2021-2022 Logan Rathbone * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,7 +22,7 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Glynn Foster <glynn.foster@sun.com> + * Original Author: Glynn Foster <glynn.foster@sun.com> */ #include <config.h> @@ -29,184 +32,102 @@ #include <string.h> #include <time.h> #include <unistd.h> -#ifdef HAVE_LIBNOTIFY -#include <libnotify/notify.h> #include "util.h" #include "zenity.h" #define MAX_HINTS 16 -static char *icon_file; -static GHashTable *notification_hints; +static void +zenity_send_notification (GNotification *notification) +{ + g_application_send_notification (g_application_get_default (), + "zenity-notification", + notification); +} -static NotifyNotification * -zenity_notification_new (gchar *message, gchar *icon_file) { - NotifyNotification *notif; - gchar **text; +static GNotification * +zenity_notification_new (char *message, char *icon_path) +{ + g_autoptr (GNotification) notif; + g_auto(GStrv) text = NULL; + /* Accept a title and optional body in the form of `my title\nmy body'. + * The way this is displayed by the notification system is implementation + * defined. + */ text = g_strsplit (g_strcompress (message), "\n", 2); - if (*text == NULL) { - g_printerr (_ ("Could not parse message\n")); + if (*text == NULL) + { + g_printerr (_("Could not parse message\n")); return NULL; } - notif = notify_notification_new (text[0], /* title */ - text[1], /* summary */ - icon_file); - g_strfreev (text); - return notif; -} - -static void -on_notification_default_action ( - NotifyNotification *n, const char *action, void *user_data) { - ZenityData *zen_data; - - zen_data = (ZenityData *) user_data; - notify_notification_close (n, NULL); + notif = g_notification_new (text[0]); /* title */ - zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - - gtk_main_quit (); -} - -static GHashTable * -zenity_notification_parse_hints_array (gchar **hints) { - GHashTable *result; - gchar **pair; - int i; + if (text[1]) + g_notification_set_body (notif, text[1]); - result = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + if (icon_path) + { + g_autoptr(GIcon) icon = NULL; - for (i = 0; i < g_strv_length (hints); i++) { - pair = g_strsplit (hints[i], ":", 2); - g_hash_table_replace (result, g_strdup (pair[0]), g_strdup (pair[1])); - g_strfreev (pair); + icon = zenity_util_gicon_from_string (icon_path); + g_notification_set_icon (notif, icon); } - if (g_hash_table_size (result) == 0) { - g_hash_table_unref (result); - return NULL; - } else { - return result; - } -} -static GHashTable * -zenity_notification_parse_hints (gchar *hints) { - GHashTable *result; - gchar **hint_array; - - hint_array = g_strsplit (g_strcompress (hints), "\n", MAX_HINTS); - result = zenity_notification_parse_hints_array (hint_array); - g_strfreev (hint_array); - return result; + return g_steal_pointer (¬if); } static void -zenity_notification_set_hint ( - gpointer key, gpointer value, gpointer user_data) { - NotifyNotification *notification; - gchar *hint_name; - GVariant *hint_value; - - gchar *string_value; - gboolean boolean_value; - gint32 int_value; - guchar byte_value; - - hint_name = (gchar *) key; - string_value = (gchar *) value; - notification = (NotifyNotification *) user_data; - - if ((g_ascii_strcasecmp ("action-icons", hint_name) == 0) || - (g_ascii_strcasecmp ("resident", hint_name) == 0) || - (g_ascii_strcasecmp ("suppress-sound", hint_name) == 0) || - (g_ascii_strcasecmp ("transient", hint_name) == 0)) { - /* boolean hints */ - if (g_ascii_strcasecmp ("true", string_value) == 0) { - boolean_value = TRUE; - } else if (g_ascii_strcasecmp ("false", string_value) == 0) { - boolean_value = FALSE; - } else { - g_printerr (_ ("Invalid value for a boolean typed hint.\nSupported " - "values are 'true' or 'false'.\n")); - return; - } - hint_value = g_variant_new_boolean (boolean_value); - } else if ((g_ascii_strcasecmp ("category", hint_name) == 0) || - (g_ascii_strcasecmp ("desktop-entry", hint_name) == 0) || - (g_ascii_strcasecmp ("image-path", hint_name) == 0) || - (g_ascii_strcasecmp ("image_path", hint_name) == 0) || - (g_ascii_strcasecmp ("sound-file", hint_name) == 0) || - (g_ascii_strcasecmp ("sound-name", hint_name) == 0)) { - /* string hints */ - hint_value = g_variant_new_string (string_value); - } else if ((g_ascii_strcasecmp ("image-data", hint_name) == 0) || - (g_ascii_strcasecmp ("image_data", hint_name) == 0) || - (g_ascii_strcasecmp ("icon-data", hint_name) == 0)) { - /* (iibiiay) */ - g_printerr (_ ("Unsupported hint. Skipping.\n")); - return; - } else if ((g_ascii_strcasecmp ("x", hint_name) == 0) || - (g_ascii_strcasecmp ("y", hint_name) == 0)) { - /* int hints */ - if (string_value == NULL) - string_value = ""; - int_value = (gint32) g_ascii_strtoll (string_value, NULL, 0); - hint_value = g_variant_new_int32 (int_value); - } else if ((g_ascii_strcasecmp ("urgency", hint_name) == 0)) { - /* byte hints */ - if (string_value == NULL) - string_value = ""; - byte_value = (guchar) g_ascii_strtoll (string_value, NULL, 0); - hint_value = g_variant_new_byte (byte_value); - } else { - /* unknown hints */ - g_printerr (_ ("Unknown hint name. Skipping.\n")); - return; - } - - notify_notification_set_hint (notification, hint_name, hint_value); -} +on_notification_default_action (GSimpleAction *self, + GVariant *parameter, + gpointer user_data) +{ + ZenityData *zen_data = user_data; -static void -zenity_notification_set_hints ( - NotifyNotification *notification, GHashTable *hints) { - if (hints == NULL) { - return; - } + zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - g_hash_table_foreach (hints, zenity_notification_set_hint, notification); + zenity_util_gapp_quit (NULL, zen_data); } static gboolean -zenity_notification_handle_stdin ( - GIOChannel *channel, GIOCondition condition, gpointer user_data) { - if ((condition & G_IO_IN) != 0) { - GString *string; - GError *error = NULL; +zenity_notification_handle_stdin (GIOChannel *channel, GIOCondition condition, + gpointer user_data) +{ + static char *icon_file; + + if ((condition & G_IO_IN) != 0) + { + g_autoptr(GString) string = NULL; + g_autoptr(GError) error = NULL; - string = g_string_new (NULL); while (channel->is_readable == FALSE) ; + + string = g_string_new (NULL); + do { - gint status; - gchar *command, *value, *colon; + int status; + g_autofree char *command = NULL; + char *value, *colon; do { - status = g_io_channel_read_line_string ( - channel, string, NULL, &error); - while (gdk_events_pending ()) - gtk_main_iteration (); + status = g_io_channel_read_line_string (channel, string, + NULL, &error); + + while (g_main_context_pending (NULL)) { + g_main_context_iteration (NULL, FALSE); + } } while (status == G_IO_STATUS_AGAIN); - if (status != G_IO_STATUS_NORMAL) { + if (status != G_IO_STATUS_NORMAL) + { if (error) { - g_warning ("zenity_notification_handle_stdin () : %s", - error->message); - g_error_free (error); + g_warning ("%s: %s", + __func__, + error->message); error = NULL; } continue; @@ -214,10 +135,12 @@ zenity_notification_handle_stdin ( zenity_util_strip_newline (string->str); colon = strchr (string->str, ':'); - if (colon == NULL) { - g_printerr (_ ("Could not parse command from stdin\n")); + if (colon == NULL) + { + g_printerr (_("Could not parse command from stdin\n")); continue; } + /* split off the command and value */ command = g_strstrip (g_strndup (string->str, colon - string->str)); @@ -225,69 +148,62 @@ zenity_notification_handle_stdin ( while (*value && g_ascii_isspace (*value)) value++; - if (!g_ascii_strcasecmp (command, "icon")) { + if (! g_ascii_strcasecmp (command, "icon")) + { g_free (icon_file); icon_file = g_strdup (value); - } else if (!g_ascii_strcasecmp (command, "hints")) { - if (notification_hints != NULL) { - g_hash_table_unref (notification_hints); - } - notification_hints = zenity_notification_parse_hints (value); - } else if (!g_ascii_strcasecmp (command, "message")) { + } + else if (!g_ascii_strcasecmp (command, "message")) + { /* display a notification bubble */ - if (!g_utf8_validate (value, -1, NULL)) { + if (! g_utf8_validate (value, -1, NULL)) + { g_warning ("Invalid UTF-8 in input!"); - } else { - NotifyNotification *notif; - error = NULL; + } + else + { + g_autoptr(GNotification) notif = NULL; notif = zenity_notification_new (value, icon_file); + if (notif == NULL) continue; - zenity_notification_set_hints (notif, notification_hints); - - notify_notification_show (notif, &error); - if (error) { - g_warning ( - "Error showing notification: %s", error->message); - g_error_free (error); - error = NULL; - } - - g_object_unref (notif); + zenity_send_notification (notif); } - } else if (!g_ascii_strcasecmp (command, "tooltip")) { - if (!g_utf8_validate (value, -1, NULL)) { + } + else if (! g_ascii_strcasecmp (command, "tooltip")) + { + if (! g_utf8_validate (value, -1, NULL)) + { g_warning ("Invalid UTF-8 in input!"); - } else { - NotifyNotification *notif; + } + else + { + g_autoptr(GNotification) notif = NULL; + notif = zenity_notification_new (value, icon_file); + if (notif == NULL) continue; - zenity_notification_set_hints (notif, notification_hints); - - notify_notification_show (notif, &error); - if (error) { - g_warning ( - "Error showing notification: %s", error->message); - g_error_free (error); - error = NULL; - } + zenity_send_notification (notif); } - } else if (!g_ascii_strcasecmp (command, "visible")) { + } + else if (!g_ascii_strcasecmp (command, "visible")) + { - } else { + } + else + { g_warning ("Unknown command '%s'", command); } - g_free (command); } while (g_io_channel_get_buffer_condition (channel) == G_IO_IN); - g_string_free (string, TRUE); } - if ((condition & G_IO_HUP) != 0) { + if ((condition & G_IO_HUP) != 0) + { g_io_channel_shutdown (channel, TRUE, NULL); return FALSE; } @@ -296,76 +212,59 @@ zenity_notification_handle_stdin ( } static void -zenity_notification_listen_on_stdin (ZenityData *data) { +zenity_notification_listen_on_stdin (ZenityData *data) +{ GIOChannel *channel; channel = g_io_channel_unix_new (0); g_io_channel_set_encoding (channel, NULL, NULL); g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); - g_io_add_watch ( - channel, G_IO_IN | G_IO_HUP, zenity_notification_handle_stdin, data); + g_io_add_watch (channel, + G_IO_IN | G_IO_HUP, + zenity_notification_handle_stdin, + data); } void -zenity_notification ( - ZenityData *data, ZenityNotificationData *notification_data) { - GError *error; - NotifyNotification *notification; - GHashTable *notification_hints; - - /* create the notification widget */ - if (!notify_is_initted ()) { - notify_init (_ ("Zenity notification")); - } +zenity_notification (ZenityData *data, + ZenityNotificationData *notification_data) +{ + GNotification *notification; - if (notification_data->listen) { + if (notification_data->listen) + { zenity_notification_listen_on_stdin (data); - gtk_main (); - } else { - if (notification_data->notification_text == NULL) { + + zenity_util_gapp_main (NULL); + } + else + { + g_autoptr(GSimpleAction) action = NULL; + + if (notification_data->notification_text == NULL) exit (1); - } notification = zenity_notification_new ( - notification_data->notification_text, data->window_icon); + notification_data->notification_text, notification_data->icon); - if (notification == NULL) { + if (notification == NULL) exit (1); - } /* if we aren't listening for changes, then close on default action */ - notify_notification_add_action (notification, - "default", - "Do Default Action", - (NotifyActionCallback) on_notification_default_action, - data, - NULL); + action = g_simple_action_new ("app.default", NULL); + g_signal_connect (action, "activate", + G_CALLBACK(on_notification_default_action), data); - /* set the notification hints for the displayed notification */ - if (notification_data->notification_hints != NULL) { - notification_hints = zenity_notification_parse_hints_array ( - notification_data->notification_hints); - zenity_notification_set_hints (notification, notification_hints); - g_hash_table_unref (notification_hints); - } - - /* Show icon and wait */ - error = NULL; - if (!notify_notification_show (notification, &error)) { - if (error != NULL) { - g_warning ("Error showing notification: %s", error->message); - g_error_free (error); - } - exit (1); - } + g_notification_set_default_action (notification, "app.default"); + + zenity_send_notification (notification); } if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, NULL); - gtk_main (); + + zenity_util_gapp_main (NULL); } } - -#endif diff --git a/src/option.c b/src/option.c index 61df34d..ee58af1 100644 --- a/src/option.c +++ b/src/option.c @@ -1,3 +1,5 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * option.h * @@ -22,32 +24,32 @@ * Lucas Rocha <lucasr@im.ufba.br> */ -#include "config.h" - #include "option.h" #include <stdlib.h> #include <string.h> #include <time.h> +#include <locale.h> +#include <langinfo.h> + +#include <config.h> /* General Options */ -static gchar *zenity_general_dialog_title; -static gchar *zenity_general_window_icon; +static char *zenity_general_dialog_title; static int zenity_general_width; static int zenity_general_height; -static gchar *zenity_general_dialog_text; -static gchar *zenity_general_dialog_icon; -static gchar *zenity_general_separator; +static char *zenity_general_dialog_text; +static char *zenity_general_icon; +static char *zenity_general_separator; static gboolean zenity_general_multiple; static gboolean zenity_general_editable; -static gchar *zenity_general_uri; +static char *zenity_general_uri; static gboolean zenity_general_dialog_no_wrap; static gboolean zenity_general_dialog_no_markup; -static gint zenity_general_timeout_delay; -static gchar *zenity_general_ok_button; -static gchar *zenity_general_cancel_button; -static gchar **zenity_general_extra_buttons; +static int zenity_general_timeout_delay; +static char *zenity_general_ok_button; +static char *zenity_general_cancel_button; +static char **zenity_general_extra_buttons; static gboolean zenity_general_modal; -static guintptr zenity_general_attach; static gboolean zenity_general_dialog_ellipsize; /* Calendar Dialog Options */ @@ -55,11 +57,11 @@ static gboolean zenity_calendar_active; static int zenity_calendar_day; static int zenity_calendar_month; static int zenity_calendar_year; -static gchar *zenity_calendar_date_format; +static char *zenity_calendar_date_format; /* Entry Dialog Options */ static gboolean zenity_entry_active; -static gchar *zenity_entry_entry_text; +static char *zenity_entry_entry_text; static gboolean zenity_entry_hide_text; /* Error Dialog Options */ @@ -72,26 +74,22 @@ static gboolean zenity_info_active; static gboolean zenity_file_active; static gboolean zenity_file_directory; static gboolean zenity_file_save; -static gboolean zenity_file_confirm_overwrite; -static gchar **zenity_file_filter; +static char **zenity_file_filter; /* List Dialog Options */ static gboolean zenity_list_active; -static gchar **zenity_list_columns; +static char **zenity_list_columns; static gboolean zenity_list_checklist; static gboolean zenity_list_radiolist; -static gchar *zenity_list_print_column; -static gchar *zenity_list_hide_column; +static char *zenity_list_print_column; +static char *zenity_list_hide_column; static gboolean zenity_list_hide_header; static gboolean zenity_list_imagelist; static gboolean zenity_list_mid_search; -#ifdef HAVE_LIBNOTIFY /* Notification Dialog Options */ static gboolean zenity_notification_active; static gboolean zenity_notification_listen; -static gchar **zenity_notification_hints; -#endif /* Progress Dialog Options */ static gboolean zenity_progress_active; @@ -109,14 +107,14 @@ static gboolean zenity_question_switch; /* Text Dialog Options */ static gboolean zenity_text_active; -static gchar *zenity_text_font; -static gchar *zenity_text_checkbox; +static char *zenity_text_font; +static char *zenity_text_checkbox; static gboolean zenity_text_auto_scroll; #ifdef HAVE_WEBKITGTK static gboolean zenity_text_enable_html; static gboolean zenity_text_no_interaction; -static gchar *zenity_text_url; +static char *zenity_text_url; #endif /* Warning Dialog Options */ @@ -124,16 +122,16 @@ static gboolean zenity_warning_active; /* Scale Dialog Options */ static gboolean zenity_scale_active; -static gint zenity_scale_value; -static gint zenity_scale_min_value; -static gint zenity_scale_max_value; -static gint zenity_scale_step; +static int zenity_scale_value; +static int zenity_scale_min_value; +static int zenity_scale_max_value; +static int zenity_scale_step; static gboolean zenity_scale_print_partial; static gboolean zenity_scale_hide_value; /* Color Selection Dialog Options */ static gboolean zenity_colorsel_active; -static gchar *zenity_colorsel_color; +static char *zenity_colorsel_color; static gboolean zenity_colorsel_show_palette; /* Password Dialog Options */ @@ -143,251 +141,265 @@ static gboolean zenity_password_show_username; /* Forms Dialog Options */ static gboolean zenity_forms_active; static gboolean zenity_forms_show_header; -static gchar *zenity_forms_date_format; -// static gchar *zenity_forms_hide_column; -static gchar **zenity_forms_list_values; -static gchar **zenity_forms_column_values; -static gchar **zenity_forms_combo_values; +static char *zenity_forms_date_format; +static char **zenity_forms_list_values; +static char **zenity_forms_column_values; +static char **zenity_forms_combo_values; /* Miscelaneus Options */ static gboolean zenity_misc_about; static gboolean zenity_misc_version; -static gboolean zenity_forms_callback (const gchar *option_name, - const gchar *value, gpointer data, GError **error); - -static GOptionEntry general_options[] = {{"title", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_general_dialog_title, - N_ ("Set the dialog title"), - N_ ("TITLE")}, - {"window-icon", - '\0', - 0, - G_OPTION_ARG_FILENAME, - &zenity_general_window_icon, - N_ ("Set the window icon"), - N_ ("ICONPATH")}, - {"width", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_general_width, - N_ ("Set the width"), - N_ ("WIDTH")}, - {"height", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_general_height, - N_ ("Set the height"), - N_ ("HEIGHT")}, - {"timeout", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_general_timeout_delay, - N_ ("Set dialog timeout in seconds"), - /* Timeout for closing the dialog */ - N_ ("TIMEOUT")}, - {"ok-label", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_ok_button, - N_ ("Set the label of the OK button"), - N_ ("TEXT")}, - {"cancel-label", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_cancel_button, - N_ ("Set the label of the Cancel button"), - N_ ("TEXT")}, - {"extra-button", - '\0', - 0, - G_OPTION_ARG_STRING_ARRAY, - &zenity_general_extra_buttons, - N_ ("Add an extra button"), - N_ ("TEXT")}, - {"modal", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_modal, - N_ ("Set the modal hint"), - NULL}, - {"attach", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_INT, - &zenity_general_attach, - N_ ("Set the parent window to attach to"), - N_ ("WINDOW")}, - {NULL}}; +/* DEPRECATED Options */ -static GOptionEntry calendar_options[] = {{"calendar", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_calendar_active, - N_ ("Display calendar dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"day", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_calendar_day, - N_ ("Set the calendar day"), - N_ ("DAY")}, - {"month", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_calendar_month, - N_ ("Set the calendar month"), - N_ ("MONTH")}, - {"year", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_calendar_year, - N_ ("Set the calendar year"), - N_ ("YEAR")}, - {"date-format", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_calendar_date_format, - N_ ("Set the format for the returned date"), - N_ ("PATTERN")}, - {NULL}}; +static char *zenity_general_icon_DEPRECATED; -static GOptionEntry entry_options[] = {{"entry", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_entry_active, - N_ ("Display text entry dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"entry-text", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_entry_entry_text, - N_ ("Set the entry text"), - N_ ("TEXT")}, - {"hide-text", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_entry_hide_text, - N_ ("Hide the entry text"), - NULL}, - {NULL}}; +static gboolean zenity_forms_callback (const char *option_name, + const char *value, gpointer data, GError **error); -static GOptionEntry error_options[] = {{"error", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_error_active, - N_ ("Display error dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"icon-name", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_icon, - N_ ("Set the dialog icon"), - N_ ("ICON-NAME")}, - {"no-wrap", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_wrap, - N_ ("Do not enable text wrapping"), - NULL}, - {"no-markup", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_markup, - N_ ("Do not enable Pango markup")}, - {"ellipsize", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_ellipsize, - N_ ("Enable ellipsizing in the dialog text. This fixes the high window " - "size with long texts")}, - {NULL}}; +static GOptionEntry general_options[] = + {{"title", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_title, + N_ ("Set the dialog title"), + N_ ("TITLE")}, + {"width", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_general_width, + N_ ("Set the width"), + N_ ("WIDTH")}, + {"height", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_general_height, + N_ ("Set the height"), + N_ ("HEIGHT")}, + {"timeout", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_general_timeout_delay, + N_ ("Set dialog timeout in seconds"), + /* Timeout for closing the dialog */ + N_ ("TIMEOUT")}, + {"ok-label", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_ok_button, + N_ ("Set the label of the OK button"), + N_ ("TEXT")}, + {"cancel-label", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_cancel_button, + N_ ("Set the label of the Cancel button"), + N_ ("TEXT")}, + {"extra-button", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_general_extra_buttons, + N_ ("Add an extra button"), + N_ ("TEXT")}, + {"modal", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_modal, + N_ ("Set the modal hint"), + NULL}, + {NULL}}; -static GOptionEntry info_options[] = {{"info", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_info_active, - N_ ("Display info dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"icon-name", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_icon, - N_ ("Set the dialog icon"), - N_ ("ICON-NAME")}, - {"no-wrap", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_wrap, - N_ ("Do not enable text wrapping"), - NULL}, - {"no-markup", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_markup, - N_ ("Do not enable Pango markup")}, - {"ellipsize", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_ellipsize, - N_ ("Enable ellipsizing in the dialog text. This fixes the high window " - "size with long texts")}, - {NULL}}; +static GOptionEntry calendar_options[] = + {{"calendar", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_calendar_active, + N_ ("Display calendar dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"day", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_calendar_day, + N_ ("Set the calendar day"), + N_ ("DAY")}, + {"month", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_calendar_month, + N_ ("Set the calendar month"), + N_ ("MONTH")}, + {"year", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_calendar_year, + N_ ("Set the calendar year"), + N_ ("YEAR")}, + {"date-format", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_calendar_date_format, + N_ ("Set the format for the returned date"), + N_ ("PATTERN")}, + {NULL}}; + +static GOptionEntry entry_options[] = + {{"entry", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_entry_active, + N_ ("Display text entry dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"entry-text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_entry_entry_text, + N_ ("Set the entry text"), + N_ ("TEXT")}, + {"hide-text", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_entry_hide_text, + N_ ("Hide the entry text"), + NULL}, + {NULL}}; + +static GOptionEntry error_options[] = + {{"error", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_error_active, + N_ ("Display error dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"icon", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_icon, + N_ ("Set the icon name"), + N_ ("ICON-NAME")}, + {"window-icon", + '\0', + G_OPTION_FLAG_HIDDEN, + G_OPTION_ARG_STRING, + &zenity_general_icon_DEPRECATED, + N_ ("DEPRECATED; use `--icon`"), + N_ ("ICON-NAME")}, + {"no-wrap", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_wrap, + N_ ("Do not enable text wrapping"), + NULL}, + {"no-markup", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_markup, + N_ ("Do not enable Pango markup"), + NULL}, + {"ellipsize", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_ellipsize, + N_ ("Enable ellipsizing in the dialog text. " + "This fixes the high window " + "size with long texts"), + NULL}, + {NULL}}; + +static GOptionEntry info_options[] = + {{"info", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_info_active, + N_ ("Display info dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"icon", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_icon, + N_ ("Set the icon name"), + N_ ("ICON-NAME")}, + {"window-icon", + '\0', + G_OPTION_FLAG_HIDDEN, + G_OPTION_ARG_STRING, + &zenity_general_icon_DEPRECATED, + N_ ("DEPRECATED; use `--icon`"), + N_ ("ICON-NAME")}, + {"no-wrap", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_wrap, + N_ ("Do not enable text wrapping"), + NULL}, + {"no-markup", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_markup, + N_ ("Do not enable Pango markup"), + NULL}, + {"ellipsize", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_ellipsize, + N_ ("Enable ellipsizing in the dialog text. " + "This fixes the high window " + "size with long texts"), + NULL}, + {NULL}}; static GOptionEntry file_selection_options[] = {{"file-selection", @@ -432,15 +444,7 @@ static GOptionEntry file_selection_options[] = &zenity_general_separator, N_ ("Set output separator character"), N_ ("SEPARATOR")}, - {"confirm-overwrite", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_file_confirm_overwrite, - N_ ("Confirm file selection if filename already exists"), - NULL}, - { - "file-filter", + {"file-filter", '\0', 0, G_OPTION_ARG_STRING_ARRAY, @@ -452,255 +456,272 @@ static GOptionEntry file_selection_options[] = }, {NULL}}; -static GOptionEntry list_options[] = {{"list", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_list_active, - N_ ("Display list dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"column", - '\0', - 0, - G_OPTION_ARG_STRING_ARRAY, - &zenity_list_columns, - N_ ("Set the column header"), - N_ ("COLUMN")}, - {"checklist", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_list_checklist, - N_ ("Use check boxes for the first column"), - NULL}, - {"radiolist", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_list_radiolist, - N_ ("Use radio buttons for the first column"), - NULL}, - {"imagelist", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_list_imagelist, - N_ ("Use an image for the first column"), - NULL}, - {"separator", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_separator, - N_ ("Set output separator character"), - N_ ("SEPARATOR")}, - {"multiple", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_multiple, - N_ ("Allow multiple rows to be selected"), - NULL}, - {"editable", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_editable, - N_ ("Allow changes to text"), - NULL}, - {"print-column", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_list_print_column, - N_ ("Print a specific column (Default is 1. 'ALL' can be used to print " - "all columns)"), - /* Column index number to print out on a list dialog */ - N_ ("NUMBER")}, - {"hide-column", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_list_hide_column, - N_ ("Hide a specific column"), - N_ ("NUMBER")}, - {"hide-header", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_list_hide_header, - N_ ("Hide the column headers"), - NULL}, - {"mid-search", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_list_mid_search, - N_ ("Change list default search function searching for text in the " - "middle, not on the beginning"), - NULL}, - {NULL}}; - -#ifdef HAVE_LIBNOTIFY -static GOptionEntry notification_options[] = {{"notification", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_notification_active, - N_ ("Display notification"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the notification text"), - N_ ("TEXT")}, - {"listen", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_notification_listen, - N_ ("Listen for commands on stdin"), - NULL}, - {"hint", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING_ARRAY, - &zenity_notification_hints, - N_ ("Set the notification hints"), - N_ ("TEXT")}, - {NULL}}; - -#endif +static GOptionEntry list_options[] = + {{"list", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_list_active, + N_ ("Display list dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"column", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_list_columns, + N_ ("Set the column header"), + N_ ("COLUMN")}, + {"checklist", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_list_checklist, + N_ ("Use check boxes for the first column"), + NULL}, + {"radiolist", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_list_radiolist, + N_ ("Use radio buttons for the first column"), + NULL}, + {"imagelist", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_list_imagelist, + N_ ("Use an image for the first column"), + NULL}, + {"separator", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_separator, + N_ ("Set output separator character"), + N_ ("SEPARATOR")}, + {"multiple", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_multiple, + N_ ("Allow multiple rows to be selected"), + NULL}, + {"editable", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_editable, + N_ ("Allow changes to text"), + NULL}, + {"print-column", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_list_print_column, + N_ ("Print a specific column (Default is 1. " + "'ALL' can be used to print all columns)"), + /* Column index number to print out on a list dialog */ + N_ ("NUMBER")}, + {"hide-column", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_list_hide_column, + N_ ("Hide a specific column"), + N_ ("NUMBER")}, + {"hide-header", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_list_hide_header, + N_ ("Hide the column headers"), + NULL}, + {"mid-search", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_list_mid_search, + N_ ("Change list default search function searching for text in the " + "middle, not on the beginning"), + NULL}, + {NULL}}; -static GOptionEntry progress_options[] = { - {"progress", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_progress_active, - N_ ("Display progress indication dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"percentage", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_progress_percentage, - N_ ("Set initial percentage"), - N_ ("PERCENTAGE")}, - {"pulsate", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_progress_pulsate, - N_ ("Pulsate progress bar"), - NULL}, - {"auto-close", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_progress_auto_close, - /* xgettext: no-c-format */ - N_ ("Dismiss the dialog when 100% has been reached"), - NULL}, - {"auto-kill", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_progress_auto_kill, - N_ ("Kill parent process if Cancel button is pressed"), - NULL}, - {"no-cancel", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_progress_no_cancel, - N_ ("Hide Cancel button"), - NULL}, - {"time-remaining", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_progress_time_remaining, - /* xgettext: no-c-format */ - N_ ("Estimate when progress will reach 100%"), - NULL}, - {NULL}}; +static GOptionEntry notification_options[] = + {{"notification", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_notification_active, + N_ ("Display notification"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the notification text"), + N_ ("TEXT")}, + {"icon", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_icon, + N_ ("Set the icon name"), + N_ ("ICON-NAME")}, + {"window-icon", + '\0', + G_OPTION_FLAG_HIDDEN, + G_OPTION_ARG_STRING, + &zenity_general_icon_DEPRECATED, + N_ ("DEPRECATED; use `--icon`"), + N_ ("ICON-NAME")}, + {"listen", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_notification_listen, + N_ ("Listen for commands on stdin"), + NULL}, + {NULL}}; -static GOptionEntry question_options[] = {{"question", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_question_active, - N_ ("Display question dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"icon-name", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_icon, - N_ ("Set the dialog icon"), - N_ ("ICON-NAME")}, - {"no-wrap", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_wrap, - N_ ("Do not enable text wrapping"), - NULL}, - {"no-markup", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_markup, - N_ ("Do not enable Pango markup")}, - {"default-cancel", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_question_default_cancel, - N_ ("Give Cancel button focus by default"), - NULL}, - {"ellipsize", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_ellipsize, - N_ ("Enable ellipsizing in the dialog text. This fixes the high window " - "size with long texts")}, - {"switch", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_question_switch, - N_ ("Suppress OK and Cancel buttons"), - NULL}, - {NULL}}; +static GOptionEntry progress_options[] = + {{"progress", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_progress_active, + N_ ("Display progress indication dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"percentage", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_progress_percentage, + N_ ("Set initial percentage"), + N_ ("PERCENTAGE")}, + {"pulsate", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_progress_pulsate, + N_ ("Pulsate progress bar"), + NULL}, + {"auto-close", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_progress_auto_close, + /* xgettext: no-c-format */ + N_ ("Dismiss the dialog when 100% has been reached"), + NULL}, + {"auto-kill", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_progress_auto_kill, + N_ ("Kill parent process if Cancel button is pressed"), + NULL}, + {"no-cancel", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_progress_no_cancel, + N_ ("Hide Cancel button"), + NULL}, + {"time-remaining", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_progress_time_remaining, + /* xgettext: no-c-format */ + N_ ("Estimate when progress will reach 100%"), + NULL}, + {NULL}}; -static GOptionEntry text_options[] = { - {"text-info", +static GOptionEntry question_options[] = + {{"question", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_question_active, + N_ ("Display question dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"icon", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_icon, + N_ ("Set the icon name"), + N_ ("ICON-NAME")}, + {"window-icon", + '\0', + G_OPTION_FLAG_HIDDEN, + G_OPTION_ARG_STRING, + &zenity_general_icon_DEPRECATED, + N_ ("DEPRECATED; use `--icon`"), + N_ ("ICON-NAME")}, + {"no-wrap", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_wrap, + N_ ("Do not enable text wrapping"), + NULL}, + {"no-markup", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_markup, + N_ ("Do not enable Pango markup"), + NULL}, + {"default-cancel", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_question_default_cancel, + N_ ("Give Cancel button focus by default"), + NULL}, + {"ellipsize", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_ellipsize, + N_ ("Enable ellipsizing in the dialog text. " + "This fixes the high window " + "size with long texts"), + NULL}, + {"switch", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_question_switch, + N_ ("Suppress OK and Cancel buttons"), + NULL}, + {NULL}}; + +static GOptionEntry text_options[] = + {{"text-info", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, @@ -770,212 +791,225 @@ static GOptionEntry text_options[] = { NULL}, {NULL}}; -static GOptionEntry warning_options[] = {{"warning", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_warning_active, - N_ ("Display warning dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"icon-name", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_icon, - N_ ("Set the dialog icon"), - N_ ("ICON-NAME")}, - {"no-wrap", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_wrap, - N_ ("Do not enable text wrapping"), - NULL}, - {"no-markup", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_no_markup, - N_ ("Do not enable Pango markup")}, - {"ellipsize", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_NONE, - &zenity_general_dialog_ellipsize, - N_ ("Enable ellipsizing in the dialog text. This fixes the high window " - "size with long texts")}, - {NULL}}; - -static GOptionEntry scale_options[] = {{"scale", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_scale_active, - N_ ("Display scale dialog"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"value", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_scale_value, - N_ ("Set initial value"), - N_ ("VALUE")}, - {"min-value", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_scale_min_value, - N_ ("Set minimum value"), - N_ ("VALUE")}, - {"max-value", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_scale_max_value, - N_ ("Set maximum value"), - N_ ("VALUE")}, - {"step", - '\0', - 0, - G_OPTION_ARG_INT, - &zenity_scale_step, - N_ ("Set step size"), - N_ ("VALUE")}, - {"print-partial", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_scale_print_partial, - N_ ("Print partial values"), - NULL}, - {"hide-value", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_scale_hide_value, - N_ ("Hide value"), - NULL}, - {NULL}}; +static GOptionEntry warning_options[] = + {{"warning", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_warning_active, + N_ ("Display warning dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"icon", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_icon, + N_ ("Set the icon name"), + N_ ("ICON-NAME")}, + {"window-icon", + '\0', + G_OPTION_FLAG_HIDDEN, + G_OPTION_ARG_STRING, + &zenity_general_icon_DEPRECATED, + N_ ("DEPRECATED; use `--icon`"), + N_ ("ICON-NAME")}, + {"no-wrap", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_wrap, + N_ ("Do not enable text wrapping"), + NULL}, + {"no-markup", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_no_markup, + N_ ("Do not enable Pango markup"), + NULL}, + {"ellipsize", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_dialog_ellipsize, + N_ ("Enable ellipsizing in the dialog text. " + "This fixes the high window " + "size with long texts"), + NULL}, + {NULL}}; + +static GOptionEntry scale_options[] = + {{"scale", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_scale_active, + N_ ("Display scale dialog"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"value", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_scale_value, + N_ ("Set initial value"), + N_ ("VALUE")}, + {"min-value", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_scale_min_value, + N_ ("Set minimum value"), + N_ ("VALUE")}, + {"max-value", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_scale_max_value, + N_ ("Set maximum value"), + N_ ("VALUE")}, + {"step", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_scale_step, + N_ ("Set step size"), + N_ ("VALUE")}, + {"print-partial", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_scale_print_partial, + N_ ("Print partial values"), + NULL}, + {"hide-value", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_scale_hide_value, + N_ ("Hide value"), + NULL}, + {NULL}}; -static GOptionEntry forms_dialog_options[] = {{"forms", - '\0', - G_OPTION_FLAG_IN_MAIN, - G_OPTION_ARG_NONE, - &zenity_forms_active, - N_ ("Display forms dialog"), - NULL}, - {"add-entry", - '\0', - 0, - G_OPTION_ARG_CALLBACK, - zenity_forms_callback, - N_ ("Add a new Entry in forms dialog"), - N_ ("Field name")}, - {"add-password", - '\0', - 0, - G_OPTION_ARG_CALLBACK, - zenity_forms_callback, - N_ ("Add a new Password Entry in forms dialog"), - N_ ("Field name")}, - {"add-calendar", - '\0', - 0, - G_OPTION_ARG_CALLBACK, - zenity_forms_callback, - N_ ("Add a new Calendar in forms dialog"), - N_ ("Calendar field name")}, - {"add-list", - '\0', - 0, - G_OPTION_ARG_CALLBACK, - zenity_forms_callback, - N_ ("Add a new List in forms dialog"), - N_ ("List field and header name")}, - {"list-values", - '\0', - 0, - G_OPTION_ARG_STRING_ARRAY, - &zenity_forms_list_values, - N_ ("List of values for List"), - N_ ("List of values separated by |")}, - {"column-values", - '\0', - 0, - G_OPTION_ARG_STRING_ARRAY, - &zenity_forms_column_values, - N_ ("List of values for columns"), - N_ ("List of values separated by |")}, - {"add-combo", - '\0', - 0, - G_OPTION_ARG_CALLBACK, - zenity_forms_callback, - N_ ("Add a new combo box in forms dialog"), - N_ ("Combo box field name")}, - {"combo-values", - '\0', - 0, - G_OPTION_ARG_STRING_ARRAY, - &zenity_forms_combo_values, - N_ ("List of values for combo box"), - N_ ("List of values separated by |")}, - /* TODO: Implement how to hide specifc column - { - "hide-column", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_forms_hide_column, - N_("Hide a specific column"), - N_("NUMBER") - },*/ - {"show-header", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_forms_show_header, - N_ ("Show the columns header"), - NULL}, - {"text", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_dialog_text, - N_ ("Set the dialog text"), - N_ ("TEXT")}, - {"separator", - '\0', - G_OPTION_FLAG_NOALIAS, - G_OPTION_ARG_STRING, - &zenity_general_separator, - N_ ("Set output separator character"), - N_ ("SEPARATOR")}, - {"date-format", - '\0', - 0, - G_OPTION_ARG_STRING, - &zenity_forms_date_format, - N_ ("Set the format for the returned date"), - N_ ("PATTERN")}, - {NULL}}; +static GOptionEntry forms_dialog_options[] = + {{"forms", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_forms_active, + N_ ("Display forms dialog"), + NULL}, + {"add-entry", + '\0', + 0, + G_OPTION_ARG_CALLBACK, + zenity_forms_callback, + N_ ("Add a new Entry in forms dialog"), + N_ ("Field name")}, + {"add-password", + '\0', + 0, + G_OPTION_ARG_CALLBACK, + zenity_forms_callback, + N_ ("Add a new Password Entry in forms dialog"), + N_ ("Field name")}, + {"add-calendar", + '\0', + 0, + G_OPTION_ARG_CALLBACK, + zenity_forms_callback, + N_ ("Add a new Calendar in forms dialog"), + N_ ("Calendar field name")}, + {"add-list", + '\0', + 0, + G_OPTION_ARG_CALLBACK, + zenity_forms_callback, + N_ ("Add a new List in forms dialog"), + N_ ("List field and header name")}, + {"list-values", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_forms_list_values, + N_ ("List of values for List"), + N_ ("List of values separated by |")}, + {"column-values", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_forms_column_values, + N_ ("List of values for columns"), + N_ ("List of values separated by |")}, + {"add-combo", + '\0', + 0, + G_OPTION_ARG_CALLBACK, + zenity_forms_callback, + N_ ("Add a new combo box in forms dialog"), + N_ ("Combo box field name")}, + {"combo-values", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_forms_combo_values, + N_ ("List of values for combo box"), + N_ ("List of values separated by |")}, + /* TODO: Implement how to hide specifc column + { + "hide-column", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_forms_hide_column, + N_("Hide a specific column"), + N_("NUMBER") + },*/ + {"show-header", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_forms_show_header, + N_ ("Show the columns header"), + NULL}, + {"text", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_ ("Set the dialog text"), + N_ ("TEXT")}, + {"separator", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_general_separator, + N_ ("Set output separator character"), + N_ ("SEPARATOR")}, + {"date-format", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_forms_date_format, + N_ ("Set the format for the returned date"), + N_ ("PATTERN")}, + {NULL}}; -static GOptionEntry password_dialog_options[] = { - {"password", +static GOptionEntry password_dialog_options[] = + {{"password", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, @@ -991,8 +1025,8 @@ static GOptionEntry password_dialog_options[] = { NULL}, {NULL}}; -static GOptionEntry color_selection_options[] = { - {"color-selection", +static GOptionEntry color_selection_options[] = + {{"color-selection", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, @@ -1015,28 +1049,29 @@ static GOptionEntry color_selection_options[] = { NULL}, {NULL}}; -static GOptionEntry miscellaneous_options[] = {{"about", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_misc_about, - N_ ("About zenity"), - NULL}, - {"version", - '\0', - 0, - G_OPTION_ARG_NONE, - &zenity_misc_version, - N_ ("Print version"), - NULL}, - {NULL}}; +static GOptionEntry miscellaneous_options[] = + {{"about", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_misc_about, + N_ ("About zenity"), + NULL}, + {"version", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_misc_version, + N_ ("Print version"), + NULL}, + {NULL}}; static ZenityParsingOptions *results; static GOptionContext *ctx; static void -zenity_option_init (void) { - +zenity_option_init (void) +{ results = g_new0 (ZenityParsingOptions, 1); /* Initialize the various dialog structures */ @@ -1050,77 +1085,17 @@ zenity_option_init (void) { results->progress_data = g_new0 (ZenityProgressData, 1); results->text_data = g_new0 (ZenityTextData, 1); results->tree_data = g_new0 (ZenityTreeData, 1); -#ifdef HAVE_LIBNOTIFY results->notification_data = g_new0 (ZenityNotificationData, 1); -#endif results->color_data = g_new0 (ZenityColorData, 1); results->password_data = g_new0 (ZenityPasswordData, 1); results->forms_data = g_new0 (ZenityFormsData, 1); } -void -zenity_option_free (void) { - if (zenity_general_dialog_title) - g_free (zenity_general_dialog_title); - if (zenity_general_window_icon) - g_free (zenity_general_window_icon); - if (zenity_general_dialog_text) - g_free (zenity_general_dialog_text); - if (zenity_general_uri) - g_free (zenity_general_uri); - g_free (zenity_general_separator); - if (zenity_general_ok_button) - g_free (zenity_general_ok_button); - if (zenity_general_cancel_button) - g_free (zenity_general_cancel_button); - if (zenity_general_extra_buttons) - g_strfreev (zenity_general_extra_buttons); - - if (zenity_calendar_date_format) - g_free (zenity_calendar_date_format); - - if (zenity_forms_date_format) - g_free (zenity_forms_date_format); - if (zenity_forms_list_values) - g_strfreev (zenity_forms_list_values); - if (zenity_forms_combo_values) - g_strfreev (zenity_forms_combo_values); - if (zenity_forms_column_values) - g_strfreev (zenity_forms_column_values); - // if (zenity_forms_hide_column) - // g_free (zenity_forms_hide_column); - if (zenity_entry_entry_text) - g_free (zenity_entry_entry_text); - - if (zenity_file_filter) - g_strfreev (zenity_file_filter); - - if (zenity_list_columns) - g_strfreev (zenity_list_columns); - if (zenity_list_print_column) - g_free (zenity_list_print_column); - if (zenity_list_hide_column) - g_free (zenity_list_hide_column); - -#ifdef HAVE_LIBNOTIFY - if (zenity_notification_hints) - g_strfreev (zenity_notification_hints); -#endif - - if (zenity_text_font) - g_free (zenity_text_font); - if (zenity_text_checkbox) - g_free (zenity_text_checkbox); - - if (zenity_colorsel_color) - g_free (zenity_colorsel_color); - - g_option_context_free (ctx); -} - static void -zenity_option_set_dialog_mode (gboolean is_active, ZenityDialogMode mode) { - if (is_active == TRUE) { +zenity_option_set_dialog_mode (gboolean is_active, ZenityDialogMode mode) +{ + if (is_active == TRUE) + { if (results->mode == MODE_LAST) results->mode = mode; else @@ -1128,21 +1103,22 @@ zenity_option_set_dialog_mode (gboolean is_active, ZenityDialogMode mode) { } } -static gchar * -zenity_option_get_name (GOptionEntry *entries, gpointer arg_data) { - int i; - - for (i = 1; entries[i].long_name != NULL; i++) { +static char * +zenity_option_get_name (GOptionEntry *entries, gpointer arg_data) +{ + for (int i = 1; entries[i].long_name != NULL; i++) + { if (entries[i].arg_data == arg_data) - return (gchar *) entries[i].long_name; + return (char *)entries[i].long_name; } return NULL; } /* Forms callback */ static gboolean -zenity_forms_callback (const gchar *option_name, const gchar *value, - gpointer data, GError **error) { +zenity_forms_callback (const char *option_name, const char *value, + gpointer data, GError **error) +{ ZenityFormsValue *forms_value = g_new0 (ZenityFormsValue, 1); forms_value->option_value = g_strdup (value); @@ -1167,7 +1143,8 @@ zenity_forms_callback (const gchar *option_name, const gchar *value, /* Error callback */ static void zenity_option_error_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_error (NULL, ERROR_SYNTAX); } @@ -1175,9 +1152,9 @@ zenity_option_error_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_general_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_general_dialog_title = NULL; - zenity_general_window_icon = NULL; zenity_general_width = -1; zenity_general_height = -1; zenity_general_dialog_text = NULL; @@ -1192,14 +1169,14 @@ zenity_general_pre_callback (GOptionContext *context, GOptionGroup *group, zenity_general_dialog_no_markup = FALSE; zenity_general_timeout_delay = -1; zenity_general_modal = FALSE; - zenity_general_attach = 0; return TRUE; } static gboolean zenity_calendar_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_calendar_active = FALSE; zenity_calendar_date_format = NULL; zenity_calendar_day = -1; @@ -1211,7 +1188,8 @@ zenity_calendar_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_entry_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_entry_active = FALSE; zenity_entry_entry_text = NULL; zenity_entry_hide_text = FALSE; @@ -1221,7 +1199,8 @@ zenity_entry_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_error_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_error_active = FALSE; return TRUE; @@ -1229,7 +1208,8 @@ zenity_error_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_info_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_info_active = FALSE; return TRUE; @@ -1237,11 +1217,11 @@ zenity_info_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_file_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_file_active = FALSE; zenity_file_directory = FALSE; zenity_file_save = FALSE; - zenity_file_confirm_overwrite = FALSE; zenity_file_filter = NULL; return TRUE; @@ -1249,7 +1229,8 @@ zenity_file_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_list_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_list_active = FALSE; zenity_list_columns = NULL; zenity_list_checklist = FALSE; @@ -1263,20 +1244,20 @@ zenity_list_pre_callback (GOptionContext *context, GOptionGroup *group, return TRUE; } -#ifdef HAVE_LIBNOTIFY static gboolean zenity_notification_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_notification_active = FALSE; zenity_notification_listen = FALSE; return TRUE; } -#endif static gboolean zenity_progress_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_progress_active = FALSE; zenity_progress_percentage = 0; zenity_progress_pulsate = FALSE; @@ -1284,21 +1265,25 @@ zenity_progress_pre_callback (GOptionContext *context, GOptionGroup *group, zenity_progress_auto_kill = FALSE; zenity_progress_no_cancel = FALSE; zenity_progress_time_remaining = FALSE; + return TRUE; } static gboolean zenity_question_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_question_active = FALSE; zenity_question_default_cancel = FALSE; zenity_question_switch = FALSE; + return TRUE; } static gboolean zenity_text_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_text_active = FALSE; zenity_text_font = NULL; zenity_text_checkbox = NULL; @@ -1308,12 +1293,14 @@ zenity_text_pre_callback (GOptionContext *context, GOptionGroup *group, zenity_text_no_interaction = FALSE; zenity_text_url = NULL; #endif + return TRUE; } static gboolean zenity_warning_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_warning_active = FALSE; return TRUE; @@ -1321,7 +1308,8 @@ zenity_warning_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_scale_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_scale_active = FALSE; zenity_scale_value = 0; zenity_scale_min_value = 0; @@ -1335,7 +1323,8 @@ zenity_scale_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_color_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_colorsel_active = FALSE; zenity_colorsel_color = NULL; zenity_colorsel_show_palette = FALSE; @@ -1345,7 +1334,8 @@ zenity_color_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_password_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_password_active = FALSE; zenity_password_show_username = FALSE; @@ -1354,17 +1344,19 @@ zenity_password_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_forms_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_forms_active = FALSE; zenity_forms_show_header = FALSE; zenity_forms_date_format = NULL; - // zenity_forms_hide_column = NULL; + return TRUE; } static gboolean zenity_misc_pre_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_misc_about = FALSE; zenity_misc_version = FALSE; @@ -1376,9 +1368,9 @@ zenity_misc_pre_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_general_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ results->data->dialog_title = zenity_general_dialog_title; - results->data->window_icon = zenity_general_window_icon; results->data->width = zenity_general_width; results->data->height = zenity_general_height; results->data->timeout_delay = zenity_general_timeout_delay; @@ -1386,17 +1378,18 @@ zenity_general_post_callback (GOptionContext *context, GOptionGroup *group, results->data->cancel_label = zenity_general_cancel_button; results->data->extra_label = zenity_general_extra_buttons; results->data->modal = zenity_general_modal; - results->data->attach = zenity_general_attach; return TRUE; } static gboolean zenity_calendar_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_calendar_active, MODE_CALENDAR); - if (results->mode == MODE_CALENDAR) { + if (results->mode == MODE_CALENDAR) + { struct tm *t; time_t current_time; @@ -1415,73 +1408,98 @@ zenity_calendar_post_callback (GOptionContext *context, GOptionGroup *group, results->calendar_data->month = zenity_calendar_month; results->calendar_data->year = zenity_calendar_year; - if (zenity_calendar_date_format) + if (zenity_calendar_date_format) { results->calendar_data->date_format = zenity_calendar_date_format; - else + } else { results->calendar_data->date_format = g_locale_to_utf8 (nl_langinfo (D_FMT), -1, NULL, NULL, NULL); - - } else { - if (zenity_calendar_day > -1) - zenity_option_error ( - zenity_option_get_name (calendar_options, &zenity_calendar_day), + } + } + else + { + if (zenity_calendar_day > -1) { + zenity_option_error (zenity_option_get_name (calendar_options, + &zenity_calendar_day), ERROR_SUPPORT); + } - if (zenity_calendar_month > -1) - zenity_option_error (zenity_option_get_name ( - calendar_options, &zenity_calendar_month), + if (zenity_calendar_month > -1) { + zenity_option_error (zenity_option_get_name (calendar_options, + &zenity_calendar_month), ERROR_SUPPORT); + } - if (zenity_calendar_year > -1) - zenity_option_error (zenity_option_get_name ( - calendar_options, &zenity_calendar_year), + if (zenity_calendar_year > -1) { + zenity_option_error (zenity_option_get_name (calendar_options, + &zenity_calendar_year), ERROR_SUPPORT); + } - if (zenity_calendar_date_format) + if (zenity_calendar_date_format) { zenity_option_error (zenity_option_get_name (calendar_options, - &zenity_calendar_date_format), + &zenity_calendar_date_format), ERROR_SUPPORT); + } } - return TRUE; } static gboolean zenity_entry_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_entry_active, MODE_ENTRY); - if (results->mode == MODE_ENTRY) { + if (results->mode == MODE_ENTRY) + { results->entry_data->dialog_text = zenity_general_dialog_text; results->entry_data->entry_text = zenity_entry_entry_text; results->entry_data->hide_text = zenity_entry_hide_text; - } else { - if (zenity_entry_entry_text) - zenity_option_error (zenity_option_get_name ( - entry_options, &zenity_entry_entry_text), + } + else + { + if (zenity_entry_entry_text) { + zenity_option_error (zenity_option_get_name (entry_options, + &zenity_entry_entry_text), ERROR_SUPPORT); + } - if (zenity_entry_hide_text) - zenity_option_error ( - zenity_option_get_name (entry_options, &zenity_entry_hide_text), + if (zenity_entry_hide_text) { + zenity_option_error (zenity_option_get_name (entry_options, + &zenity_entry_hide_text), ERROR_SUPPORT); + } } - return TRUE; } +static void +show_window_icon_deprecation_warning (void) +{ + g_printerr ("Warning: --window-icon is deprecated and will be removed in a " + "future version of zenity. Please use --icon instead.\n"); +} + static gboolean zenity_error_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_error_active, MODE_ERROR); - if (results->mode == MODE_ERROR) { + if (results->mode == MODE_ERROR) + { results->msg_data->dialog_text = zenity_general_dialog_text; - results->msg_data->dialog_icon = zenity_general_dialog_icon; + results->msg_data->dialog_icon = zenity_general_icon; results->msg_data->mode = ZENITY_MSG_ERROR; results->msg_data->no_wrap = zenity_general_dialog_no_wrap; results->msg_data->no_markup = zenity_general_dialog_no_markup; results->msg_data->ellipsize = zenity_general_dialog_ellipsize; + + if (zenity_general_icon_DEPRECATED) + { + results->msg_data->dialog_icon = zenity_general_icon_DEPRECATED; + show_window_icon_deprecation_warning (); + } } return TRUE; @@ -1489,16 +1507,24 @@ zenity_error_post_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_info_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_info_active, MODE_INFO); - if (results->mode == MODE_INFO) { + if (results->mode == MODE_INFO) + { results->msg_data->dialog_text = zenity_general_dialog_text; - results->msg_data->dialog_icon = zenity_general_dialog_icon; + results->msg_data->dialog_icon = zenity_general_icon; results->msg_data->mode = ZENITY_MSG_INFO; results->msg_data->no_wrap = zenity_general_dialog_no_wrap; results->msg_data->no_markup = zenity_general_dialog_no_markup; results->msg_data->ellipsize = zenity_general_dialog_ellipsize; + + if (zenity_general_icon_DEPRECATED) + { + results->msg_data->dialog_icon = zenity_general_icon_DEPRECATED; + show_window_icon_deprecation_warning (); + } } return TRUE; @@ -1506,51 +1532,61 @@ zenity_info_post_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_file_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_file_active, MODE_FILE); - if (results->mode == MODE_FILE) { + if (results->mode == MODE_FILE) + { results->file_data->uri = zenity_general_uri; results->file_data->multi = zenity_general_multiple; results->file_data->directory = zenity_file_directory; results->file_data->save = zenity_file_save; - results->file_data->confirm_overwrite = zenity_file_confirm_overwrite; results->file_data->separator = zenity_general_separator; results->file_data->filter = zenity_file_filter; - } else { - if (zenity_file_directory) + } + else + { + if (zenity_file_directory) { zenity_option_error (zenity_option_get_name (file_selection_options, - &zenity_file_directory), + &zenity_file_directory), ERROR_SUPPORT); + } - if (zenity_file_save) - zenity_option_error (zenity_option_get_name ( - file_selection_options, &zenity_file_save), + if (zenity_file_save) { + zenity_option_error (zenity_option_get_name (file_selection_options, + &zenity_file_save), ERROR_SUPPORT); + } - if (zenity_file_filter) + if (zenity_file_filter) { zenity_option_error (zenity_option_get_name (file_selection_options, - &zenity_file_filter), + &zenity_file_filter), ERROR_SUPPORT); + } } - return TRUE; } static gboolean zenity_list_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ int i = 0; - gchar *column; + char *column; zenity_option_set_dialog_mode (zenity_list_active, MODE_LIST); - if (results->mode == MODE_LIST) { + if (results->mode == MODE_LIST) + { results->tree_data->dialog_text = zenity_general_dialog_text; - if (zenity_list_columns) { + if (zenity_list_columns) + { column = zenity_list_columns[0]; - while (column != NULL) { + + while (column != NULL) + { results->tree_data->columns = g_slist_append (results->tree_data->columns, column); column = zenity_list_columns[++i]; @@ -1567,7 +1603,9 @@ zenity_list_post_callback (GOptionContext *context, GOptionGroup *group, results->tree_data->hide_header = zenity_list_hide_header; results->tree_data->separator = zenity_general_separator; results->tree_data->mid_search = zenity_list_mid_search; - } else { + } + else + { if (zenity_list_columns) zenity_option_error ( zenity_option_get_name (list_options, &zenity_list_columns), @@ -1607,39 +1645,47 @@ zenity_list_post_callback (GOptionContext *context, GOptionGroup *group, zenity_option_get_name (list_options, &zenity_list_mid_search), ERROR_SUPPORT); } - return TRUE; } -#ifdef HAVE_LIBNOTIFY static gboolean zenity_notification_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { - zenity_option_set_dialog_mode ( - zenity_notification_active, MODE_NOTIFICATION); + gpointer data, GError **error) +{ + zenity_option_set_dialog_mode (zenity_notification_active, + MODE_NOTIFICATION); - if (results->mode == MODE_NOTIFICATION) { + if (results->mode == MODE_NOTIFICATION) + { results->notification_data->notification_text = zenity_general_dialog_text; results->notification_data->listen = zenity_notification_listen; - results->notification_data->notification_hints = - zenity_notification_hints; - } else { - if (zenity_notification_listen) + results->notification_data->icon = zenity_general_icon; + + if (zenity_general_icon_DEPRECATED) + { + results->notification_data->icon = zenity_general_icon_DEPRECATED; + show_window_icon_deprecation_warning (); + } + } + else + { + if (zenity_notification_listen) { zenity_option_error (zenity_option_get_name (notification_options, - &zenity_notification_listen), + &zenity_notification_listen), ERROR_SUPPORT); + } } - return TRUE; } -#endif static gboolean zenity_progress_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_progress_active, MODE_PROGRESS); - if (results->mode == MODE_PROGRESS) { + if (results->mode == MODE_PROGRESS) + { results->progress_data->dialog_text = zenity_general_dialog_text; results->progress_data->pulsate = zenity_progress_pulsate; results->progress_data->autoclose = zenity_progress_auto_close; @@ -1647,48 +1693,58 @@ zenity_progress_post_callback (GOptionContext *context, GOptionGroup *group, results->progress_data->percentage = zenity_progress_percentage; results->progress_data->no_cancel = zenity_progress_no_cancel; results->progress_data->time_remaining = zenity_progress_time_remaining; - } else { - if (zenity_progress_pulsate) + } + else + { + if (zenity_progress_pulsate) { zenity_option_error (zenity_option_get_name (progress_options, - &zenity_progress_pulsate), + &zenity_progress_pulsate), ERROR_SUPPORT); + } - if (zenity_progress_percentage) + if (zenity_progress_percentage) { zenity_option_error (zenity_option_get_name (progress_options, - &zenity_progress_percentage), + &zenity_progress_percentage), ERROR_SUPPORT); + } - if (zenity_progress_auto_close) + if (zenity_progress_auto_close) { zenity_option_error (zenity_option_get_name (progress_options, - &zenity_progress_auto_close), + &zenity_progress_auto_close), ERROR_SUPPORT); + } - if (zenity_progress_auto_kill) + if (zenity_progress_auto_kill) { zenity_option_error (zenity_option_get_name (progress_options, - &zenity_progress_auto_kill), + &zenity_progress_auto_kill), ERROR_SUPPORT); + } - if (zenity_progress_no_cancel) + if (zenity_progress_no_cancel) { zenity_option_error (zenity_option_get_name (progress_options, - &zenity_progress_no_cancel), + &zenity_progress_no_cancel), ERROR_SUPPORT); + } - if (zenity_progress_time_remaining) + if (zenity_progress_time_remaining) { zenity_option_error (zenity_option_get_name (progress_options, - &zenity_progress_time_remaining), + &zenity_progress_time_remaining), ERROR_SUPPORT); + } } - return TRUE; } static gboolean zenity_question_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_question_active, MODE_QUESTION); - if (results->mode == MODE_QUESTION) { + + if (results->mode == MODE_QUESTION) + { results->msg_data->dialog_text = zenity_general_dialog_text; - results->msg_data->dialog_icon = zenity_general_dialog_icon; + results->msg_data->dialog_icon = zenity_general_icon; if (zenity_question_switch) results->msg_data->mode = ZENITY_MSG_SWITCH; else @@ -1697,21 +1753,31 @@ zenity_question_post_callback (GOptionContext *context, GOptionGroup *group, results->msg_data->no_markup = zenity_general_dialog_no_markup; results->msg_data->ellipsize = zenity_general_dialog_ellipsize; results->msg_data->default_cancel = zenity_question_default_cancel; + + if (zenity_general_icon_DEPRECATED) + { + results->msg_data->dialog_icon = zenity_general_icon_DEPRECATED; + show_window_icon_deprecation_warning (); + } } - if (zenity_question_switch && zenity_general_extra_buttons == NULL) - zenity_option_error ( - zenity_option_get_name (question_options, &zenity_question_switch), - ERROR_SYNTAX); + if (zenity_question_switch && zenity_general_extra_buttons == NULL) + { + zenity_option_error (zenity_option_get_name (question_options, + &zenity_question_switch), + ERROR_SYNTAX); + } return TRUE; } static gboolean zenity_text_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_text_active, MODE_TEXTINFO); - if (results->mode == MODE_TEXTINFO) { + if (results->mode == MODE_TEXTINFO) + { results->text_data->uri = zenity_general_uri; results->text_data->editable = zenity_general_editable; results->text_data->no_wrap = zenity_general_dialog_no_wrap; @@ -1723,16 +1789,20 @@ zenity_text_post_callback (GOptionContext *context, GOptionGroup *group, results->text_data->no_interaction = zenity_text_no_interaction; results->text_data->url = zenity_text_url; #endif - } else { - if (zenity_text_font) - zenity_option_error ( - zenity_option_get_name (text_options, &zenity_text_font), - ERROR_SUPPORT); + } + else + { + if (zenity_text_font) { + zenity_option_error (zenity_option_get_name (text_options, + &zenity_text_font), + ERROR_SUPPORT); + } #ifdef HAVE_WEBKITGTK - if (zenity_text_enable_html) - zenity_option_error ( - zenity_option_get_name (text_options, &zenity_text_enable_html), + if (zenity_text_enable_html) { + zenity_option_error (zenity_option_get_name (text_options, + &zenity_text_enable_html), ERROR_SUPPORT); + } #endif } return TRUE; @@ -1740,16 +1810,24 @@ zenity_text_post_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_warning_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_warning_active, MODE_WARNING); - if (results->mode == MODE_WARNING) { + if (results->mode == MODE_WARNING) + { results->msg_data->dialog_text = zenity_general_dialog_text; - results->msg_data->dialog_icon = zenity_general_dialog_icon; + results->msg_data->dialog_icon = zenity_general_icon; results->msg_data->mode = ZENITY_MSG_WARNING; results->msg_data->no_wrap = zenity_general_dialog_no_wrap; results->msg_data->no_markup = zenity_general_dialog_no_markup; results->msg_data->ellipsize = zenity_general_dialog_ellipsize; + + if (zenity_general_icon_DEPRECATED) + { + results->msg_data->dialog_icon = zenity_general_icon_DEPRECATED; + show_window_icon_deprecation_warning (); + } } return TRUE; @@ -1757,10 +1835,12 @@ zenity_warning_post_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_scale_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_scale_active, MODE_SCALE); - if (results->mode == MODE_SCALE) { + if (results->mode == MODE_SCALE) + { results->scale_data->dialog_text = zenity_general_dialog_text; results->scale_data->value = zenity_scale_value; results->scale_data->min_value = zenity_scale_min_value; @@ -1775,40 +1855,47 @@ zenity_scale_post_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_color_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_colorsel_active, MODE_COLOR); - if (results->mode == MODE_COLOR) { + if (results->mode == MODE_COLOR) + { results->color_data->color = zenity_colorsel_color; results->color_data->show_palette = zenity_colorsel_show_palette; - } else { - if (zenity_colorsel_color) - zenity_option_error ( - zenity_option_get_name ( - color_selection_options, &zenity_colorsel_color), - ERROR_SUPPORT); - - if (zenity_colorsel_show_palette) - zenity_option_error ( - zenity_option_get_name ( - color_selection_options, &zenity_colorsel_show_palette), - ERROR_SUPPORT); } + else + { + if (zenity_colorsel_color) { + zenity_option_error + (zenity_option_get_name (color_selection_options, + &zenity_colorsel_color), + ERROR_SUPPORT); + } + if (zenity_colorsel_show_palette) { + zenity_option_error + (zenity_option_get_name (color_selection_options, + &zenity_colorsel_show_palette), + ERROR_SUPPORT); + } + } return TRUE; } static gboolean zenity_forms_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { - gchar *values; + gpointer data, GError **error) +{ + char *values; int i = 0; zenity_option_set_dialog_mode (zenity_forms_active, MODE_FORMS); - if (results->mode == MODE_FORMS) { + + if (results->mode == MODE_FORMS) + { results->forms_data->dialog_text = zenity_general_dialog_text; results->forms_data->separator = zenity_general_separator; - // results->forms_data->hide_column = zenity_forms_hide_column; results->forms_data->show_header = zenity_forms_show_header; if (zenity_forms_list_values) { @@ -1845,7 +1932,9 @@ zenity_forms_post_callback (GOptionContext *context, GOptionGroup *group, else results->forms_data->date_format = g_locale_to_utf8 (nl_langinfo (D_FMT), -1, NULL, NULL, NULL); - } else { + } + else + { if (zenity_forms_date_format) zenity_option_error (zenity_option_get_name (forms_dialog_options, &zenity_forms_date_format), @@ -1854,10 +1943,6 @@ zenity_forms_post_callback (GOptionContext *context, GOptionGroup *group, zenity_option_error (zenity_option_get_name (forms_dialog_options, &zenity_forms_list_values), ERROR_SUPPORT); - // if (zenity_forms_hide_column) - // zenity_option_error (zenity_option_get_name - // (forms_dialog_options, &zenity_forms_hide_column), - // ERROR_SUPPORT); if (zenity_forms_column_values) zenity_option_error (zenity_option_get_name (forms_dialog_options, &zenity_forms_column_values), @@ -1877,24 +1962,26 @@ zenity_forms_post_callback (GOptionContext *context, GOptionGroup *group, static gboolean zenity_password_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_password_active, MODE_PASSWORD); + if (results->mode == MODE_PASSWORD) { results->password_data->username = zenity_password_show_username; } else { if (zenity_password_show_username) - zenity_option_error ( - zenity_option_get_name ( - password_dialog_options, &zenity_password_show_username), - ERROR_SUPPORT); + zenity_option_error + (zenity_option_get_name (password_dialog_options, + &zenity_password_show_username), + ERROR_SUPPORT); } - return TRUE; } static gboolean zenity_misc_post_callback (GOptionContext *context, GOptionGroup *group, - gpointer data, GError **error) { + gpointer data, GError **error) +{ zenity_option_set_dialog_mode (zenity_misc_about, MODE_ABOUT); zenity_option_set_dialog_mode (zenity_misc_version, MODE_VERSION); @@ -1902,7 +1989,8 @@ zenity_misc_post_callback (GOptionContext *context, GOptionGroup *group, } static GOptionContext * -zenity_create_context (void) { +zenity_create_context (void) +{ GOptionContext *tmp_ctx; GOptionGroup *a_group; @@ -1915,8 +2003,8 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, general_options); - g_option_group_set_parse_hooks ( - a_group, zenity_general_pre_callback, zenity_general_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_general_pre_callback, zenity_general_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); @@ -1928,8 +2016,8 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, calendar_options); - g_option_group_set_parse_hooks ( - a_group, zenity_calendar_pre_callback, zenity_calendar_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_calendar_pre_callback, zenity_calendar_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); @@ -1941,15 +2029,15 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, entry_options); - g_option_group_set_parse_hooks ( - a_group, zenity_entry_pre_callback, zenity_entry_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_entry_pre_callback, zenity_entry_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); /* Adds error option entries */ - a_group = g_option_group_new ( - "error", N_ ("Error options"), N_ ("Show error options"), NULL, NULL); + a_group = g_option_group_new ("error", + N_ ("Error options"), N_ ("Show error options"), NULL, NULL); g_option_group_add_entries (a_group, error_options); g_option_group_set_parse_hooks ( a_group, zenity_error_pre_callback, zenity_error_post_callback); @@ -1958,8 +2046,8 @@ zenity_create_context (void) { g_option_context_add_group (tmp_ctx, a_group); /* Adds info option entries */ - a_group = g_option_group_new ( - "info", N_ ("Info options"), N_ ("Show info options"), NULL, NULL); + a_group = g_option_group_new ("info", + N_ ("Info options"), N_ ("Show info options"), NULL, NULL); g_option_group_add_entries (a_group, info_options); g_option_group_set_parse_hooks ( a_group, zenity_info_pre_callback, zenity_info_post_callback); @@ -1990,11 +2078,10 @@ zenity_create_context (void) { g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); -#ifdef HAVE_LIBNOTIFY /* Adds notification option entries */ a_group = g_option_group_new ("notification", - N_ ("Notification icon options"), - N_ ("Show notification icon options"), + N_ ("Notification options"), + N_ ("Show notification options"), NULL, NULL); g_option_group_add_entries (a_group, notification_options); @@ -2004,7 +2091,6 @@ zenity_create_context (void) { g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); -#endif /* Adds progress option entries */ a_group = g_option_group_new ("progress", @@ -2026,8 +2112,8 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, question_options); - g_option_group_set_parse_hooks ( - a_group, zenity_question_pre_callback, zenity_question_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_question_pre_callback, zenity_question_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); @@ -2039,15 +2125,15 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, warning_options); - g_option_group_set_parse_hooks ( - a_group, zenity_warning_pre_callback, zenity_warning_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_warning_pre_callback, zenity_warning_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); /* Adds scale option entries */ - a_group = g_option_group_new ( - "scale", N_ ("Scale options"), N_ ("Show scale options"), NULL, NULL); + a_group = g_option_group_new ("scale", + N_ ("Scale options"), N_ ("Show scale options"), NULL, NULL); g_option_group_add_entries (a_group, scale_options); g_option_group_set_parse_hooks ( a_group, zenity_scale_pre_callback, zenity_scale_post_callback); @@ -2075,8 +2161,8 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, color_selection_options); - g_option_group_set_parse_hooks ( - a_group, zenity_color_pre_callback, zenity_color_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_color_pre_callback, zenity_color_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); @@ -2088,8 +2174,8 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, password_dialog_options); - g_option_group_set_parse_hooks ( - a_group, zenity_password_pre_callback, zenity_password_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_password_pre_callback, zenity_password_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); @@ -2101,8 +2187,8 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, forms_dialog_options); - g_option_group_set_parse_hooks ( - a_group, zenity_forms_pre_callback, zenity_forms_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_forms_pre_callback, zenity_forms_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); @@ -2114,17 +2200,12 @@ zenity_create_context (void) { NULL, NULL); g_option_group_add_entries (a_group, miscellaneous_options); - g_option_group_set_parse_hooks ( - a_group, zenity_misc_pre_callback, zenity_misc_post_callback); + g_option_group_set_parse_hooks (a_group, + zenity_misc_pre_callback, zenity_misc_post_callback); g_option_group_set_error_hook (a_group, zenity_option_error_callback); g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); g_option_context_add_group (tmp_ctx, a_group); - /* Adds gtk option entries */ - a_group = gtk_get_option_group (TRUE); - g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE); - g_option_context_add_group (tmp_ctx, a_group); - /* Enable help options */ g_option_context_set_help_enabled (tmp_ctx, TRUE); g_option_context_set_ignore_unknown_options (tmp_ctx, FALSE); @@ -2133,28 +2214,31 @@ zenity_create_context (void) { } void -zenity_option_error (gchar *string, ZenityError error) { - switch (error) { +zenity_option_error (char *string, ZenityError error) +{ + switch (error) + { case ERROR_SYNTAX: g_printerr (_ ("This option is not available. Please see --help " "for all possible usages.\n")); - zenity_option_free (); exit (-1); + case ERROR_SUPPORT: g_printerr (_ ("--%s is not supported for this dialog\n"), string); - zenity_option_free (); exit (-1); + case ERROR_DIALOG: g_printerr (_ ("Two or more dialog options specified\n")); - zenity_option_free (); exit (-1); + default: return; } } ZenityParsingOptions * -zenity_option_parse (gint argc, gchar **argv) { +zenity_option_parse (int argc, char **argv) +{ GError *error = NULL; zenity_option_init (); diff --git a/src/option.h b/src/option.h index b495e0e..5da7cfe 100644 --- a/src/option.h +++ b/src/option.h @@ -1,7 +1,8 @@ /* * option.h * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,11 +25,9 @@ #define OPTION_H #include "zenity.h" + #include <glib.h> -#include <langinfo.h> -#ifdef HAVE_LOCALE_H -#include <locale.h> -#endif +#include <config.h> typedef enum { MODE_CALENDAR, @@ -42,9 +41,7 @@ typedef enum { MODE_WARNING, MODE_SCALE, MODE_INFO, -#ifdef HAVE_LIBNOTIFY MODE_NOTIFICATION, -#endif MODE_COLOR, MODE_PASSWORD, MODE_FORMS, @@ -72,18 +69,14 @@ typedef struct { ZenityProgressData *progress_data; ZenityTextData *text_data; ZenityTreeData *tree_data; -#ifdef HAVE_LIBNOTIFY ZenityNotificationData *notification_data; -#endif ZenityColorData *color_data; ZenityPasswordData *password_data; ZenityFormsData *forms_data; } ZenityParsingOptions; -void zenity_option_error (gchar *string, ZenityError error); - -ZenityParsingOptions *zenity_option_parse (gint argc, gchar **argv); +void zenity_option_error (char *string, ZenityError error); -void zenity_option_free (void); +ZenityParsingOptions *zenity_option_parse (int argc, char **argv); #endif /* OPTION_H */ diff --git a/src/password.c b/src/password.c index a5490d3..69dd683 100644 --- a/src/password.c +++ b/src/password.c @@ -1,19 +1,22 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * password.c * - * Copyright (C) 2010 Arx Cruz + * Copyright © 2010 Arx Cruz + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 121 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. @@ -21,153 +24,155 @@ * Authors: Arx Cruz <arxcruz@gmail.com> */ -#include "config.h" #include "util.h" #include "zenity.h" + #include <string.h> +#include <config.h> + static ZenityData *zen_data; -static void zenity_password_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static void zenity_password_dialog_response (GtkWidget *widget, char *rstr, gpointer data); void -zenity_password_dialog (ZenityData *data, ZenityPasswordData *password_data) { +zenity_password_dialog (ZenityData *data, ZenityPasswordData *password_data) +{ + GtkBuilder *builder; GtkWidget *dialog; - GtkWidget *image; - GtkWidget *hbox; - GtkWidget *vbox_labels; - GtkWidget *vbox_entries; + GtkWidget *grid; GtkWidget *label; + int pass_row = 0; + /* Set global */ zen_data = data; - dialog = gtk_dialog_new (); + builder = zenity_util_load_ui_file ("zenity_password_dialog", "zenity_password_box", NULL); - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (builder == NULL) + { + data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); + return; } - gtk_dialog_add_button (GTK_DIALOG (dialog), - data->cancel_label != NULL ? data->cancel_label : _ ("_Cancel"), - GTK_RESPONSE_CANCEL); - gtk_dialog_add_button (GTK_DIALOG (dialog), - data->ok_label != NULL ? data->ok_label : _ ("_OK"), - GTK_RESPONSE_OK); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_password_dialog")); + + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) + } - image = - gtk_image_new_from_icon_name ("dialog-password", GTK_ICON_SIZE_DIALOG); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); - gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 12); + if (data->ok_label) { + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); + } - /* Checks if username has been passed as a parameter */ - gchar *title_text = _ ("Type your password"); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); + } + grid = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_password_grid")); + + /* Checks if username has been passed as a parameter */ if (password_data->username) - title_text = _ ("Type your username and password"); - - label = gtk_label_new (title_text); - - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 12); - gtk_box_pack_start ( - GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - hbox, - FALSE, - TRUE, - 5); - - vbox_labels = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - vbox_entries = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); - gtk_box_pack_start ( - GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - hbox, - FALSE, - TRUE, - 5); - - gtk_box_pack_start (GTK_BOX (hbox), vbox_labels, FALSE, TRUE, 12); - gtk_box_pack_start (GTK_BOX (hbox), vbox_entries, TRUE, TRUE, 12); - - if (password_data->username) { - label = gtk_label_new (_ ("Username:")); - gtk_box_pack_start (GTK_BOX (vbox_labels), label, TRUE, FALSE, 12); + { + /* Change the password label to ask for both username and password */ + label = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_password_title")); + gtk_label_set_text (GTK_LABEL(label), + _("Type your username and password")); + + /* Add the username label and entry and increment the row for the + * password entry so it will be added below the username. + */ + label = gtk_label_new (_("Username:")); + gtk_grid_attach (GTK_GRID(grid), label, + 0, /* col */ + 0, /* row */ + 1, 1); /* width/height by cell. */ + password_data->entry_username = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (vbox_entries), - password_data->entry_username, - TRUE, - TRUE, - 12); + gtk_grid_attach (GTK_GRID(grid), password_data->entry_username, + 1, + 0, + 1, 1); + + ++pass_row; } - label = gtk_label_new (_ ("Password:")); - gtk_box_pack_start (GTK_BOX (vbox_labels), label, TRUE, FALSE, 12); + label = gtk_label_new (_("Password:")); + gtk_grid_attach (GTK_GRID(grid), label, + 0, /* col */ + pass_row, /* row */ + 1, 1); /* width/height by cell. */ + password_data->entry_password = gtk_entry_new (); - gtk_entry_set_visibility (GTK_ENTRY (password_data->entry_password), FALSE); - gtk_entry_set_activates_default ( - GTK_ENTRY (password_data->entry_password), TRUE); - gtk_box_pack_start ( - GTK_BOX (vbox_entries), password_data->entry_password, TRUE, TRUE, 12); + gtk_entry_set_visibility (GTK_ENTRY(password_data->entry_password), FALSE); + gtk_entry_set_input_purpose (GTK_ENTRY(password_data->entry_password), + GTK_INPUT_PURPOSE_PASSWORD); + gtk_entry_set_activates_default (GTK_ENTRY(password_data->entry_password), + TRUE); + gtk_grid_attach (GTK_GRID(grid), password_data->entry_password, + 1, + pass_row, + 1, 1); if (data->dialog_title) - gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); + gtk_window_set_title (GTK_WINDOW(dialog), data->dialog_title); if (data->modal) - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + gtk_window_set_modal (GTK_WINDOW(dialog), TRUE); + + g_signal_connect (dialog, "response", G_CALLBACK(zenity_password_dialog_response), password_data); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_password_dialog_response), - password_data); - gtk_widget_show_all ( - GTK_WIDGET (gtk_dialog_get_content_area (GTK_DIALOG (dialog)))); - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); - if (data->timeout_delay > 0) { + if (data->timeout_delay > 0) + { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); } - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_password_dialog_response ( - GtkWidget *widget, int response, gpointer data) { - ZenityPasswordData *password_data = (ZenityPasswordData *) data; - switch (response) { - case GTK_RESPONSE_OK: +zenity_password_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ + ZenityPasswordData *password_data = data; + GtkEntryBuffer *user_buff, *pass_buff; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); + + user_buff = gtk_entry_get_buffer (GTK_ENTRY(password_data->entry_username)); + pass_buff = gtk_entry_get_buffer (GTK_ENTRY(password_data->entry_password)); + + switch (response) + { + case ZENITY_OK: zenity_util_exit_code_with_data (ZENITY_OK, zen_data); - if (password_data->username) + if (password_data->username) { g_print ("%s|%s\n", - gtk_entry_get_text ( - GTK_ENTRY (password_data->entry_username)), - gtk_entry_get_text ( - GTK_ENTRY (password_data->entry_password))); - else + gtk_entry_buffer_get_text (user_buff), + gtk_entry_buffer_get_text (pass_buff)); + } + else { g_print ("%s\n", - gtk_entry_get_text ( - GTK_ENTRY (password_data->entry_password))); + gtk_entry_buffer_get_text (pass_buff)); + } break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) printf ("%s\n", zen_data->extra_label[response]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } diff --git a/src/progress.c b/src/progress.c index 00bb8aa..cae1a6c 100644 --- a/src/progress.c +++ b/src/progress.c @@ -1,30 +1,33 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * progress.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Glynn Foster <glynn.foster@sun.com> + * Original Author: Glynn Foster <glynn.foster@sun.com> */ -#include "config.h" #include "util.h" #include "zenity.h" + #include <signal.h> #include <stdio.h> #include <stdlib.h> @@ -33,11 +36,13 @@ #include <time.h> #include <unistd.h> +#include <config.h> + static GtkBuilder *builder; static ZenityData *zen_data; static GIOChannel *channel; -static gint pulsate_timeout = -1; +static int pulsate_timeout = -1; static gboolean autokill; static gboolean no_cancel; static gboolean auto_close; @@ -45,17 +50,19 @@ static gboolean auto_close; gint zenity_progress_timeout (gpointer data); gint zenity_progress_pulsate_timeout (gpointer data); -static void zenity_progress_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static void zenity_progress_dialog_response (GtkWidget *widget, char *rstr, gpointer data); static gboolean -zenity_progress_pulsate_progress_bar (gpointer user_data) { +zenity_progress_pulsate_progress_bar (gpointer user_data) +{ gtk_progress_bar_pulse (GTK_PROGRESS_BAR (user_data)); + return TRUE; } static void -zenity_progress_pulsate_stop (void) { +zenity_progress_pulsate_stop (void) +{ if (pulsate_timeout > 0) { g_source_remove (pulsate_timeout); pulsate_timeout = -1; @@ -63,34 +70,40 @@ zenity_progress_pulsate_stop (void) { } static void -zenity_progress_pulsate_start (GObject *progress_bar) { +zenity_progress_pulsate_start (GObject *progress_bar) +{ if (pulsate_timeout == -1) { - pulsate_timeout = g_timeout_add ( - 100, zenity_progress_pulsate_progress_bar, progress_bar); + pulsate_timeout = g_timeout_add (100, + zenity_progress_pulsate_progress_bar, progress_bar); } } static void -zenity_progress_update_time_remaining (ZenityProgressData *progress_data) { +zenity_progress_update_time_remaining (ZenityProgressData *progress_data) +{ static GObject *progress_time = NULL; static time_t start_time = (time_t) (-1); float percentage = progress_data->percentage; if (progress_time == NULL) - progress_time = - gtk_builder_get_object (builder, "zenity_progress_time"); + progress_time = gtk_builder_get_object (builder, + "zenity_progress_time"); + if (start_time == (time_t) (-1) || percentage <= 0.0 || - percentage >= 100.0) { + percentage >= 100.0) + { start_time = time (NULL); gtk_label_set_text (GTK_LABEL (progress_time), ""); - } else { + } + else + { time_t current_time = time (NULL); time_t elapsed_time = current_time - start_time; time_t total_time = (time_t) (100.0 * elapsed_time / progress_data->percentage); time_t remaining_time = total_time - elapsed_time; gulong hours, minutes, seconds; - gchar *remaining_message; + g_autofree char *remaining_message = NULL; seconds = (gulong) (remaining_time % 60); remaining_time /= 60; @@ -98,26 +111,33 @@ zenity_progress_update_time_remaining (ZenityProgressData *progress_data) { remaining_time /= 60; hours = (gulong) remaining_time; - remaining_message = g_strdup_printf ( - _ ("Time remaining: %lu:%02lu:%02lu"), hours, minutes, seconds); + remaining_message = + g_strdup_printf (_("Time remaining: %lu:%02lu:%02lu"), + hours, minutes, seconds); gtk_label_set_text (GTK_LABEL (progress_time), remaining_message); - g_free (remaining_message); } } static float -stof(const char* s) { +stof (const char *s) +{ float rez = 0, fact = 1; + if (*s == '-') { s++; fact = -1; } - for (int point_seen = 0; *s; s++) { + + for (int point_seen = 0; *s; s++) + { + int d; + if (*s == '.' || *s == ',') { point_seen = 1; continue; } - int d = *s - '0'; + + d = *s - '0'; if (d >= 0 && d <= 9) { if (point_seen) fact /= 10.0f; rez = rez * 10.0f + (float)d; @@ -127,23 +147,25 @@ stof(const char* s) { } static gboolean -zenity_progress_handle_stdin ( - GIOChannel *channel, GIOCondition condition, gpointer data) { +zenity_progress_handle_stdin (GIOChannel *channel, GIOCondition condition, + gpointer data) +{ static ZenityProgressData *progress_data; static GObject *progress_bar; static GObject *progress_label; + static GtkWindow *parent; float percentage = 0.0; GIOStatus status = G_IO_STATUS_NORMAL; - progress_data = (ZenityProgressData *) data; + progress_data = data; progress_bar = gtk_builder_get_object (builder, "zenity_progress_bar"); progress_label = gtk_builder_get_object (builder, "zenity_progress_text"); + parent = GTK_WINDOW(gtk_widget_get_native (GTK_WIDGET(progress_bar))); - if ((condition & G_IO_IN) != 0) { - GString *string; - GError *error = NULL; - - string = g_string_new (NULL); + if ((condition & G_IO_IN) != 0) + { + g_autoptr(GString) string = g_string_new (NULL); + g_autoptr(GError) error = NULL; while (channel->is_readable != TRUE) ; @@ -152,23 +174,24 @@ zenity_progress_handle_stdin ( status = g_io_channel_read_line_string ( channel, string, NULL, &error); - while (gtk_events_pending ()) - gtk_main_iteration (); - + while (g_main_context_pending (NULL)) { + g_main_context_iteration (NULL, FALSE); + } } while (status == G_IO_STATUS_AGAIN); - if (status != G_IO_STATUS_NORMAL) { + if (status != G_IO_STATUS_NORMAL) + { if (error) { - g_warning ( - "zenity_progress_handle_stdin () : %s", error->message); - g_error_free (error); + g_warning ("%s: %s", + __func__, error->message); error = NULL; } continue; } - if (!g_ascii_strncasecmp (string->str, "#", 1)) { - gchar *match; + if (! g_ascii_strncasecmp (string->str, "#", 1)) + { + char *match; /* We have a comment, so let's try to change the label */ match = g_strstr_len (string->str, strlen (string->str), "#"); @@ -176,8 +199,11 @@ zenity_progress_handle_stdin ( gtk_label_set_text (GTK_LABEL (progress_label), g_strcompress (g_strchomp (g_strchug (match)))); - } else if (g_str_has_prefix (string->str, "pulsate")) { - gchar *colon, *command, *value; + } + else if (g_str_has_prefix (string->str, "pulsate")) + { + char *colon, *value; + g_autofree char *command = NULL; zenity_util_strip_newline (string->str); @@ -194,45 +220,44 @@ zenity_progress_handle_stdin ( while (*value && g_ascii_isspace (*value)) value++; - if (!g_ascii_strcasecmp (value, "false")) { + if (! g_ascii_strcasecmp (value, "false")) + { zenity_progress_pulsate_stop (); - gtk_progress_bar_set_fraction ( - GTK_PROGRESS_BAR (progress_bar), + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar), progress_data->percentage / 100.0); - } else { + } + else { zenity_progress_pulsate_start (progress_bar); } - - g_free (command); - } else { - - if (!g_ascii_isdigit (*(string->str))) + } + else + { + if (! g_ascii_isdigit (*(string->str))) continue; /* Now try to convert the thing to a number */ percentage = CLAMP (stof (string->str), 0, 100); - gtk_progress_bar_set_fraction ( - GTK_PROGRESS_BAR (progress_bar), percentage / 100.0); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar), + percentage / 100.0); progress_data->percentage = percentage; if (progress_data->time_remaining == TRUE) zenity_progress_update_time_remaining (progress_data); - if (percentage == 100) { - GObject *button; + if (percentage == 100) + { + adw_message_dialog_set_response_enabled (ADW_MESSAGE_DIALOG(parent), "ok", TRUE); + adw_message_dialog_set_default_response (ADW_MESSAGE_DIALOG(parent), "ok"); - button = gtk_builder_get_object ( - builder, "zenity_progress_ok_button"); - gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE); - gtk_widget_grab_focus (GTK_WIDGET (button)); - - if (progress_data->autoclose) { + if (progress_data->autoclose) + { zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - gtk_main_quit (); + + zenity_util_gapp_quit (parent, zen_data); } } } @@ -240,23 +265,15 @@ zenity_progress_handle_stdin ( } while ((g_io_channel_get_buffer_condition (channel) & G_IO_IN) == G_IO_IN && status != G_IO_STATUS_EOF); - g_string_free (string, TRUE); } - if ((condition & G_IO_IN) != G_IO_IN || status == G_IO_STATUS_EOF) { + if ((condition & G_IO_IN) != G_IO_IN || status == G_IO_STATUS_EOF) + { /* We assume that we are done, so stop the pulsating and de-sensitize * the buttons */ - GtkWidget *button; - - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_progress_ok_button")); - gtk_widget_set_sensitive (button, TRUE); - gtk_widget_grab_focus (button); - - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_progress_cancel_button")); - - gtk_widget_set_sensitive (button, FALSE); + adw_message_dialog_set_response_enabled (ADW_MESSAGE_DIALOG(parent), "ok", TRUE); + adw_message_dialog_set_response_enabled (ADW_MESSAGE_DIALOG(parent), "cancel", FALSE); + adw_message_dialog_set_default_response (ADW_MESSAGE_DIALOG(parent), "ok"); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress_bar), 1.0); @@ -264,9 +281,10 @@ zenity_progress_handle_stdin ( g_object_unref (builder); - if (progress_data->autoclose) { + if (progress_data->autoclose) + { zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - gtk_main_quit (); + zenity_util_gapp_quit (parent, zen_data); } g_io_channel_shutdown (channel, TRUE, NULL); @@ -276,7 +294,8 @@ zenity_progress_handle_stdin ( } static void -zenity_progress_read_info (ZenityProgressData *progress_data) { +zenity_progress_read_info (ZenityProgressData *progress_data) +{ channel = g_io_channel_unix_new (0); g_io_channel_set_encoding (channel, NULL, NULL); g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); @@ -287,148 +306,136 @@ zenity_progress_read_info (ZenityProgressData *progress_data) { /* We need to check the pulsate state here, because, the g_io_add_watch doesn't call the zenity_progress_handle_stdin function if there's no input. This fix the Bug 567663 */ - if (progress_data->pulsate) { + if (progress_data->pulsate) + { GObject *progress_bar = gtk_builder_get_object (builder, "zenity_progress_bar"); + zenity_progress_pulsate_start (progress_bar); } } -static void -zenity_text_size_allocate ( - GtkWidget *widget, GtkAllocation *allocation, gpointer data) { - gtk_widget_set_size_request (widget, allocation->width / 2, -1); -} - void -zenity_progress (ZenityData *data, ZenityProgressData *progress_data) { +zenity_progress (ZenityData *data, ZenityProgressData *progress_data) +{ GtkWidget *dialog; - GtkWidget *button; GObject *text; GObject *progress_bar; - GObject *cancel_button, *ok_button; zen_data = data; - builder = zenity_util_load_ui_file ("zenity_progress_dialog", NULL); + builder = zenity_util_load_ui_file ("zenity_progress_dialog", "zenity_progress_box", NULL); if (builder == NULL) { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); - text = gtk_builder_get_object (builder, "zenity_progress_text"); - dialog = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_progress_dialog")); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_progress_dialog")); progress_bar = gtk_builder_get_object (builder, "zenity_progress_bar"); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_progress_dialog_response), - data); + g_signal_connect (dialog, "response", G_CALLBACK(zenity_progress_dialog_response), data); if (data->dialog_title) - gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); + gtk_window_set_title (GTK_WINDOW(dialog), data->dialog_title); - zenity_util_set_window_icon (dialog, - data->window_icon, - ZENITY_IMAGE_FULLPATH ("zenity-progress.png")); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "appointment-soon"); if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); - - if (data->width > -1) { - gtk_widget_set_size_request (GTK_WIDGET (text), data->width, -1); - } else { - g_signal_connect_after (G_OBJECT (text), - "size-allocate", - G_CALLBACK (zenity_text_size_allocate), - data); - g_signal_connect_after (G_OBJECT (progress_bar), - "size-allocate", - G_CALLBACK (zenity_text_size_allocate), - data); + gtk_window_set_default_size (GTK_WINDOW(dialog), + data->width, data->height); + + if (data->width > -1) + { + gtk_widget_set_size_request (GTK_WIDGET(text), data->width, -1); + } +#if 0 + else + { + g_signal_connect_after (text, "size-allocate", + G_CALLBACK(zenity_text_size_allocate), data); + + g_signal_connect_after (progress_bar, "size-allocate", + G_CALLBACK(zenity_text_size_allocate), data); } +#endif if (data->modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } if (data->ok_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_progress_ok_button")); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); } - if (data->cancel_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_progress_cancel_button")); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); } - if (progress_data->dialog_text) - gtk_label_set_markup ( - GTK_LABEL (text), g_strcompress (progress_data->dialog_text)); + if (progress_data->dialog_text) { + gtk_label_set_markup (GTK_LABEL(text), + g_strcompress (progress_data->dialog_text)); + } - if (progress_data->percentage > -1) - gtk_progress_bar_set_fraction ( - GTK_PROGRESS_BAR (progress_bar), progress_data->percentage / 100.0); + if (progress_data->percentage > -1) { + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar), + progress_data->percentage / 100.0); + } autokill = progress_data->autokill; - auto_close = progress_data->autoclose; - ok_button = gtk_builder_get_object (builder, "zenity_progress_ok_button"); - no_cancel = progress_data->no_cancel; - cancel_button = - gtk_builder_get_object (builder, "zenity_progress_cancel_button"); - if (no_cancel) { - gtk_widget_hide (GTK_WIDGET (cancel_button)); - gtk_window_set_deletable (GTK_WINDOW (dialog), FALSE); + /* Unlike some other dialogs, this one starts off blank and we need to add + * the OK/Cancel buttons depending on the options. + */ + if (no_cancel) + gtk_window_set_deletable (GTK_WINDOW(dialog), FALSE); + else + adw_message_dialog_add_response (ADW_MESSAGE_DIALOG(dialog), "cancel", _("_Cancel")); + + if (!auto_close) + { + adw_message_dialog_add_response (ADW_MESSAGE_DIALOG(dialog), "ok", _("_OK")); + adw_message_dialog_set_response_enabled (ADW_MESSAGE_DIALOG(dialog), "ok", FALSE); } - if (no_cancel && auto_close) - gtk_widget_hide (GTK_WIDGET (ok_button)); - - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); zenity_progress_read_info (progress_data); - if (data->timeout_delay > 0) { + if (data->timeout_delay > 0) + { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, NULL); } - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_progress_dialog_response ( - GtkWidget *widget, int response, gpointer data) { - switch (response) { - case GTK_RESPONSE_OK: +zenity_progress_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); + + switch (response) + { + case ZENITY_OK: zenity_util_exit_code_with_data (ZENITY_OK, zen_data); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: /* We do not want to kill the parent process, in order to give the - user - the ability to choose the action to be taken. See bug #310824. - But we want to give people the option to choose this behavior. - -- Monday 27, March 2006 + * user the ability to choose the action to be taken. But we want + * to give people the option to choose this behavior. */ if (autokill) { kill (getppid (), 1); @@ -439,12 +446,15 @@ zenity_progress_dialog_response ( case ZENITY_TIMEOUT: zenity_util_exit_code_with_data (ZENITY_TIMEOUT, zen_data); break; + default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) + { printf ("%s\n", zen_data->extra_label[response]); + } zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } diff --git a/src/scale.c b/src/scale.c index 42284f5..7ac0f41 100644 --- a/src/scale.c +++ b/src/scale.c @@ -1,46 +1,48 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * scale.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Lucas Rocha <lucasr@gnome.org> + * Original Author: Lucas Rocha <lucasr@gnome.org> */ -#include "config.h" #include "util.h" #include "zenity.h" +#include <config.h> + static GtkWidget *scale; static void zenity_scale_value_changed (GtkWidget *widget, gpointer data); -static void zenity_scale_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static void zenity_scale_dialog_response (GtkWidget *widget, char *rstr, gpointer data); void -zenity_scale (ZenityData *data, ZenityScaleData *scale_data) { - GtkBuilder *builder; +zenity_scale (ZenityData *data, ZenityScaleData *scale_data) +{ + g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; - GtkWidget *button; GObject *text; - builder = - zenity_util_load_ui_file ("zenity_scale_dialog", "adjustment1", NULL); + builder = zenity_util_load_ui_file ("zenity_scale_dialog", "zenity_scale_adjustment", "zenity_scale_box", NULL); if (builder == NULL) { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); @@ -53,108 +55,104 @@ zenity_scale (ZenityData *data, ZenityScaleData *scale_data) { GTK_WIDGET (gtk_builder_get_object (builder, "zenity_scale_hscale")); text = gtk_builder_get_object (builder, "zenity_scale_text"); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_scale_dialog_response), - data); + g_signal_connect (dialog, "response", G_CALLBACK(zenity_scale_dialog_response), data); - if (scale_data->min_value >= scale_data->max_value) { - g_printerr (_ ("Maximum value must be greater than minimum value.\n")); + if (scale_data->min_value >= scale_data->max_value) + { + g_printerr (_("Maximum value must be greater than minimum value.\n")); data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } if (scale_data->value < scale_data->min_value || - scale_data->value > scale_data->max_value) { + scale_data->value > scale_data->max_value) + { g_printerr (_ ("Value out of range.\n")); data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); - if (data->dialog_title) gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); - zenity_util_set_window_icon ( - dialog, data->window_icon, ZENITY_IMAGE_FULLPATH ("zenity-scale.png")); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "dialog-question"); - if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); + if (data->width > -1 || data->height > -1) { + gtk_window_set_default_size (GTK_WINDOW(dialog), + data->width, data->height); + } if (data->modal) - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + gtk_window_set_modal (GTK_WINDOW(dialog), TRUE); + + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } - if (data->ok_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_scale_ok_button")); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); + if (data->ok_label) + { + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); } - if (data->cancel_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_scale_cancel_button")); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); } - if (scale_data->dialog_text) - gtk_label_set_markup ( - GTK_LABEL (text), g_strcompress (scale_data->dialog_text)); + if (scale_data->dialog_text) { + gtk_label_set_markup (GTK_LABEL (text), + g_strcompress (scale_data->dialog_text)); + } - gtk_range_set_range ( - GTK_RANGE (scale), scale_data->min_value, scale_data->max_value); + gtk_range_set_range (GTK_RANGE (scale), + scale_data->min_value, scale_data->max_value); gtk_range_set_value (GTK_RANGE (scale), scale_data->value); gtk_range_set_increments ( GTK_RANGE (scale), scale_data->step, scale_data->step); if (scale_data->print_partial) - g_signal_connect (G_OBJECT (scale), - "value-changed", - G_CALLBACK (zenity_scale_value_changed), - data); + { + g_signal_connect (scale, "value-changed", + G_CALLBACK(zenity_scale_value_changed), data); + } if (scale_data->hide_value) gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); - if (data->timeout_delay > 0) { + if (data->timeout_delay > 0) + { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); } - g_object_unref (builder); - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_scale_value_changed (GtkWidget *widget, gpointer data) { - g_print ("%.0f\n", gtk_range_get_value (GTK_RANGE (widget))); +zenity_scale_value_changed (GtkWidget *widget, gpointer data) +{ + g_print ("%.0f\n", gtk_range_get_value (GTK_RANGE(widget))); } static void -zenity_scale_dialog_response (GtkWidget *widget, int response, gpointer data) { +zenity_scale_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ ZenityData *zen_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); - switch (response) { - case GTK_RESPONSE_OK: + switch (response) + { + case ZENITY_OK: zenity_util_exit_code_with_data (ZENITY_OK, zen_data); g_print ("%.0f\n", gtk_range_get_value (GTK_RANGE (scale))); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; @@ -165,10 +163,13 @@ zenity_scale_dialog_response (GtkWidget *widget, int response, gpointer data) { default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) + { printf ("%s\n", zen_data->extra_label[response]); + } zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } - gtk_main_quit (); + + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } @@ -1,41 +1,45 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * text.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Glynn Foster <glynn.foster@sun.com> + * Original Author: Glynn Foster <glynn.foster@sun.com> */ -#include "config.h" #include "util.h" #include "zenity.h" + #include <gio/gio.h> #ifdef HAVE_WEBKITGTK #include <webkit2/webkit2.h> #endif +#include <config.h> + static ZenityTextData *zen_text_data; -static void zenity_text_dialog_response ( - GtkWidget *widget, int response, gpointer data); -static void zenity_text_toggle_button (GtkToggleButton *button, gpointer data); +static void zenity_text_dialog_response (GtkWidget *widget, char *rstr, gpointer data); +static void zenity_text_toggle_button (GtkCheckButton *button, AdwMessageDialog *dialog); #ifdef HAVE_WEBKITGTK static void @@ -72,7 +76,6 @@ zenity_configure_webkit (WebKitWebView *web_view) { NULL); g_object_set (G_OBJECT (settings), "enable-page-cache", FALSE, NULL); g_object_set (G_OBJECT (settings), "enable-plugins", FALSE, NULL); - g_object_set (G_OBJECT (settings), "enable-private-browsing", TRUE, NULL); /* Stick to defaults "enforce-96-dpi" gboolean : Read / Write / @@ -146,53 +149,60 @@ zenity_text_webview_load_changed ( } } -#endif +#endif /* HAVE_WEBKITGTK */ static gboolean -zenity_text_handle_stdin ( - GIOChannel *channel, GIOCondition condition, gpointer data) { +zenity_text_handle_stdin (GIOChannel *channel, GIOCondition condition, + gpointer data) +{ +#define BUF_SIZE 1024 static GtkTextBuffer *buffer; static GtkTextView *text_view; - gchar buf[1024]; + char buf[BUF_SIZE]; gsize len; text_view = GTK_TEXT_VIEW (data); buffer = gtk_text_view_get_buffer (text_view); - if ((condition & G_IO_IN) || (condition & (G_IO_IN | G_IO_HUP))) { - GError *error = NULL; - gint status; + if ((condition & G_IO_IN) || (condition & (G_IO_IN | G_IO_HUP))) + { + g_autoptr(GError) error = NULL; + int status; while (channel->is_readable != TRUE) ; do { - status = g_io_channel_read_chars (channel, buf, 1024, &len, &error); - - while (gtk_events_pending ()) - gtk_main_iteration (); + status = g_io_channel_read_chars (channel, buf, BUF_SIZE, + &len, &error); + while (g_main_context_pending (NULL)) { + g_main_context_iteration (NULL, FALSE); + } } while (status == G_IO_STATUS_AGAIN); - if (status != G_IO_STATUS_NORMAL) { + if (status != G_IO_STATUS_NORMAL) + { if (error) { - g_warning ("zenity_text_handle_stdin () : %s", error->message); - g_error_free (error); + g_warning ("%s: %s", + __func__, error->message); error = NULL; } return FALSE; } - if (len > 0) { + if (len > 0) + { GtkTextIter end; - gchar *utftext; + g_autofree char *utftext = NULL; gsize localelen; gsize utflen; gtk_text_buffer_get_end_iter (buffer, &end); - if (!g_utf8_validate (buf, len, NULL)) { + if (! g_utf8_validate (buf, len, NULL)) + { utftext = g_convert_with_fallback (buf, len, "UTF-8", @@ -202,41 +212,45 @@ zenity_text_handle_stdin ( &utflen, NULL); gtk_text_buffer_insert (buffer, &end, utftext, utflen); - g_free (utftext); - } else { + } + else + { gtk_text_buffer_insert (buffer, &end, buf, len); } - if (zen_text_data->auto_scroll) { - GtkTextMark *mark = NULL; - mark = gtk_text_buffer_get_insert (buffer); + + if (zen_text_data->auto_scroll) + { + GtkTextMark *mark = gtk_text_buffer_get_insert (buffer); + if (mark != NULL) - gtk_text_view_scroll_to_mark ( - text_view, mark, 0.0, FALSE, 0, 0); + { + gtk_text_view_scroll_to_mark (text_view, mark, + 0.0, FALSE, 0, 0); + } } } } - return TRUE; } static void -zenity_text_fill_entries_from_stdin (GtkTextView *text_view) { +zenity_text_fill_entries_from_stdin (GtkTextView *text_view) +{ GIOChannel *channel; channel = g_io_channel_unix_new (0); g_io_channel_set_encoding (channel, "UTF-8", NULL); g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); - g_io_add_watch ( - channel, G_IO_IN | G_IO_HUP, zenity_text_handle_stdin, text_view); + g_io_add_watch (channel, + G_IO_IN | G_IO_HUP, zenity_text_handle_stdin, text_view); } void -zenity_text (ZenityData *data, ZenityTextData *text_data) { - GtkBuilder *builder; +zenity_text (ZenityData *data, ZenityTextData *text_data) +{ + g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; - GtkWidget *ok_button; GtkWidget *checkbox; - GtkWidget *cancel_button; GObject *text_view; GtkTextBuffer *text_buffer; @@ -245,41 +259,31 @@ zenity_text (ZenityData *data, ZenityTextData *text_data) { GtkWidget *web_kit; GtkWidget *scrolled_window; GtkTextIter start_iter, end_iter; - gchar *content; + g_autofree char *content = NULL; #endif + zen_text_data = text_data; - builder = - zenity_util_load_ui_file ("zenity_text_dialog", "textbuffer1", NULL); + builder = zenity_util_load_ui_file ("zenity_text_dialog", "zenity_text_box", NULL); if (builder == NULL) { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); - - dialog = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_text_dialog")); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_text_dialog")); - ok_button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_text_close_button")); - cancel_button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_text_cancel_button")); - checkbox = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_text_checkbox")); + checkbox = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_text_checkbox")); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_text_dialog_response), - data); + g_signal_connect (dialog, "response", + G_CALLBACK(zenity_text_dialog_response), data); if (data->dialog_title) - gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); - - zenity_util_set_window_icon ( - dialog, data->window_icon, ZENITY_IMAGE_FULLPATH ("zenity-text.png")); + gtk_window_set_title (GTK_WINDOW(dialog), data->dialog_title); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "accessories-text-editor"); text_buffer = gtk_text_buffer_new (NULL); text_view = gtk_builder_get_object (builder, "zenity_text_view"); @@ -289,13 +293,24 @@ zenity_text (ZenityData *data, ZenityTextData *text_data) { if (text_data->no_wrap) gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text_view), GTK_WRAP_NONE); -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - if (text_data->font) { - PangoFontDescription *fontDesc = - pango_font_description_from_string (text_data->font); - gtk_widget_override_font (GTK_WIDGET (text_view), fontDesc); + if (text_data->font) + { + PangoFontDescription *desc; + GtkStyleContext *context; + GtkCssProvider *provider; + g_autofree char *css_str = NULL; + + desc = pango_font_description_from_string (text_data->font); + css_str = zenity_util_pango_font_description_to_css (desc); + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, css_str, -1); + + context = gtk_widget_get_style_context (GTK_WIDGET(text_view)); + gtk_style_context_add_provider (context, + GTK_STYLE_PROVIDER(provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } -G_GNUC_END_IGNORE_DEPRECATIONS if (text_data->uri) zenity_util_fill_file_buffer (text_buffer, text_data->uri); @@ -305,46 +320,47 @@ G_GNUC_END_IGNORE_DEPRECATIONS if (text_data->editable) zen_text_data->buffer = text_buffer; - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } if (data->ok_label) { - gtk_button_set_label (GTK_BUTTON (ok_button), data->ok_label); + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog); } - if (data->cancel_label) { - gtk_button_set_label (GTK_BUTTON (cancel_button), data->cancel_label); + if (data->cancel_label) + { + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog); } if (text_data->checkbox) { - gtk_widget_set_visible (GTK_WIDGET (checkbox), TRUE); - gtk_widget_set_sensitive (GTK_WIDGET (ok_button), FALSE); - gtk_button_set_label (GTK_BUTTON (checkbox), text_data->checkbox); - - g_signal_connect (G_OBJECT (checkbox), - "toggled", - G_CALLBACK (zenity_text_toggle_button), - ok_button); + gtk_widget_set_visible (GTK_WIDGET(checkbox), TRUE); + gtk_check_button_set_label (GTK_CHECK_BUTTON(checkbox), text_data->checkbox); + adw_message_dialog_set_response_enabled (ADW_MESSAGE_DIALOG(dialog), "ok", FALSE); + + g_signal_connect (checkbox, "toggled", G_CALLBACK(zenity_text_toggle_button), dialog); } if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); - else + { + gtk_window_set_default_size (GTK_WINDOW (dialog), + data->width, data->height); + } + else { gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 400); + } if (data->modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); #ifdef HAVE_WEBKITGTK - if (text_data->html) { - web_kit = webkit_web_view_new (); + if (text_data->html) + { + /* "ephemeral" == private browsing */ + g_autoptr(WebKitWebContext) wk_context = webkit_web_context_new_ephemeral (); + + web_kit = webkit_web_view_new_with_context (wk_context); scrolled_window = GTK_WIDGET ( gtk_builder_get_object (builder, "zenity_text_scrolled_window")); @@ -358,23 +374,19 @@ G_GNUC_END_IGNORE_DEPRECATIONS webkit_web_view_load_uri ( WEBKIT_WEB_VIEW (web_kit), text_data->url); } else { - gchar *cwd; - gchar *dirname; - gchar *dirname_uri; + g_autofree char *cwd = NULL; + g_autofree char *dirname = NULL; + g_autofree char *dirname_uri = NULL; dirname = text_data->uri ? g_path_get_dirname (text_data->uri) : g_strdup ("/"); cwd = g_get_current_dir (); dirname_uri = g_strconcat ("file://", cwd, "/", dirname, "/", NULL); - g_free (cwd); - g_free (dirname); gtk_text_buffer_get_start_iter (text_buffer, &start_iter); gtk_text_buffer_get_end_iter (text_buffer, &end_iter); content = gtk_text_buffer_get_text ( text_buffer, &start_iter, &end_iter, TRUE); webkit_web_view_load_html ( WEBKIT_WEB_VIEW (web_kit), content, dirname_uri); - g_free (dirname_uri); - g_free (content); } // We don't want user to click on links and navigate to another page. @@ -385,51 +397,51 @@ G_GNUC_END_IGNORE_DEPRECATIONS G_CALLBACK (zenity_text_webview_load_changed), NULL); - gtk_widget_destroy (GTK_WIDGET (text_view)); - gtk_container_add (GTK_CONTAINER (scrolled_window), web_kit); - gtk_widget_show (GTK_WIDGET (web_kit)); + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW(scrolled_window), web_kit); } -#endif - - zenity_util_show_dialog (dialog, data->attach); +#endif /* HAVE_WEBKITGTK */ - g_object_unref (builder); + zenity_util_show_dialog (dialog); - if (data->timeout_delay > 0) { + if (data->timeout_delay > 0) + { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, dialog); } - - gtk_main (); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void -zenity_text_toggle_button (GtkToggleButton *button, gpointer data) { - GtkWidget *ok_button = (GtkWidget *) data; - gtk_widget_set_sensitive ( - GTK_WIDGET (ok_button), gtk_toggle_button_get_active (button)); +zenity_text_toggle_button (GtkCheckButton *button, AdwMessageDialog *dialog) +{ + adw_message_dialog_set_response_enabled (dialog, "ok", gtk_check_button_get_active (button)); } static void -zenity_text_dialog_output (ZenityData *zen_data) { - if (zen_text_data->editable) { +zenity_text_dialog_output (ZenityData *zen_data) +{ + if (zen_text_data->editable) + { GtkTextIter start, end; - gchar *text; + g_autofree char *text = NULL; + gtk_text_buffer_get_bounds (zen_text_data->buffer, &start, &end); - text = - gtk_text_buffer_get_text (zen_text_data->buffer, &start, &end, 0); + text = gtk_text_buffer_get_text (zen_text_data->buffer, + &start, &end, 0); g_print ("%s", text); - g_free (text); } } static void -zenity_text_dialog_response (GtkWidget *widget, int response, gpointer data) { +zenity_text_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ ZenityData *zen_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); - switch (response) { - case GTK_RESPONSE_CLOSE: + switch (response) + { + case ZENITY_OK: zenity_text_dialog_output (zen_data); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); break; @@ -439,12 +451,18 @@ zenity_text_dialog_response (GtkWidget *widget, int response, gpointer data) { zen_data->exit_code = zenity_util_return_exit_code (ZENITY_TIMEOUT); break; + case ZENITY_CANCEL: + zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); + break; + default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) + { printf ("%s\n", zen_data->extra_label[response]); + } zenity_util_exit_code_with_data (ZENITY_ESC, zen_data); break; } - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } @@ -1,64 +1,67 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * tree.c * - * Copyright (C) 2002 Sun Microsystems, Inc. + * Copyright © 2002 Sun Microsystems, Inc. + * Copyright © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * - * Authors: Glynn Foster <glynn.foster@sun.com> + * Original Authors: Glynn Foster <glynn.foster@sun.com> * Jonathan Blanford <jrb@redhat.com> * Kristian Rietveld <kris@gtk.org> */ -#include "config.h" #include "util.h" #include "zenity.h" + #include <stdlib.h> #include <string.h> -#define MAX_ELEMENTS_BEFORE_SCROLLING 5 +#include <config.h> + #define PRINT_HIDE_COLUMN_SEPARATOR "," -static GtkBuilder *builder; +static GtkTreeView *tree_view; static GSList *selected; -static gchar *separator; +static char *separator; static gboolean print_all_columns = FALSE; -static gint *print_columns = NULL; -static gint *hide_columns = NULL; +static int *print_columns = NULL; +static int *hide_columns = NULL; static GIOChannel *channel; -static int *zenity_tree_extract_column_indexes (char *indexes, gint n_columns); -static gboolean zenity_tree_column_is_hidden (gint column_index); -static void zenity_tree_dialog_response ( - GtkWidget *widget, int response, gpointer data); +static int *zenity_tree_extract_column_indexes (char *indexes, int n_columns); +static gboolean zenity_tree_column_is_hidden (int column_index); +static void zenity_tree_dialog_response (GtkWidget *widget, char *rstr, gpointer data); static void zenity_tree_row_activated (GtkTreeView *tree_view, GtkTreePath *tree_path, GtkTreeViewColumn *tree_col, gpointer data); static gboolean -zenity_tree_dialog_untoggle ( - GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { - GValue toggle_value = { - 0, - }; +zenity_tree_dialog_untoggle (GtkTreeModel *model, GtkTreePath *path, + GtkTreeIter *iter, gpointer data) +{ + GValue toggle_value = G_VALUE_INIT; gtk_tree_model_get_value (model, iter, 0, &toggle_value); if (g_value_get_boolean (&toggle_value)) gtk_list_store_set (GTK_LIST_STORE (model), iter, 0, FALSE, -1); + return FALSE; } @@ -73,10 +76,14 @@ check_or_radio_label_activated_cb (GtkTreeView *tree_view, gboolean value; /* Because this is a radio list, we should untoggle the previous toggle so - * that - * we only have one selection at any given time + * that we only have one selection at any given time */ +<<<<<<< HEAD if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "radio")) == 1) { +======= + if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "radio")) == 1) + { +>>>>>>> gtk4-port gtk_tree_model_foreach (model, zenity_tree_dialog_untoggle, NULL); } @@ -89,27 +96,31 @@ check_or_radio_label_activated_cb (GtkTreeView *tree_view, static void zenity_load_pixbuf (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) +{ static GHashTable *pixbuf_cache = NULL; GError *error = NULL; GdkPixbuf *pixbuf; - gchar *str; + g_autofree char *str = NULL; gtk_tree_model_get (tree_model, iter, 0, &str, -1); - if (!str) + if (! str) return; - if (!pixbuf_cache) { + if (! pixbuf_cache) + { pixbuf_cache = g_hash_table_new (g_str_hash, g_str_equal); g_assert (pixbuf_cache); } pixbuf = g_hash_table_lookup (pixbuf_cache, str); - if (!pixbuf) { + if (! pixbuf) + { pixbuf = gdk_pixbuf_new_from_file (str, &error); - if (!pixbuf) + + if (! pixbuf) g_warning ("Failed to load '%s'", str); g_hash_table_insert (pixbuf_cache, g_strdup (str), pixbuf); @@ -117,25 +128,25 @@ zenity_load_pixbuf (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, if (pixbuf) g_object_set (cell, "pixbuf", pixbuf, NULL); - - g_free (str); } static gboolean -zenity_tree_handle_stdin ( - GIOChannel *channel, GIOCondition condition, gpointer data) { - static GtkTreeView *tree_view; +zenity_tree_handle_stdin (GIOChannel *channel, GIOCondition condition, + gpointer data) +{ GtkTreeModel *model; static GtkTreeIter iter; - static gint column_count = 0; - static gint row_count = 0; - static gint n_columns; + static int column_count = 0; + static int row_count = 0; + static int n_columns; static gboolean editable; static gboolean toggles; static gboolean first_time = TRUE; GIOStatus status = G_IO_STATUS_NORMAL; - tree_view = GTK_TREE_VIEW (data); + /* Make sure global is properly defined */ + g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE); + n_columns = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "n_columns")); editable = @@ -145,14 +156,16 @@ zenity_tree_handle_stdin ( model = gtk_tree_view_get_model (tree_view); - if (first_time) { + if (first_time) + { first_time = FALSE; gtk_list_store_append (GTK_LIST_STORE (model), &iter); } - if ((condition & G_IO_IN) == G_IO_IN) { - GString *string; - GError *error = NULL; + if ((condition & G_IO_IN) == G_IO_IN) + { + g_autoptr(GString) string = NULL; + g_autoptr(GError) error = NULL; string = g_string_new (NULL); @@ -161,47 +174,55 @@ zenity_tree_handle_stdin ( ; do { do { - if (g_io_channel_get_flags (channel) & G_IO_FLAG_IS_READABLE) - status = g_io_channel_read_line_string ( - channel, string, NULL, &error); - else + if (g_io_channel_get_flags (channel) & G_IO_FLAG_IS_READABLE) { + status = g_io_channel_read_line_string (channel, + string, NULL, &error); + } else { return FALSE; + } - while (gtk_events_pending ()) - gtk_main_iteration (); - - // TODO: Find a better way to avoid 100% cpu utilization + while (g_main_context_pending (NULL)) { + g_main_context_iteration (NULL, FALSE); + } + /* FIXME: Find a better way to avoid 100% cpu utilization */ g_usleep (10000); } while (status == G_IO_STATUS_AGAIN); - if (status != G_IO_STATUS_NORMAL) { + if (status != G_IO_STATUS_NORMAL) + { if (error) { - g_warning ( - "zenity_tree_handle_stdin () : %s", error->message); - g_error_free (error); + g_warning ("%s: %s", + __func__, error->message); error = NULL; } continue; } - if (column_count == n_columns) { + if (column_count == n_columns) + { /* We're starting a new row */ column_count = 0; row_count++; gtk_list_store_append (GTK_LIST_STORE (model), &iter); } - if (toggles && column_count == 0) { + if (toggles && column_count == 0) + { if (strcmp (g_ascii_strdown ( zenity_util_strip_newline (string->str), -1), "true") == 0) - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, column_count, TRUE, -1); - else + { + gtk_list_store_set (GTK_LIST_STORE(model), + &iter, column_count, TRUE, -1); + } + else { gtk_list_store_set ( GTK_LIST_STORE (model), &iter, column_count, FALSE, -1); - } else { + } + } + else + { gtk_list_store_set (GTK_LIST_STORE (model), &iter, column_count, @@ -210,35 +231,19 @@ zenity_tree_handle_stdin ( } if (editable) { - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, n_columns, TRUE, -1); - } - - if (row_count == MAX_ELEMENTS_BEFORE_SCROLLING) { - GtkWidget *scrolled_window; - GtkRequisition rectangle; - - gtk_widget_get_preferred_size ( - GTK_WIDGET (tree_view), &rectangle, NULL); - scrolled_window = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_tree_window")); - gtk_widget_set_size_request ( - scrolled_window, -1, rectangle.height); - gtk_scrolled_window_set_policy ( - GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); + gtk_list_store_set (GTK_LIST_STORE(model), + &iter, n_columns, TRUE, -1); } column_count++; } while ((g_io_channel_get_buffer_condition (channel) & G_IO_IN) == G_IO_IN && - status != G_IO_STATUS_EOF); - g_string_free (string, TRUE); + status != G_IO_STATUS_EOF); /* !do while */ } - if ((condition & G_IO_IN) != G_IO_IN || status == G_IO_STATUS_EOF) { + if ((condition & G_IO_IN) != G_IO_IN || status == G_IO_STATUS_EOF) + { g_io_channel_shutdown (channel, TRUE, NULL); return FALSE; } @@ -246,8 +251,13 @@ zenity_tree_handle_stdin ( } static void -zenity_tree_fill_entries_from_stdin (GtkTreeView *tree_view, gint n_columns, - gboolean toggles, gboolean editable) { +zenity_tree_fill_entries_from_stdin (GtkTreeView *loc_tv, int n_columns, + gboolean toggles, gboolean editable) +{ + /* No reason this should fail. Sanity check. */ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + g_assert (loc_tv == tree_view); + g_object_set_data ( G_OBJECT (tree_view), "n_columns", GINT_TO_POINTER (n_columns)); g_object_set_data ( @@ -258,16 +268,21 @@ zenity_tree_fill_entries_from_stdin (GtkTreeView *tree_view, gint n_columns, channel = g_io_channel_unix_new (0); g_io_channel_set_encoding (channel, NULL, NULL); g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); - g_io_add_watch ( - channel, G_IO_IN | G_IO_HUP, zenity_tree_handle_stdin, tree_view); + g_io_add_watch (channel, + G_IO_IN | G_IO_HUP, zenity_tree_handle_stdin, NULL); } static void -zenity_tree_fill_entries (GtkTreeView *tree_view, const gchar **args, - gint n_columns, gboolean toggles, gboolean editable) { +zenity_tree_fill_entries (GtkTreeView *loc_tv, const char **args, + int n_columns, gboolean toggles, gboolean editable) +{ GtkTreeModel *model; GtkTreeIter iter; - gint i = 0; + int i = 0; + + /* No reason this should fail. Sanity check. */ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + g_assert (loc_tv == tree_view); model = gtk_tree_view_get_model (tree_view); @@ -275,7 +290,7 @@ zenity_tree_fill_entries (GtkTreeView *tree_view, const gchar **args, G_OBJECT (tree_view), "n_columns", GINT_TO_POINTER (n_columns)); while (args[i] != NULL) { - gint j; + int j; gtk_list_store_append (GTK_LIST_STORE (model), &iter); @@ -294,45 +309,34 @@ zenity_tree_fill_entries (GtkTreeView *tree_view, const gchar **args, GTK_LIST_STORE (model), &iter, j, args[i + j], -1); } - if (editable) - gtk_list_store_set ( - GTK_LIST_STORE (model), &iter, n_columns, TRUE, -1); - - if (i == MAX_ELEMENTS_BEFORE_SCROLLING) { - GtkWidget *scrolled_window; - GtkRequisition rectangle; - - gtk_widget_get_preferred_size ( - GTK_WIDGET (tree_view), &rectangle, NULL); - scrolled_window = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_tree_window")); - gtk_widget_set_size_request (scrolled_window, -1, rectangle.height); - gtk_scrolled_window_set_policy ( - GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); + if (editable) { + gtk_list_store_set (GTK_LIST_STORE(model), + &iter, n_columns, TRUE, -1); } - i += n_columns; } } static gboolean -zenity_mid_search_func (GtkTreeModel *model, gint column, const gchar *key, - GtkTreeIter *iter, gpointer search_data) { - gchar *iter_string = NULL; +zenity_mid_search_func (GtkTreeModel *model, int column, const char *key, + GtkTreeIter *iter, gpointer search_data) +{ + char *iter_string = NULL; + gtk_tree_model_get (model, iter, column, &iter_string, -1); + return !(g_strrstr (g_utf8_strdown (iter_string, -1), g_utf8_strdown (key, -1)) != NULL); } static void zenity_cell_edited_callback (GtkCellRendererText *cell, - const gchar *path_string, const gchar *new_text, gpointer data) { + const char *path_string, const char *new_text, gpointer data) +{ GtkTreeModel *model; - GtkTreePath *path; + g_autoptr(GtkTreePath) path = NULL; GtkTreeIter iter; - gint column; + int column; model = GTK_TREE_MODEL (data); path = gtk_tree_path_new_from_string (path_string); @@ -341,24 +345,22 @@ zenity_cell_edited_callback (GtkCellRendererText *cell, gtk_tree_model_get_iter (model, &iter, path); gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, new_text, -1); - - gtk_tree_path_free (path); } void -zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { +zenity_tree (ZenityData *data, ZenityTreeData *tree_data) +{ + g_autoptr(GtkBuilder) builder = NULL; GtkWidget *dialog; - GtkWidget *button; - GObject *tree_view; GObject *text; GtkTreeViewColumn *column; GtkListStore *model; GType *column_types; GSList *tmp; gboolean first_column = FALSE; - gint i, column_index, n_columns; + int i, column_index, n_columns; - builder = zenity_util_load_ui_file ("zenity_tree_dialog", NULL); + builder = zenity_util_load_ui_file ("zenity_tree_dialog", "zenity_tree_box", NULL); if (builder == NULL) { data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); @@ -369,43 +371,44 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { n_columns = g_slist_length (tree_data->columns); - if (tree_data->print_column) { + if (tree_data->print_column) + { if (strcmp (g_ascii_strdown (tree_data->print_column, -1), "all") == 0) print_all_columns = TRUE; else print_columns = zenity_tree_extract_column_indexes ( tree_data->print_column, n_columns); - } else { + } + else + { print_columns = g_new (gint, 2); print_columns[0] = (tree_data->radiobox || tree_data->checkbox ? 2 : 1); print_columns[1] = 0; } - if (tree_data->hide_column) - hide_columns = zenity_tree_extract_column_indexes ( - tree_data->hide_column, n_columns); + if (tree_data->hide_column) { + hide_columns = + zenity_tree_extract_column_indexes (tree_data->hide_column, + n_columns); + } if (n_columns == 0) { - g_printerr (_ ("No column titles specified for List dialog.\n")); + g_printerr (_("No column titles specified for List dialog.\n")); data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - if (tree_data->checkbox + tree_data->radiobox + tree_data->imagebox > 1) { + if (tree_data->checkbox + tree_data->radiobox + tree_data->imagebox > 1) + { g_printerr (_ ("You should use only one List dialog type.\n")); data->exit_code = zenity_util_return_exit_code (ZENITY_ERROR); return; } - gtk_builder_connect_signals (builder, NULL); - - dialog = - GTK_WIDGET (gtk_builder_get_object (builder, "zenity_tree_dialog")); + dialog = GTK_WIDGET(gtk_builder_get_object (builder, + "zenity_tree_dialog")); - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (zenity_tree_dialog_response), - data); + g_signal_connect (dialog, "response", G_CALLBACK(zenity_tree_dialog_response), data); if (data->dialog_title) gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); @@ -413,41 +416,36 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { if (data->modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - if (data->extra_label) { - gint i = 0; - while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); - i++; - } + if (data->extra_label) + { + ZENITY_UTIL_ADD_EXTRA_LABELS (dialog) } if (data->ok_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_tree_ok_button")); - gtk_button_set_label (GTK_BUTTON (button), data->ok_label); + ZENITY_UTIL_SETUP_OK_BUTTON_LABEL (dialog) } if (data->cancel_label) { - button = GTK_WIDGET ( - gtk_builder_get_object (builder, "zenity_tree_cancel_button")); - gtk_button_set_label (GTK_BUTTON (button), data->cancel_label); + ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL (dialog) } text = gtk_builder_get_object (builder, "zenity_tree_text"); if (tree_data->dialog_text) - gtk_label_set_markup ( - GTK_LABEL (text), g_strcompress (tree_data->dialog_text)); + gtk_label_set_markup (GTK_LABEL(text), + g_strcompress (tree_data->dialog_text)); - zenity_util_set_window_icon ( - dialog, data->window_icon, ZENITY_IMAGE_FULLPATH ("zenity-list.png")); + gtk_window_set_icon_name (GTK_WINDOW(dialog), + "view-sort-ascending"); - if (data->width > -1 || data->height > -1) - gtk_window_set_default_size ( - GTK_WINDOW (dialog), data->width, data->height); + if (data->width > -1 || data->height > -1) { + gtk_window_set_default_size (GTK_WINDOW(dialog), + data->width, data->height); + } - tree_view = gtk_builder_get_object (builder, "zenity_tree_view"); + /* Define global tree_view. */ + tree_view = GTK_TREE_VIEW(gtk_builder_get_object (builder, + "zenity_tree_view")); if (tree_data->radiobox || tree_data->checkbox) { @@ -475,7 +473,8 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { else column_types = g_new (GType, n_columns); - for (i = 0; i < n_columns; i++) { + for (i = 0; i < n_columns; i++) + { /* Have the limitation that the radioboxes and checkboxes are in the * first column */ if (i == 0 && (tree_data->checkbox || tree_data->radiobox)) @@ -492,7 +491,7 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { else gtk_list_store_set_column_types (model, n_columns, column_types); - gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model)); + gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL(model)); if (tree_data->radiobox || tree_data->checkbox) { @@ -504,19 +503,22 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { { if (tree_data->multi) gtk_tree_selection_set_mode ( - gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), + gtk_tree_view_get_selection (tree_view), GTK_SELECTION_MULTIPLE); else gtk_tree_selection_set_mode ( - gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), + gtk_tree_view_get_selection (tree_view), GTK_SELECTION_SINGLE); } column_index = 0; - for (tmp = tree_data->columns; tmp; tmp = tmp->next) { - if (!first_column) { - if (tree_data->checkbox || tree_data->radiobox) { + for (tmp = tree_data->columns; tmp; tmp = tmp->next) + { + if (! first_column) + { + if (tree_data->checkbox || tree_data->radiobox) + { GtkCellRenderer *cell_renderer; cell_renderer = gtk_cell_renderer_toggle_new (); @@ -530,22 +532,28 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { column = gtk_tree_view_column_new_with_attributes ( tmp->data, cell_renderer, "active", column_index, NULL); - } else if (tree_data->imagebox) { + } + else if (tree_data->imagebox) + { GtkCellRenderer *cell_renderer = gtk_cell_renderer_pixbuf_new (); + column = gtk_tree_view_column_new_with_attributes ( tmp->data, cell_renderer, NULL); gtk_tree_view_column_set_cell_data_func ( column, cell_renderer, zenity_load_pixbuf, NULL, NULL); - } else { - if (tree_data->editable) { + } + else + { + if (tree_data->editable) + { GtkCellRenderer *cell_renderer; cell_renderer = gtk_cell_renderer_text_new (); - g_signal_connect (G_OBJECT (cell_renderer), - "edited", + g_signal_connect (cell_renderer, "edited", G_CALLBACK (zenity_cell_edited_callback), - gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view))); + gtk_tree_view_get_model (tree_view)); + g_object_set_data (G_OBJECT (cell_renderer), "column", GINT_TO_POINTER (column_index)); @@ -558,7 +566,9 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { "editable", n_columns, NULL); - } else { + } + else + { column = gtk_tree_view_column_new_with_attributes (tmp->data, gtk_cell_renderer_text_new (), @@ -574,15 +584,18 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { gtk_tree_view_column_set_visible (column, FALSE); first_column = TRUE; - } else { - if (tree_data->editable) { + } + else + { + if (tree_data->editable) + { GtkCellRenderer *cell_renderer; cell_renderer = gtk_cell_renderer_text_new (); - g_signal_connect (G_OBJECT (cell_renderer), - "edited", + g_signal_connect (cell_renderer, "edited", G_CALLBACK (zenity_cell_edited_callback), - gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view))); + gtk_tree_view_get_model (tree_view)); + g_object_set_data (G_OBJECT (cell_renderer), "column", GINT_TO_POINTER (column_index)); @@ -594,7 +607,9 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { "editable", n_columns, NULL); - } else { + } + else + { column = gtk_tree_view_column_new_with_attributes (tmp->data, gtk_cell_renderer_text_new (), "text", @@ -609,37 +624,43 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { gtk_tree_view_column_set_visible (column, FALSE); } - gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); + gtk_tree_view_append_column (tree_view, column); column_index++; } if (tree_data->hide_header) - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE); + gtk_tree_view_set_headers_visible (tree_view, FALSE); - if (tree_data->radiobox || tree_data->checkbox) { - if (tree_data->data && *tree_data->data) - zenity_tree_fill_entries (GTK_TREE_VIEW (tree_view), + if (tree_data->radiobox || tree_data->checkbox) + { + if (tree_data->data && *tree_data->data) { + zenity_tree_fill_entries (tree_view, tree_data->data, n_columns, TRUE, tree_data->editable); - else - zenity_tree_fill_entries_from_stdin (GTK_TREE_VIEW (tree_view), + } + else { + zenity_tree_fill_entries_from_stdin (tree_view, n_columns, TRUE, tree_data->editable); - } else { - if (tree_data->data && *tree_data->data) - zenity_tree_fill_entries (GTK_TREE_VIEW (tree_view), + } + } + else + { + if (tree_data->data && *tree_data->data) { + zenity_tree_fill_entries (tree_view, tree_data->data, n_columns, FALSE, tree_data->editable); - else - zenity_tree_fill_entries_from_stdin (GTK_TREE_VIEW (tree_view), + } else { + zenity_tree_fill_entries_from_stdin (tree_view, n_columns, FALSE, tree_data->editable); + } } /* GTK will automatically pick the image column as the search column @@ -650,13 +671,14 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { 1); } - zenity_util_show_dialog (dialog, data->attach); + zenity_util_show_dialog (dialog); - if (tree_data->mid_search) - gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (tree_view), + if (tree_data->mid_search) { + gtk_tree_view_set_search_equal_func (tree_view, (GtkTreeViewSearchEqualFunc) zenity_mid_search_func, model, NULL); + } if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, @@ -664,24 +686,23 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { dialog); } - gtk_main (); - - g_object_unref (builder); + zenity_util_gapp_main (GTK_WINDOW(dialog)); } static void zenity_tree_dialog_get_selected (GtkTreeModel *model, GtkTreePath *path_buf, - GtkTreeIter *iter, GtkTreeView *tree_view) { - GValue value = { - 0, - }; - gint n_columns, i; + GtkTreeIter *iter, gpointer user_data) +{ + GValue value = G_VALUE_INIT; + int n_columns, i; n_columns = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "n_columns")); - if (print_all_columns) { - for (i = 0; i < n_columns; i++) { + if (print_all_columns) + { + for (i = 0; i < n_columns; i++) + { gtk_tree_model_get_value (model, iter, i, &value); selected = g_slist_append (selected, g_value_dup_string (&value)); @@ -690,34 +711,35 @@ zenity_tree_dialog_get_selected (GtkTreeModel *model, GtkTreePath *path_buf, return; } - for (i = 0; print_columns[i] != 0; i++) { + for (i = 0; print_columns[i] != 0; i++) + { gtk_tree_model_get_value (model, iter, print_columns[i] - 1, &value); - selected = g_slist_append (selected, g_value_dup_string (&value)); + g_value_unset (&value); } } static gboolean zenity_tree_dialog_toggle_get_selected (GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, GtkTreeView *tree_view) { - GValue toggle_value = { - 0, - }; - gint n_columns, i; + GtkTreeIter *iter, gpointer user_data) +{ + GValue toggle_value = G_VALUE_INIT; + int n_columns, i; n_columns = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tree_view), "n_columns")); gtk_tree_model_get_value (model, iter, 0, &toggle_value); - if (g_value_get_boolean (&toggle_value)) { - GValue value = { - 0, - }; + if (g_value_get_boolean (&toggle_value)) + { + GValue value = G_VALUE_INIT; - if (print_all_columns) { - for (i = 1; i < n_columns; i++) { + if (print_all_columns) + { + for (i = 1; i < n_columns; i++) + { gtk_tree_model_get_value (model, iter, i, &value); selected = @@ -728,7 +750,8 @@ zenity_tree_dialog_toggle_get_selected (GtkTreeModel *model, GtkTreePath *path, return FALSE; } - for (i = 0; print_columns[i] != 0; i++) { + for (i = 0; print_columns[i] != 0; i++) + { gtk_tree_model_get_value ( model, iter, print_columns[i] - 1, &value); @@ -736,59 +759,65 @@ zenity_tree_dialog_toggle_get_selected (GtkTreeModel *model, GtkTreePath *path, g_value_unset (&value); } } - g_value_unset (&toggle_value); return FALSE; } static void -zenity_tree_dialog_output (void) { - GObject *tree_view; +zenity_tree_dialog_output (void) +{ GtkTreeSelection *selection; GtkTreeModel *model; - tree_view = gtk_builder_get_object (builder, "zenity_tree_view"); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + + model = gtk_tree_view_get_model (tree_view); if (gtk_tree_model_get_column_type (model, 0) == G_TYPE_BOOLEAN) + { gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) zenity_tree_dialog_toggle_get_selected, - GTK_TREE_VIEW (tree_view)); - else { - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); + NULL); + } + else + { + selection = gtk_tree_view_get_selection (tree_view); gtk_tree_selection_selected_foreach (selection, (GtkTreeSelectionForeachFunc) zenity_tree_dialog_get_selected, - GTK_TREE_VIEW (tree_view)); + NULL); } - GSList *tmp; - for (tmp = selected; tmp; tmp = tmp->next) { + for (GSList *tmp = selected; tmp != NULL; tmp = tmp->next) + { if (tmp->next != NULL) { - g_print ("%s%s", (gchar *) tmp->data, separator); - } else - g_print ("%s\n", (gchar *) tmp->data); + g_print ("%s%s", (char *)tmp->data, separator); + } else { + g_print ("%s\n", (char *)tmp->data); + } } g_free (print_columns); g_free (hide_columns); g_free (separator); - g_slist_foreach (selected, (GFunc) g_free, NULL); - selected = NULL; + g_slist_free_full (g_steal_pointer (&selected), g_free); } static void -zenity_tree_dialog_response (GtkWidget *widget, int response, gpointer data) { +zenity_tree_dialog_response (GtkWidget *widget, char *rstr, gpointer data) +{ ZenityData *zen_data = data; + ZenityExitCode response = zenity_util_parse_dialog_response (rstr); - switch (response) { - case GTK_RESPONSE_OK: + switch (response) + { + case ZENITY_OK: zenity_tree_dialog_output (); zenity_util_exit_code_with_data (ZENITY_OK, zen_data); break; - case GTK_RESPONSE_CANCEL: + case ZENITY_CANCEL: zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL); break; @@ -799,62 +828,78 @@ zenity_tree_dialog_response (GtkWidget *widget, int response, gpointer data) { default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) + response < (int)g_strv_length (zen_data->extra_label)) + { printf ("%s\n", zen_data->extra_label[response]); + } zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } if (channel != NULL && g_io_channel_get_flags (channel) & G_IO_FLAG_IS_READABLE) + { g_io_channel_shutdown (channel, TRUE, NULL); + } - gtk_main_quit (); + zenity_util_gapp_quit (GTK_WINDOW(widget), zen_data); } static void -zenity_tree_row_activated (GtkTreeView *tree_view, GtkTreePath *tree_path, - GtkTreeViewColumn *tree_col, gpointer data) { +zenity_tree_row_activated (GtkTreeView *loc_tv, GtkTreePath *tree_path, + GtkTreeViewColumn *tree_col, gpointer data) +{ + GtkWindow *parent; ZenityData *zen_data = data; + /* No reason this should fail. Sanity check. */ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + g_assert (loc_tv == tree_view); + zenity_tree_dialog_output (); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); - gtk_main_quit (); + + parent = GTK_WINDOW(gtk_widget_get_native (GTK_WIDGET(tree_view))); + + zenity_util_gapp_quit (parent, zen_data); } static gboolean -zenity_tree_column_is_hidden (gint column_index) { - gint i; - +zenity_tree_column_is_hidden (int column_index) +{ if (hide_columns != NULL) - for (i = 0; hide_columns[i] != 0; i++) + { + for (int i = 0; hide_columns[i] != 0; i++) + { if (hide_columns[i] == column_index) return TRUE; - + } + } return FALSE; } -static gint * -zenity_tree_extract_column_indexes (char *indexes, int n_columns) { - char **tmp; - gint *result; - gint i, j, index; +static int * +zenity_tree_extract_column_indexes (char *indexes, int n_columns) +{ + g_auto(GStrv) tmp; + int *result; + int i, j, index; tmp = g_strsplit (indexes, PRINT_HIDE_COLUMN_SEPARATOR, 0); - result = g_new (gint, 1); + result = g_new (int, 1); - for (j = i = 0; tmp[i] != NULL; i++) { + for (j = i = 0; tmp[i] != NULL; i++) + { index = atoi (tmp[i]); - if (index > 0 && index <= n_columns) { + if (index > 0 && index <= n_columns) + { result[j] = index; j++; - result = g_renew (gint, result, j + 1); + result = g_renew (int, result, j + 1); } } result[j] = 0; - g_strfreev (tmp); - return result; } @@ -1,22 +1,25 @@ +/* vim: colorcolumn=80 ts=4 sw=4 + */ /* * util.c * - * Copyright (C) 2002 Sun Microsystems, Inc. - * (C) 1999, 2000 Red Hat Inc. - * (C) 1998 James Henstridge - * (C) 1995-2002 Free Software Foundation + * Copyright © 2002 Sun Microsystems, Inc. + * © 1999, 2000 Red Hat Inc. + * © 1998 James Henstridge + * © 1995-2002 Free Software Foundation + * © 2021-2023 Logan Rathbone * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. @@ -27,11 +30,9 @@ * Tom Tromey <tromey@redhat.com> */ -#include "config.h" - -#include "config.h" #include "util.h" #include "zenity.h" + #include <errno.h> #include <locale.h> #include <stdarg.h> @@ -39,25 +40,49 @@ #include <stdlib.h> #include <string.h> -#ifdef GDK_WINDOWING_X11 -#include <gdk/gdkx.h> -#endif +#include "config.h" #define ZENITY_OK_DEFAULT 0 #define ZENITY_CANCEL_DEFAULT 1 #define ZENITY_ESC_DEFAULT 1 #define ZENITY_ERROR_DEFAULT -1 #define ZENITY_EXTRA_DEFAULT 127 +#define ZENITY_UI_RESOURCE_PATH RESOURCE_BASE_PATH "/zenity.ui" + +GIcon * +zenity_util_gicon_from_string (const char *str) +{ + GIcon *icon = NULL; + g_autoptr(GFile) icon_file = NULL; + + if (str) + { + icon_file = g_file_new_for_path (str); + + if (g_file_query_exists (icon_file, NULL)) + { + icon = g_file_icon_new (icon_file); + } + else + { + g_debug (_("Icon filename %s not found; trying theme icon."), str); + icon = g_themed_icon_new_with_default_fallbacks (str); + } + } + + return icon; +} GtkBuilder * -zenity_util_load_ui_file (const gchar *root_widget, ...) { +zenity_util_load_ui_file (const char *root_widget, ...) +{ va_list args; - gchar *arg = NULL; + char *arg = NULL; GPtrArray *ptrarray; GtkBuilder *builder = gtk_builder_new (); - GError *error = NULL; - gchar **objects; - guint result = 0; + g_autoptr(GError) error = NULL; + char **objects; + gboolean result = FALSE; gtk_builder_set_translation_domain (builder, GETTEXT_PACKAGE); @@ -68,43 +93,43 @@ zenity_util_load_ui_file (const gchar *root_widget, ...) { va_start (args, root_widget); - arg = va_arg (args, gchar *); + arg = va_arg (args, char *); while (arg) { g_ptr_array_add (ptrarray, g_strdup (arg)); - arg = va_arg (args, gchar *); + arg = va_arg (args, char *); } va_end (args); /* Enforce terminating NULL */ g_ptr_array_add (ptrarray, NULL); - objects = (gchar **) g_ptr_array_free (ptrarray, FALSE); - - if (g_file_test (ZENITY_UI_FILE_RELATIVEPATH, G_FILE_TEST_EXISTS)) { - /* Try current dir, for debugging */ - result = gtk_builder_add_objects_from_file ( - builder, ZENITY_UI_FILE_RELATIVEPATH, objects, NULL); - } + objects = (char **)g_ptr_array_free (ptrarray, FALSE); - if (result == 0) - result = gtk_builder_add_objects_from_file ( - builder, ZENITY_UI_FILE_FULLPATH, objects, &error); + result = gtk_builder_add_objects_from_resource (builder, + ZENITY_UI_RESOURCE_PATH, + (const char **)objects, + &error); g_strfreev (objects); - if (result == 0) { - g_warning ("Could not load ui file %s: %s", - ZENITY_UI_FILE_FULLPATH, - error->message); - g_error_free (error); - g_object_unref (builder); - return NULL; + if (! result) { + g_error ("Could not load ui resource %s: %s", + ZENITY_UI_RESOURCE_PATH, + error->message); + } + + /* This should never happen, but if an unexpected error is logged, print + * it for debugging purposes. */ + if (error) { + g_debug ("%s: Error generated: %s", + __func__, error->message); } return builder; } -gchar * -zenity_util_strip_newline (gchar *string) { + +char * +zenity_util_strip_newline (char *string) { gsize len; g_return_val_if_fail (string != NULL, NULL); @@ -121,11 +146,11 @@ zenity_util_strip_newline (gchar *string) { } gboolean -zenity_util_fill_file_buffer (GtkTextBuffer *buffer, const gchar *filename) { +zenity_util_fill_file_buffer (GtkTextBuffer *buffer, const char *filename) { GtkTextIter iter, end; FILE *f; - gchar buf[2048]; - gint remaining = 0; + char buf[2048]; + int remaining = 0; if (filename == NULL) return FALSE; @@ -140,7 +165,7 @@ zenity_util_fill_file_buffer (GtkTextBuffer *buffer, const gchar *filename) { gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); while (!feof (f)) { - gint count; + int count; const char *leftover; int to_read = 2047 - remaining; @@ -153,7 +178,7 @@ zenity_util_fill_file_buffer (GtkTextBuffer *buffer, const gchar *filename) { gtk_text_buffer_insert (buffer, &iter, buf, leftover - buf); remaining = (buf + remaining + count) - leftover; - memmove (buf, leftover, remaining); + memmove(buf, leftover, remaining); if (remaining > 6 || count < to_read) break; @@ -177,79 +202,19 @@ zenity_util_fill_file_buffer (GtkTextBuffer *buffer, const gchar *filename) { return TRUE; } -const gchar * -zenity_util_icon_name_from_filename (const gchar *filename) { - if (!filename || !filename[0]) - return "dialog-warning"; /* default */ - - if (!g_ascii_strcasecmp (filename, "warning")) - return "dialog-warning"; - if (!g_ascii_strcasecmp (filename, "info")) - return "dialog-information"; - if (!g_ascii_strcasecmp (filename, "question")) - return "dialog-question"; - if (!g_ascii_strcasecmp (filename, "error")) - return "dialog-error"; - return NULL; -} - -void -zenity_util_set_window_icon_from_file ( - GtkWidget *widget, const gchar *filename) { - GdkPixbuf *pixbuf; - const gchar *icon_name; - - icon_name = zenity_util_icon_name_from_filename (filename); - if (icon_name) { - gtk_window_set_icon_name (GTK_WINDOW (widget), icon_name); - } else { - pixbuf = gdk_pixbuf_new_from_file (filename, NULL); - gtk_window_set_icon (GTK_WINDOW (widget), pixbuf); - g_object_unref (pixbuf); - } -} - -void -zenity_util_set_window_icon ( - GtkWidget *widget, const gchar *filename, const gchar *default_file) { - GdkPixbuf *pixbuf; - - if (filename != NULL) { - zenity_util_set_window_icon_from_file (widget, filename); - } else { - pixbuf = gdk_pixbuf_new_from_file (default_file, NULL); - if (pixbuf != NULL) { - gtk_window_set_icon (GTK_WINDOW (widget), pixbuf); - g_object_unref (pixbuf); - } - } -} - -void -zenity_util_set_window_icon_from_icon_name ( - GtkWidget *widget, const gchar *filename, const gchar *default_icon_name) { - if (filename != NULL) - zenity_util_set_window_icon_from_file (widget, filename); - else - gtk_window_set_icon_name (GTK_WINDOW (widget), default_icon_name); -} - void zenity_util_show_help (GError **error) { - gchar *tmp; - tmp = g_find_program_in_path ("yelp"); + g_autofree char *tmp = g_find_program_in_path ("yelp"); - if (tmp) { - g_free (tmp); + if (tmp) g_spawn_command_line_async ("yelp help:zenity", error); - } } -gint -zenity_util_return_exit_code (ZenityExitCode value) { - - const gchar *env_var = NULL; - gint retval; +int +zenity_util_return_exit_code (ZenityExitCode value) +{ + const char *env_var = NULL; + int retval; switch (value) { @@ -311,108 +276,233 @@ zenity_util_return_exit_code (ZenityExitCode value) { } void -zenity_util_exit_code_with_data (ZenityExitCode value, ZenityData *zen_data) { +zenity_util_exit_code_with_data (ZenityExitCode value, ZenityData *zen_data) +{ zen_data->exit_code = zenity_util_return_exit_code (value); } -#ifdef GDK_WINDOWING_X11 - -static Window -transient_get_xterm (void) { - const char *wid_str = g_getenv ("WINDOWID"); - if (wid_str) { - char *wid_str_end; - int ret; - Window wid = strtoul (wid_str, &wid_str_end, 10); - if (*wid_str != '\0' && *wid_str_end == '\0' && wid != 0) { - XWindowAttributes attrs; - GdkDisplay *display; - display = gdk_display_get_default (); - gdk_x11_display_error_trap_push (display); - ret = XGetWindowAttributes ( - GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), wid, &attrs); - if (gdk_x11_display_error_trap_pop (display) != 0 || ret == 0) { - return None; - } - return wid; +/* This function was written by Matthias Clasen and is included somewhere in + * the GTK source tree.. I believe it is also included in libdazzle, but I + * didn't want to include a whole dependency just for one function. LGPL, but + * credit where credit is due! + */ +char * +zenity_util_pango_font_description_to_css (PangoFontDescription *desc) +{ + GString *s; + PangoFontMask set; + + s = g_string_new ("* { "); + + set = pango_font_description_get_set_fields (desc); + if (set & PANGO_FONT_MASK_FAMILY) + { + g_string_append (s, "font-family: "); + g_string_append (s, pango_font_description_get_family (desc)); + g_string_append (s, "; "); + } + if (set & PANGO_FONT_MASK_STYLE) + { + switch (pango_font_description_get_style (desc)) + { + case PANGO_STYLE_NORMAL: + g_string_append (s, "font-style: normal; "); + break; + case PANGO_STYLE_OBLIQUE: + g_string_append (s, "font-style: oblique; "); + break; + case PANGO_STYLE_ITALIC: + g_string_append (s, "font-style: italic; "); + break; } } - return None; -} + if (set & PANGO_FONT_MASK_VARIANT) + { + switch (pango_font_description_get_variant (desc)) + { + case PANGO_VARIANT_NORMAL: + g_string_append (s, "font-variant: normal; "); + break; + case PANGO_VARIANT_SMALL_CAPS: + g_string_append (s, "font-variant: small-caps; "); + break; + default: + break; + } + } + if (set & PANGO_FONT_MASK_WEIGHT) + { + switch (pango_font_description_get_weight (desc)) + { + case PANGO_WEIGHT_THIN: + g_string_append (s, "font-weight: 100; "); + break; + case PANGO_WEIGHT_ULTRALIGHT: + g_string_append (s, "font-weight: 200; "); + break; + case PANGO_WEIGHT_LIGHT: + case PANGO_WEIGHT_SEMILIGHT: + g_string_append (s, "font-weight: 300; "); + break; + case PANGO_WEIGHT_BOOK: + case PANGO_WEIGHT_NORMAL: + g_string_append (s, "font-weight: 400; "); + break; + case PANGO_WEIGHT_MEDIUM: + g_string_append (s, "font-weight: 500; "); + break; + case PANGO_WEIGHT_SEMIBOLD: + g_string_append (s, "font-weight: 600; "); + break; + case PANGO_WEIGHT_BOLD: + g_string_append (s, "font-weight: 700; "); + break; + case PANGO_WEIGHT_ULTRABOLD: + g_string_append (s, "font-weight: 800; "); + break; + case PANGO_WEIGHT_HEAVY: + case PANGO_WEIGHT_ULTRAHEAVY: + g_string_append (s, "font-weight: 900; "); + break; + } + } + if (set & PANGO_FONT_MASK_STRETCH) + { + switch (pango_font_description_get_stretch (desc)) + { + case PANGO_STRETCH_ULTRA_CONDENSED: + g_string_append (s, "font-stretch: ultra-condensed; "); + break; + case PANGO_STRETCH_EXTRA_CONDENSED: + g_string_append (s, "font-stretch: extra-condensed; "); + break; + case PANGO_STRETCH_CONDENSED: + g_string_append (s, "font-stretch: condensed; "); + break; + case PANGO_STRETCH_SEMI_CONDENSED: + g_string_append (s, "font-stretch: semi-condensed; "); + break; + case PANGO_STRETCH_NORMAL: + g_string_append (s, "font-stretch: normal; "); + break; + case PANGO_STRETCH_SEMI_EXPANDED: + g_string_append (s, "font-stretch: semi-expanded; "); + break; + case PANGO_STRETCH_EXPANDED: + g_string_append (s, "font-stretch: expanded; "); + break; + case PANGO_STRETCH_EXTRA_EXPANDED: + g_string_append (s, "font-stretch: extra-expanded; "); + break; + case PANGO_STRETCH_ULTRA_EXPANDED: + g_string_append (s, "font-stretch: ultra-expanded; "); + break; + } + } + if (set & PANGO_FONT_MASK_SIZE) + { + g_string_append_printf (s, "font-size: %dpt; ", + pango_font_description_get_size (desc) / PANGO_SCALE); + } -static void -transient_x_free (void *ptr) { - if (ptr) - XFree (ptr); -} + g_string_append (s, "}"); -static gboolean -transient_is_toplevel (Window wid) { - XTextProperty prop; - Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - if (!XGetWMName (dpy, wid, &prop)) - return FALSE; - transient_x_free (prop.value); - return !!prop.value; + return g_string_free (s, FALSE); } -/* - * GNOME Terminal doesn't give us its toplevel window, but the WM needs a - * toplevel XID for proper stacking. Other terminals work fine without this - * magic. We can't use GDK here since "xterm" is a foreign window. - */ +void +zenity_util_show_dialog (GtkWidget *dialog) +{ + gtk_widget_show (dialog); +} -static Window -transient_get_xterm_toplevel (void) { - Window xterm = transient_get_xterm (); - Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - while (xterm != None && !transient_is_toplevel (xterm)) { - Window root, parent, *children; - unsigned nchildren; - XQueryTree (dpy, xterm, &root, &parent, &children, &nchildren); - transient_x_free (children); - if (parent == root) - xterm = None; - else - xterm = parent; +gboolean +zenity_util_timeout_handle (AdwMessageDialog *dialog) +{ + if (dialog) { + adw_message_dialog_response (dialog, "timeout"); + } + else { + exit (ZENITY_TIMEOUT); } - return xterm; + return FALSE; } -static void -zenity_util_make_transient (GdkWindow *window, Window parent) { - Window parent_window = parent; - if (parent_window == 0) - parent_window = transient_get_xterm_toplevel (); - if (parent_window != None) { - XSetTransientForHint (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), - GDK_WINDOW_XID (window), - parent_window); +void +zenity_util_gapp_main (GtkWindow *window) +{ + GApplication *app = g_application_get_default (); + + if (window) + { + /* As this behaves quite differently if a window is provided vs. not, + * let's ensure any window passed is valid. + */ + g_assert (GTK_IS_WINDOW (window)); + + gtk_application_add_window (GTK_APPLICATION(app), window); + } + else { + g_application_hold (g_application_get_default ()); } } -#endif /* GDK_WINDOWING_X11 */ - void -zenity_util_show_dialog (GtkWidget *dialog, guintptr parent) { - gtk_widget_realize (dialog); -#ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) { - g_assert (gtk_widget_get_window (dialog)); - zenity_util_make_transient (gtk_widget_get_window (dialog), parent); +zenity_util_gapp_quit (GtkWindow *window, ZenityData *data) +{ + /* This is a bit hack-ish, but GApplication doesn't really allow for + * customized exit statuses within that API. + */ + if (data->exit_code != 0) + exit (data->exit_code); + + if (window) + { + g_assert (GTK_IS_WINDOW (window)); + gtk_window_destroy (window); + } + else { + g_application_release (g_application_get_default ()); } -#endif - gtk_widget_show (dialog); } -gboolean -zenity_util_timeout_handle (gpointer data) { - GtkDialog *dialog = GTK_DIALOG (data); - if (dialog != NULL) - gtk_dialog_response (dialog, ZENITY_TIMEOUT); - else { - gtk_main_quit (); - exit (ZENITY_TIMEOUT); +int +zenity_util_parse_dialog_response (const char *response) +{ + if (g_strcmp0 (response, "ok") == 0 || g_strcmp0 (response, "yes") == 0) + { + return ZENITY_OK; } - return FALSE; + else if (g_strcmp0 (response, "cancel") == 0 || g_strcmp0 (response, "no") == 0) + { + return ZENITY_CANCEL; + } + else if (g_strcmp0 (response, "timeout") == 0) + { + return ZENITY_TIMEOUT; + } + else if (response[0] >= '0' && response[0] <= '9') + { + /* FIXME - atoi returns 0 on error, so this *could* mean the function + * failed - but that would be a programmer error, so we'll leave this + * in place. + */ + return atoi (response); + } + else + { + return ZENITY_ESC; + } +} + +GtkWidget * +zenity_util_add_button (AdwMessageDialog *dialog, const char *button_text, + ZenityExitCode response_id) +{ + GtkWidget *w = GTK_WIDGET(dialog); + g_autofree char *response_str = g_strdup_printf ("%d", response_id); + + adw_message_dialog_add_response (dialog, response_str, button_text); + + return w; } @@ -1,35 +1,74 @@ -#ifndef UTIL_H -#define UTIL_H +/* vim: colorcolumn=80 ts=4 sw=4 + */ +/* + * util.h + * + * Copyright © 2002 Sun Microsystems, Inc. + * © 1999, 2000 Red Hat Inc. + * © 1998 James Henstridge + * © 1995-2002 Free Software Foundation + * © 2021-2023 Logan Rathbone + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Original Authors of util.c (inferring they were the authors of + * this file as well): + * + * Glynn Foster <glynn.foster@sun.com> + * Havoc Pennington <hp@redhat.com> + * James Henstridge <james@daa.com.au> + * Tom Tromey <tromey@redhat.com> + */ + +#pragma once #include "zenity.h" #include <gtk/gtk.h> G_BEGIN_DECLS -#define ZENITY_UI_FILE_FULLPATH ZENITY_DATADIR "/zenity.ui" -#define ZENITY_UI_FILE_RELATIVEPATH "./zenity.ui" - -#define ZENITY_IMAGE_FULLPATH(filename) (ZENITY_DATADIR "/" filename) - -GtkBuilder *zenity_util_load_ui_file ( - const gchar *widget_root, ...) G_GNUC_NULL_TERMINATED; -gchar *zenity_util_strip_newline (gchar *string); -gboolean zenity_util_fill_file_buffer ( - GtkTextBuffer *buffer, const gchar *filename); -const gchar *zenity_util_icon_name_from_filename (const gchar *filename); -void zenity_util_set_window_icon ( - GtkWidget *widget, const gchar *filename, const gchar *default_file); -void zenity_util_set_window_icon_from_icon_name ( - GtkWidget *widget, const gchar *filename, const gchar *default_icon_name); -void zenity_util_set_window_icon_from_file ( - GtkWidget *widget, const gchar *filename); +#define ZENITY_IMAGE_FULLPATH(filename) (PACKAGE_DATADIR "/" filename) + +#define ZENITY_UTIL_ADD_EXTRA_LABELS(DIALOG) \ + for (int i = 0; data->extra_label[i] != NULL; ++i) { \ + zenity_util_add_button (ADW_MESSAGE_DIALOG (DIALOG), data->extra_label[i], i); \ + } + +#define ZENITY_UTIL_SETUP_OK_BUTTON_LABEL(DIALOG) \ + adw_message_dialog_set_response_label (ADW_MESSAGE_DIALOG(DIALOG), "ok", data->ok_label); + +#define ZENITY_UTIL_SETUP_CANCEL_BUTTON_LABEL(DIALOG) \ + adw_message_dialog_set_response_label (ADW_MESSAGE_DIALOG(DIALOG), "cancel", data->cancel_label); + +GIcon *zenity_util_gicon_from_string (const char *str); +GtkBuilder *zenity_util_load_ui_file (const char *widget_root, + ...) G_GNUC_NULL_TERMINATED; +char *zenity_util_strip_newline (char *string); +gboolean zenity_util_fill_file_buffer (GtkTextBuffer *buffer, + const char *filename); void zenity_util_show_help (GError **error); -gint zenity_util_return_exit_code (ZenityExitCode value); +int zenity_util_return_exit_code (ZenityExitCode value); void zenity_util_exit_code_with_data (ZenityExitCode value, ZenityData *data); -void zenity_util_show_dialog (GtkWidget *widget, guintptr parent); - -gboolean zenity_util_timeout_handle (gpointer data); +void zenity_util_show_dialog (GtkWidget *widget); +gboolean zenity_util_timeout_handle (AdwMessageDialog *dialog); +char *zenity_util_pango_font_description_to_css (PangoFontDescription *desc); +void zenity_util_gapp_main (GtkWindow *window); +void zenity_util_gapp_quit (GtkWindow *window, ZenityData *data); +ZenityExitCode zenity_util_parse_dialog_response (const char *response); +GtkWidget *zenity_util_add_button (AdwMessageDialog *dialog, const char + *button_text, ZenityExitCode response_id); G_END_DECLS - -#endif /* UTIL_H */ diff --git a/src/zenity.gresource.xml.in b/src/zenity.gresource.xml.in new file mode 100644 index 0000000..4671d46 --- /dev/null +++ b/src/zenity.gresource.xml.in @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- vim:ts=4 sw=4 +--> +<!-- + Copyright © 2021-2023 Logan Rathbone <poprocks@gmail.com> + + Zenity is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + Zenity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Zenity; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +--> + +<gresources> + <gresource prefix="@resource_base_path@"> + <file preprocess="xml-stripblanks" compressed="true">zenity.ui</file> + </gresource> +</gresources> diff --git a/src/zenity.h b/src/zenity.h index 404eec7..20cac9f 100644 --- a/src/zenity.h +++ b/src/zenity.h @@ -1,47 +1,44 @@ -#ifndef ZENITY_H -#define ZENITY_H +/* vim: colorcolumn=80 ts=4 sw=4 + */ +#pragma once -#include <gtk/gtk.h> +#include <adwaita.h> +#include <glib/gi18n.h> + +#include "zenity-enums.h" /* auto-generated by build system */ + +#include <config.h> G_BEGIN_DECLS -#include <libintl.h> -#define _(String) dgettext (GETTEXT_PACKAGE, String) -#ifdef gettext_noop -#define N_(String) gettext_noop (String) -#else -#define N_(String) (String) -#endif +typedef enum +{ + ZENITY_OK = -1, + ZENITY_CANCEL = -2, + ZENITY_ESC = -3, + ZENITY_ERROR = -4, + ZENITY_EXTRA = -5, + ZENITY_TIMEOUT = -6 +} ZenityExitCode; typedef struct { - gchar *dialog_title; - gchar *window_icon; - gchar *ok_label; - gchar *cancel_label; - gchar **extra_label; - gint width; - gint height; - gint exit_code; - gint timeout_delay; + char *dialog_title; + char *ok_label; + char *cancel_label; + char **extra_label; + int width; + int height; + int exit_code; + int timeout_delay; gboolean modal; - guintptr attach; } ZenityData; -typedef enum { - ZENITY_OK, - ZENITY_CANCEL, - ZENITY_ESC, - ZENITY_ERROR, - ZENITY_EXTRA, - ZENITY_TIMEOUT -} ZenityExitCode; - typedef struct { - gchar *dialog_text; - gint day; - gint month; - gint year; - gchar *date_format; + char *dialog_text; + int day; + int month; + int year; + char *date_format; } ZenityCalendarData; typedef enum { @@ -53,8 +50,8 @@ typedef enum { } MsgMode; typedef struct { - gchar *dialog_text; - gchar *dialog_icon; + char *dialog_text; + char *dialog_icon; MsgMode mode; gboolean no_wrap; gboolean no_markup; @@ -63,35 +60,34 @@ typedef struct { } ZenityMsgData; typedef struct { - gchar *dialog_text; - gint value; - gint min_value; - gint max_value; - gint step; + char *dialog_text; + int value; + int min_value; + int max_value; + int step; gboolean print_partial; gboolean hide_value; } ZenityScaleData; typedef struct { - gchar *uri; + char *uri; gboolean multi; gboolean directory; gboolean save; - gboolean confirm_overwrite; - gchar *separator; - gchar **filter; + char *separator; + char **filter; } ZenityFileData; typedef struct { - gchar *dialog_text; - gchar *entry_text; + char *dialog_text; + char *entry_text; gboolean hide_text; - const gchar **data; + const char **data; } ZenityEntryData; typedef struct { - gchar *dialog_text; - gchar *entry_text; + char *dialog_text; + char *entry_text; gboolean pulsate; gboolean autoclose; gboolean autokill; @@ -101,46 +97,44 @@ typedef struct { } ZenityProgressData; typedef struct { - gchar *uri; + char *uri; gboolean editable; gboolean no_wrap; gboolean auto_scroll; - gchar *font; + char *font; GtkTextBuffer *buffer; - gchar *checkbox; + char *checkbox; #ifdef HAVE_WEBKITGTK gboolean html; gboolean no_interaction; - gchar *url; + char *url; #endif } ZenityTextData; typedef struct { - gchar *dialog_text; + char *dialog_text; GSList *columns; gboolean checkbox; gboolean radiobox; gboolean hide_header; gboolean imagebox; - gchar *separator; + char *separator; gboolean multi; gboolean editable; gboolean mid_search; - gchar *print_column; - gchar *hide_column; - const gchar **data; + char *print_column; + char *hide_column; + const char **data; } ZenityTreeData; -#ifdef HAVE_LIBNOTIFY typedef struct { - gchar *notification_text; + char *notification_text; gboolean listen; - gchar **notification_hints; + char *icon; } ZenityNotificationData; -#endif typedef struct { - gchar *color; + char *color; gboolean show_palette; } ZenityColorData; @@ -150,10 +144,9 @@ typedef struct { GSList *list_values; GSList *column_values; GSList *combo_values; - gchar *dialog_text; - gchar *separator; - gchar *date_format; - // gchar *hide_column; + char *dialog_text; + char *separator; + char *date_format; gboolean show_header; } ZenityFormsData; @@ -166,14 +159,14 @@ typedef enum { } ZenityFormsType; typedef struct { - gchar *option_value; + char *option_value; ZenityFormsType type; GtkWidget *forms_widget; } ZenityFormsValue; typedef struct { gboolean username; - gchar *password; + char *password; GtkWidget *entry_username; GtkWidget *entry_password; } ZenityPasswordData; @@ -185,10 +178,8 @@ void zenity_entry (ZenityData *data, ZenityEntryData *entry_data); void zenity_progress (ZenityData *data, ZenityProgressData *progress_data); void zenity_text (ZenityData *data, ZenityTextData *text_data); void zenity_tree (ZenityData *data, ZenityTreeData *tree_data); -#ifdef HAVE_LIBNOTIFY -void zenity_notification ( - ZenityData *data, ZenityNotificationData *notification_data); -#endif +void zenity_notification (ZenityData *data, + ZenityNotificationData *notification_data); void zenity_colorselection ( ZenityData *data, ZenityColorData *notification_data); @@ -199,5 +190,3 @@ void zenity_password_dialog ( ZenityData *data, ZenityPasswordData *password_data); void zenity_forms_dialog (ZenityData *data, ZenityFormsData *forms_data); G_END_DECLS - -#endif /* ZENITY_H */ diff --git a/src/zenity.ui b/src/zenity.ui index c1a367c..f2bb9b4 100644 --- a/src/zenity.ui +++ b/src/zenity.ui @@ -1,1155 +1,490 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.20.0 --> + +<!-- vim: ts=2 sw=2 +--> + <interface> - <requires lib="gtk+" version="3.0"/> - <object class="GtkAdjustment" id="adjustment1"> - <property name="upper">100</property> - <property name="step_increment">1</property> - <property name="page_increment">1</property> - </object> - <object class="GtkDialog" id="zenity_scale_dialog"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Adjust the scale value</property> - <property name="default_width">300</property> - <property name="default_height">100</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox11"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area11"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_scale_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_scale_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="has_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox13"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="zenity_scale_text"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="ypad">4</property> - <property name="label" translatable="yes">Adjust the scale value</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkScale" id="zenity_scale_hscale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">adjustment1</property> - <property name="digits">0</property> - <property name="value_pos">right</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_scale_cancel_button</action-widget> - <action-widget response="-5">zenity_scale_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkTextBuffer" id="textbuffer1"/> - <object class="GtkDialog" id="zenity_text_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Text View</property> - <property name="window_position">center</property> - <property name="default_width">300</property> - <property name="default_height">200</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_text_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_text_close_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">True</property> - <property name="image_position">right</property> - <accelerator key="Return" signal="clicked" modifiers="GDK_CONTROL_MASK"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkScrolledWindow" id="zenity_text_scrolled_window"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="shadow_type">etched-in</property> - <child> - <object class="GtkTextView" id="zenity_text_view"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="pixels_above_lines">2</property> - <property name="pixels_below_lines">2</property> - <property name="editable">False</property> - <property name="wrap_mode">word</property> - <property name="left_margin">2</property> - <property name="right_margin">2</property> - <property name="buffer">textbuffer1</property> - </object> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="zenity_text_checkbox"> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="xalign">0.5</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_text_cancel_button</action-widget> - <action-widget response="-7">zenity_text_close_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_calendar_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Calendar selection</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_calendar_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_calendar_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkBox" id="vbox2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="zenity_calendar_text"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Select a date from below.</property> - <property name="wrap">True</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="zenity_calendar_label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">C_alendar:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">zenity_calendar</property> - <property name="xalign">0</property> - <accessibility> - <relation type="label-for" target="zenity_calendar"/> - </accessibility> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkCalendar" id="zenity_calendar"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_calendar_cancel_button</action-widget> - <action-widget response="-5">zenity_calendar_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_entry_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Add a new entry</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_entry_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_entry_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">6</property> - <child> - <object class="GtkBox" id="vbox4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="zenity_entry_text"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_Enter new text:</property> - <property name="use_underline">True</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_entry_cancel_button</action-widget> - <action-widget response="-5">zenity_entry_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_error_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Error</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <property name="resizable">false</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox7"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">14</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area7"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_error_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox8"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">6</property> - <child> - <object class="GtkBox" id="hbox3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="spacing">12</property> - <child> - <object class="GtkImage" id="zenity_error_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="yalign">0</property> - <property name="icon_name">dialog-error</property> - <property name="icon_size">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="zenity_error_text"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">An error has occurred.</property> - <property name="wrap">True</property> - <property name="selectable">True</property> - <property name="yalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-5">zenity_error_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_forms_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="window_position">center</property> - <property name="type_hint">normal</property> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox12"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area12"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_forms_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_forms_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label_xalign">0</property> - <child> - <object class="GtkGrid" id="zenity_forms_grid"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="margin_left">12</property> - <property name="margin_right">6</property> - <property name="margin_top">12</property> - <property name="margin_bottom">6</property> - <property name="row_spacing">6</property> - <property name="column_spacing">10</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="zenity_forms_text"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Forms dialog</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_forms_cancel_button</action-widget> - <action-widget response="-5">zenity_forms_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_info_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Information</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <property name="resizable">false</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox9"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">14</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_info_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="hbox4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="spacing">12</property> - <child> - <object class="GtkImage" id="zenity_info_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="yalign">0</property> - <property name="icon_name">dialog-information</property> - <property name="icon_size">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="zenity_info_text"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">All updates are complete.</property> - <property name="wrap">True</property> - <property name="selectable">True</property> - <property name="yalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-5">zenity_info_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_progress_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Progress</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox6"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area6"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_progress_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_progress_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox7"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="zenity_progress_text"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Running...</property> - <property name="wrap">True</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkProgressBar" id="zenity_progress_bar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="pulse_step">0.10000000149</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="zenity_progress_time"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_progress_cancel_button</action-widget> - <action-widget response="-5">zenity_progress_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_question_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Question</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <property name="resizable">false</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">14</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="zenity_question_button_box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="hbox1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="spacing">12</property> - <child> - <object class="GtkImage" id="zenity_question_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="icon_name">dialog-question</property> - <property name="icon_size">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="zenity_question_text"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Are you sure you want to proceed?</property> - <property name="wrap">True</property> - <property name="selectable">True</property> - <property name="yalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - <object class="GtkDialog" id="zenity_tree_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Select items from the list</property> - <property name="window_position">center</property> - <property name="default_width">300</property> - <property name="default_height">196</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox8"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area8"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_tree_cancel_button"> - <property name="label" translatable="yes">Cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="zenity_tree_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="vbox10"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="zenity_tree_text"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Select items from the list below.</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkScrolledWindow" id="zenity_tree_window"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="shadow_type">in</property> - <property name="expand">True</property> - <child> - <object class="GtkTreeView" id="zenity_tree_view"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection1"/> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">zenity_tree_cancel_button</action-widget> - <action-widget response="-5">zenity_tree_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkDialog" id="zenity_warning_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="title" translatable="yes">Warning</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <property name="resizable">false</property> - <signal name="destroy" handler="gtk_main_quit" swapped="no"/> - <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">14</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="zenity_warning_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="hbox2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="spacing">12</property> - <child> - <object class="GtkImage" id="zenity_warning_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="icon_name">dialog-warning</property> - <property name="icon_size">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="zenity_warning_text"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Are you sure you want to proceed?</property> - <property name="wrap">True</property> - <property name="selectable">True</property> - <property name="yalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-5">zenity_warning_ok_button</action-widget> - </action-widgets> - </object> + <requires lib="gtk" version="4.0"/> + <object class="AdwMessageDialog" id="zenity_scale_dialog"> + <property name="title" translatable="yes">Adjust the scale value</property> + <property name="default_width">300</property> + <property name="default_height">100</property> + <property name="extra-child">zenity_scale_box</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkAdjustment" id="zenity_scale_adjustment"> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">1</property> + </object> + <object class="GtkBox" id="zenity_scale_box"> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="zenity_scale_text"> + <property name="valign">center</property> + <property name="vexpand">true</property> + <property name="label" translatable="yes">Adjust the scale value</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkScale" id="zenity_scale_hscale"> + <property name="hexpand">true</property> + <property name="draw-value">1</property> + <property name="adjustment">zenity_scale_adjustment</property> + <property name="digits">0</property> + <property name="value_pos">right</property> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_text_dialog"> + <property name="title" translatable="yes">Text View</property> + <property name="default_width">300</property> + <property name="default_height">200</property> + <property name="resizable">true</property> + <property name="extra-child">zenity_text_box</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_text_box"> + <property name="spacing">2</property> + <child> + <object class="GtkBox" id="vbox5"> + <property name="hexpand">1</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkScrolledWindow" id="zenity_text_scrolled_window"> + <property name="vexpand">1</property> + <property name="child"> + <object class="GtkTextView" id="zenity_text_view"> + <property name="editable">false</property> + <property name="wrap_mode">word</property> + </object> + </property> + </object> + </child> + <child> + <object class="GtkCheckButton" id="zenity_text_checkbox"> + <property name="valign">center</property> + <property name="visible">0</property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_calendar_dialog"> + <property name="title" translatable="yes">Calendar selection</property> + <property name="extra-child">zenity_calendar_box</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_calendar_box"> + <property name="spacing">2</property> + <child> + <object class="GtkBox" id="vbox1"> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkBox" id="vbox2"> + <property name="vexpand">1</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="zenity_calendar_text"> + <property name="halign">center</property> + <property name="label" translatable="yes">Select a date from below.</property> + <property name="wrap">1</property> + <property name="xalign">0</property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_calendar_label"> + <property name="valign">center</property> + <property name="label" translatable="yes">C_alendar:</property> + <property name="use_underline">1</property> + <property name="mnemonic_widget">zenity_calendar</property> + <property name="xalign">0</property> + <accessibility> + <property name="label" translatable="yes">Calendar</property> + <relation name="labelled-by">zenity_calendar</relation> + </accessibility> + </object> + </child> + <child> + <object class="GtkCalendar" id="zenity_calendar"> + <property name="valign">center</property> + <property name="vexpand">true</property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_entry_dialog"> + <property name="title" translatable="yes">Add a new entry</property> + <property name="extra-child">zenity_entry_box</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_entry_box"> + <property name="orientation">vertical</property> + <property name="spacing">2</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-bottom">12</property> + <property name="margin-top">12</property> + <child> + <object class="GtkBox" id="vbox3"> + <child> + <object class="GtkBox" id="vbox4"> + <property name="hexpand">1</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="zenity_entry_text"> + <property name="valign">center</property> + <property name="label" translatable="yes">_Enter new text:</property> + <property name="use_underline">1</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_error_dialog"> + <property name="title" translatable="yes">Error</property> + <property name="extra-child">zenity_error_box</property> + <responses> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_error_box"> + <property name="spacing">14</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-bottom">12</property> + <property name="margin-top">12</property> + <child> + <object class="GtkBox" id="vbox8"> + <child> + <object class="GtkBox" id="hbox3"> + <property name="hexpand">1</property> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="zenity_error_image"> + <property name="halign">center</property> + <property name="icon_name">dialog-error</property> + <property name="icon_size">large</property> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_error_text"> + <property name="halign">center</property> + <property name="label" translatable="yes">An error has occurred.</property> + <property name="wrap">true</property> + <property name="selectable">true</property> + <property name="can-focus">false</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_forms_dialog"> + <property name="extra-child">zenity_forms_box</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_forms_box"> + <property name="spacing">2</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="child"> + <object class="GtkGrid" id="zenity_forms_grid"> + <property name="margin-start">12</property> + <property name="margin-end">6</property> + <property name="margin_top">12</property> + <property name="margin_bottom">6</property> + <property name="row_spacing">6</property> + <property name="column_spacing">10</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </property> + <child type="label"> + <object class="GtkLabel" id="zenity_forms_text"> + <property name="label" translatable="yes">Forms dialog</property> + <attributes> + <attribute name="weight" value="bold"></attribute> + </attributes> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_info_dialog"> + <property name="title" translatable="yes">Information</property> + <property name="extra-child">zenity_info_box</property> + <responses> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_info_box"> + <property name="spacing">14</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-bottom">12</property> + <property name="margin-top">12</property> + <child> + <object class="GtkBox" id="hbox4"> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="zenity_info_image"> + <property name="halign">center</property> + <property name="icon_name">dialog-information</property> + <property name="icon_size">large</property> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_info_text"> + <property name="halign">center</property> + <property name="vexpand">true</property> + <property name="label" translatable="yes">All updates are complete.</property> + <property name="wrap">true</property> + <property name="selectable">true</property> + <property name="can-focus">false</property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_progress_dialog"> + <property name="title" translatable="yes">Progress</property> + <property name="extra-child">zenity_progress_box</property> + </object> + <object class="GtkBox" id="zenity_progress_box"> + <property name="spacing">2</property> + <child> + <object class="GtkBox" id="vbox7"> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="zenity_progress_text"> + <property name="valign">center</property> + <property name="label" translatable="yes">Running...</property> + <property name="wrap">1</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkProgressBar" id="zenity_progress_bar"> + <property name="valign">center</property> + <property name="hexpand">true</property> + <property name="pulse_step">0.10000000149</property> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_progress_time"> + <property name="valign">center</property> + <property name="xalign">0</property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_question_dialog"> + <property name="title" translatable="yes">Question</property> + <property name="extra-child">zenity_question_box</property> + <responses> + <response id="no" translatable="yes">_No</response> + <response id="yes" translatable="yes">_Yes</response> + </responses> + </object> + <object class="GtkBox" id="zenity_question_box"> + <property name="spacing">14</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-bottom">12</property> + <property name="margin-top">12</property> + <child> + <object class="GtkBox" id="hbox1"> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="zenity_question_image"> + <property name="icon_name">dialog-question</property> + <property name="icon_size">large</property> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_question_text"> + <property name="halign">center</property> + <property name="vexpand">true</property> + <property name="label" translatable="yes">Are you sure you want to proceed?</property> + <property name="wrap">true</property> + <property name="selectable">true</property> + <property name="can-focus">false</property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_tree_dialog"> + <property name="title" translatable="yes">Select items from the list</property> + <property name="default_width">300</property> + <property name="default_height">196</property> + <property name="extra-child">zenity_tree_box</property> + <property name="resizable">true</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_tree_box"> + <child> + <object class="GtkBox" id="vbox10"> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="zenity_tree_text"> + <property name="valign">center</property> + <property name="label" translatable="yes">Select items from the list below.</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkScrolledWindow" id="zenity_tree_window"> + <property name="hexpand">1</property> + <property name="vexpand">1</property> + <property name="child"> + <object class="GtkTreeView" id="zenity_tree_view"> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> + </object> + </property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_warning_dialog"> + <property name="title" translatable="yes">Warning</property> + <property name="resizable">false</property> + <property name="extra-child">zenity_warning_box</property> + <responses> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_warning_box"> + <property name="spacing">14</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-bottom">12</property> + <property name="margin-top">12</property> + <child> + <object class="GtkBox" id="hbox2"> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="zenity_warning_image"> + <property name="icon_name">dialog-warning</property> + <property name="icon_size">large</property> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_warning_text"> + <property name="halign">center</property> + <property name="vexpand">true</property> + <property name="hexpand">true</property> + <property name="label" translatable="yes">Are you sure you want to proceed?</property> + <property name="wrap">true</property> + <property name="selectable">true</property> + <property name="can-focus">false</property> + </object> + </child> + </object> + </child> + </object> + <object class="AdwMessageDialog" id="zenity_password_dialog"> + <property name="title" translatable="yes">Warning</property> + <property name="resizable">false</property> + <property name="extra-child">zenity_password_box</property> + <responses> + <response id="cancel" translatable="yes">_Cancel</response> + <response id="ok" translatable="yes">_OK</response> + </responses> + </object> + <object class="GtkBox" id="zenity_password_box"> + <property name="orientation">vertical</property> + <property name="spacing">14</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-bottom">12</property> + <property name="margin-top">12</property> + <child> + <object class="GtkBox"> + <property name="orientation">horizontal</property> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="zenity_password_image"> + <property name="icon_name">dialog-password</property> + <property name="icon_size">large</property> + </object> + </child> + <child> + <object class="GtkLabel" id="zenity_password_title"> + <property name="label" translatable="yes">Type your password</property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkGrid" id="zenity_password_grid"> + <property name="column-spacing">12</property> + <property name="row-spacing">6</property> + </object> + </child> + </object> <!-- !vbox --> </interface> |