diff options
author | Jeremy Bicha <jbicha@debian.org> | 2017-12-16 13:06:02 -0500 |
---|---|---|
committer | Jeremy Bicha <jbicha@debian.org> | 2017-12-16 13:06:02 -0500 |
commit | f821adc6c1844f3dbd59a5c51bb68fb80f295aa0 (patch) | |
tree | 28ff6652502c6adc1b661e0eb4dd3a8adbf60404 /src/option.c | |
parent | Initial upstream branch (diff) | |
parent | Release: Prepare for 3.26.0 (diff) | |
download | zenity-f821adc6c1844f3dbd59a5c51bb68fb80f295aa0.tar.gz zenity-f821adc6c1844f3dbd59a5c51bb68fb80f295aa0.tar.bz2 zenity-f821adc6c1844f3dbd59a5c51bb68fb80f295aa0.zip |
New upstream version 3.26.0
Diffstat (limited to 'src/option.c')
-rw-r--r-- | src/option.c | 2229 |
1 files changed, 2229 insertions, 0 deletions
diff --git a/src/option.c b/src/option.c new file mode 100644 index 00000000..61df34d3 --- /dev/null +++ b/src/option.c @@ -0,0 +1,2229 @@ +/* + * option.h + * + * Copyright (C) 2002 Sun Microsystems, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library 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. + * + * You should have received a copy of the GNU Library 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> + * Lucas Rocha <lucasr@im.ufba.br> + */ + +#include "config.h" + +#include "option.h" +#include <stdlib.h> +#include <string.h> +#include <time.h> + +/* General Options */ +static gchar *zenity_general_dialog_title; +static gchar *zenity_general_window_icon; +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 gboolean zenity_general_multiple; +static gboolean zenity_general_editable; +static gchar *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 gboolean zenity_general_modal; +static guintptr zenity_general_attach; +static gboolean zenity_general_dialog_ellipsize; + +/* Calendar Dialog Options */ +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; + +/* Entry Dialog Options */ +static gboolean zenity_entry_active; +static gchar *zenity_entry_entry_text; +static gboolean zenity_entry_hide_text; + +/* Error Dialog Options */ +static gboolean zenity_error_active; + +/* Info Dialog Options */ +static gboolean zenity_info_active; + +/* File Selection Dialog Options */ +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; + +/* List Dialog Options */ +static gboolean zenity_list_active; +static gchar **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 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; +static int zenity_progress_percentage; +static gboolean zenity_progress_pulsate; +static gboolean zenity_progress_auto_close; +static gboolean zenity_progress_auto_kill; +static gboolean zenity_progress_no_cancel; +static gboolean zenity_progress_time_remaining; + +/* Question Dialog Options */ +static gboolean zenity_question_active; +static gboolean zenity_question_default_cancel; +static gboolean zenity_question_switch; + +/* Text Dialog Options */ +static gboolean zenity_text_active; +static gchar *zenity_text_font; +static gchar *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; +#endif + +/* Warning Dialog Options */ +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 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 gboolean zenity_colorsel_show_palette; + +/* Password Dialog Options */ +static gboolean zenity_password_active; +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; + +/* 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}}; + +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-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 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 file_selection_options[] = + {{"file-selection", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_file_active, + N_ ("Display file selection dialog"), + NULL}, + {"filename", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_FILENAME, + &zenity_general_uri, + N_ ("Set the filename"), + N_ ("FILENAME")}, + {"multiple", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_multiple, + N_ ("Allow multiple files to be selected"), + NULL}, + {"directory", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_file_directory, + N_ ("Activate directory-only selection"), + NULL}, + {"save", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_file_save, + N_ ("Activate save mode"), + NULL}, + {"separator", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &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", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_file_filter, + N_ ("Set a filename filter"), + /* Help for file-filter argument (name and patterns for file + selection) */ + N_ ("NAME | PATTERN1 PATTERN2 ..."), + }, + {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 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 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 text_options[] = { + {"text-info", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_text_active, + N_ ("Display text information dialog"), + NULL}, + {"filename", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_FILENAME, + &zenity_general_uri, + N_ ("Open file"), + N_ ("FILENAME")}, + {"editable", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_general_editable, + N_ ("Allow changes to text"), + NULL}, + {"font", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_text_font, + N_ ("Set the text font"), + N_ ("TEXT")}, + {"checkbox", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_text_checkbox, + N_ ("Enable an I read and agree checkbox"), + N_ ("TEXT")}, +#ifdef HAVE_WEBKITGTK + {"html", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_text_enable_html, + N_ ("Enable HTML support"), + NULL}, + {"no-interaction", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_text_no_interaction, + N_ ("Do not enable user interaction with the WebView. Only works if " + "you use --html option"), + NULL}, + {"url", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_STRING, + &zenity_text_url, + N_ ("Set an URL instead of a file. Only works if you use --html " + "option"), + N_ ("URL")}, +#endif + {"auto-scroll", + '\0', + G_OPTION_FLAG_NOALIAS, + G_OPTION_ARG_NONE, + &zenity_text_auto_scroll, + N_ ("Auto scroll the text to the end. Only when text is captured from " + "stdin"), + 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 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", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_password_active, + N_ ("Display password dialog"), + NULL}, + {"username", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_password_show_username, + N_ ("Display the username option"), + NULL}, + {NULL}}; + +static GOptionEntry color_selection_options[] = { + {"color-selection", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_colorsel_active, + N_ ("Display color selection dialog"), + NULL}, + {"color", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_colorsel_color, + N_ ("Set the color"), + N_ ("VALUE")}, + {"show-palette", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_colorsel_show_palette, + N_ ("Show the palette"), + 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) { + + results = g_new0 (ZenityParsingOptions, 1); + + /* Initialize the various dialog structures */ + results->mode = MODE_LAST; + results->data = g_new0 (ZenityData, 1); + results->calendar_data = g_new0 (ZenityCalendarData, 1); + results->msg_data = g_new0 (ZenityMsgData, 1); + results->scale_data = g_new0 (ZenityScaleData, 1); + results->file_data = g_new0 (ZenityFileData, 1); + results->entry_data = g_new0 (ZenityEntryData, 1); + 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) { + if (results->mode == MODE_LAST) + results->mode = mode; + else + zenity_option_error (NULL, ERROR_DIALOG); + } +} + +static gchar * +zenity_option_get_name (GOptionEntry *entries, gpointer arg_data) { + int i; + + for (i = 1; entries[i].long_name != NULL; i++) { + if (entries[i].arg_data == arg_data) + return (gchar *) entries[i].long_name; + } + return NULL; +} + +/* Forms callback */ +static gboolean +zenity_forms_callback (const gchar *option_name, const gchar *value, + gpointer data, GError **error) { + ZenityFormsValue *forms_value = g_new0 (ZenityFormsValue, 1); + + forms_value->option_value = g_strdup (value); + + if (g_strcmp0 (option_name, "--add-entry") == 0) + forms_value->type = ZENITY_FORMS_ENTRY; + else if (g_strcmp0 (option_name, "--add-calendar") == 0) + forms_value->type = ZENITY_FORMS_CALENDAR; + else if (g_strcmp0 (option_name, "--add-password") == 0) + forms_value->type = ZENITY_FORMS_PASSWORD; + else if (g_strcmp0 (option_name, "--add-list") == 0) + forms_value->type = ZENITY_FORMS_LIST; + else if (g_strcmp0 (option_name, "--add-combo") == 0) + forms_value->type = ZENITY_FORMS_COMBO; + + results->forms_data->list = + g_slist_append (results->forms_data->list, forms_value); + + return TRUE; +} + +/* Error callback */ +static void +zenity_option_error_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_error (NULL, ERROR_SYNTAX); +} + +/* Pre parse callbacks set the default option values */ + +static gboolean +zenity_general_pre_callback (GOptionContext *context, GOptionGroup *group, + 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; + zenity_general_separator = g_strdup ("|"); + zenity_general_multiple = FALSE; + zenity_general_editable = FALSE; + zenity_general_uri = NULL; + zenity_general_ok_button = NULL; + zenity_general_cancel_button = NULL; + zenity_general_extra_buttons = NULL; + zenity_general_dialog_no_wrap = FALSE; + 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) { + zenity_calendar_active = FALSE; + zenity_calendar_date_format = NULL; + zenity_calendar_day = -1; + zenity_calendar_month = -1; + zenity_calendar_year = -1; + + return TRUE; +} + +static gboolean +zenity_entry_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_entry_active = FALSE; + zenity_entry_entry_text = NULL; + zenity_entry_hide_text = FALSE; + + return TRUE; +} + +static gboolean +zenity_error_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_error_active = FALSE; + + return TRUE; +} + +static gboolean +zenity_info_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_info_active = FALSE; + + return TRUE; +} + +static gboolean +zenity_file_pre_callback (GOptionContext *context, GOptionGroup *group, + 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; +} + +static gboolean +zenity_list_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_list_active = FALSE; + zenity_list_columns = NULL; + zenity_list_checklist = FALSE; + zenity_list_radiolist = FALSE; + zenity_list_imagelist = FALSE; + zenity_list_hide_header = FALSE; + zenity_list_print_column = NULL; + zenity_list_hide_column = NULL; + zenity_list_mid_search = FALSE; + + return TRUE; +} + +#ifdef HAVE_LIBNOTIFY +static gboolean +zenity_notification_pre_callback (GOptionContext *context, GOptionGroup *group, + 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) { + zenity_progress_active = FALSE; + zenity_progress_percentage = 0; + zenity_progress_pulsate = FALSE; + zenity_progress_auto_close = FALSE; + 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) { + 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) { + zenity_text_active = FALSE; + zenity_text_font = NULL; + zenity_text_checkbox = NULL; + zenity_text_auto_scroll = FALSE; +#ifdef HAVE_WEBKITGTK + zenity_text_enable_html = FALSE; + 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) { + zenity_warning_active = FALSE; + + return TRUE; +} + +static gboolean +zenity_scale_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_scale_active = FALSE; + zenity_scale_value = 0; + zenity_scale_min_value = 0; + zenity_scale_max_value = 100; + zenity_scale_step = 1; + zenity_scale_print_partial = FALSE; + zenity_scale_hide_value = FALSE; + + return TRUE; +} + +static gboolean +zenity_color_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_colorsel_active = FALSE; + zenity_colorsel_color = NULL; + zenity_colorsel_show_palette = FALSE; + + return TRUE; +} + +static gboolean +zenity_password_pre_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_password_active = FALSE; + zenity_password_show_username = FALSE; + + return TRUE; +} + +static gboolean +zenity_forms_pre_callback (GOptionContext *context, GOptionGroup *group, + 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) { + zenity_misc_about = FALSE; + zenity_misc_version = FALSE; + + return TRUE; +} + +/* Post parse callbacks assign the option values to + parsing result and makes some post condition tests */ + +static gboolean +zenity_general_post_callback (GOptionContext *context, GOptionGroup *group, + 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; + results->data->ok_label = zenity_general_ok_button; + 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) { + zenity_option_set_dialog_mode (zenity_calendar_active, MODE_CALENDAR); + + if (results->mode == MODE_CALENDAR) { + struct tm *t; + time_t current_time; + + time (¤t_time); + t = localtime (¤t_time); + + if (zenity_calendar_day < 0) + zenity_calendar_day = t->tm_mday; + if (zenity_calendar_month < 0) + zenity_calendar_month = t->tm_mon + 1; + if (zenity_calendar_year < 0) + zenity_calendar_year = t->tm_year + 1900; + + results->calendar_data->dialog_text = zenity_general_dialog_text; + results->calendar_data->day = zenity_calendar_day; + results->calendar_data->month = zenity_calendar_month; + results->calendar_data->year = zenity_calendar_year; + + if (zenity_calendar_date_format) + results->calendar_data->date_format = zenity_calendar_date_format; + 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), + ERROR_SUPPORT); + + 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), + ERROR_SUPPORT); + + if (zenity_calendar_date_format) + zenity_option_error (zenity_option_get_name (calendar_options, + &zenity_calendar_date_format), + ERROR_SUPPORT); + } + + return TRUE; +} + +static gboolean +zenity_entry_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_entry_active, 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), + ERROR_SUPPORT); + + if (zenity_entry_hide_text) + zenity_option_error ( + zenity_option_get_name (entry_options, &zenity_entry_hide_text), + ERROR_SUPPORT); + } + + return TRUE; +} + +static gboolean +zenity_error_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_error_active, 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->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; + } + + return TRUE; +} + +static gboolean +zenity_info_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_info_active, 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->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; + } + + return TRUE; +} + +static gboolean +zenity_file_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_file_active, 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) + zenity_option_error (zenity_option_get_name (file_selection_options, + &zenity_file_directory), + ERROR_SUPPORT); + + if (zenity_file_save) + zenity_option_error (zenity_option_get_name ( + file_selection_options, &zenity_file_save), + ERROR_SUPPORT); + + if (zenity_file_filter) + zenity_option_error (zenity_option_get_name (file_selection_options, + &zenity_file_filter), + ERROR_SUPPORT); + } + + return TRUE; +} + +static gboolean +zenity_list_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + int i = 0; + gchar *column; + + zenity_option_set_dialog_mode (zenity_list_active, MODE_LIST); + + if (results->mode == MODE_LIST) { + results->tree_data->dialog_text = zenity_general_dialog_text; + + if (zenity_list_columns) { + column = zenity_list_columns[0]; + while (column != NULL) { + results->tree_data->columns = + g_slist_append (results->tree_data->columns, column); + column = zenity_list_columns[++i]; + } + } + + results->tree_data->checkbox = zenity_list_checklist; + results->tree_data->radiobox = zenity_list_radiolist; + results->tree_data->imagebox = zenity_list_imagelist; + results->tree_data->multi = zenity_general_multiple; + results->tree_data->editable = zenity_general_editable; + results->tree_data->print_column = zenity_list_print_column; + results->tree_data->hide_column = zenity_list_hide_column; + 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 { + if (zenity_list_columns) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_list_columns), + ERROR_SUPPORT); + + if (zenity_list_checklist) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_list_checklist), + ERROR_SUPPORT); + + if (zenity_list_radiolist) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_list_radiolist), + ERROR_SUPPORT); + + if (zenity_list_imagelist) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_list_imagelist), + ERROR_SUPPORT); + + if (zenity_list_print_column) + zenity_option_error (zenity_option_get_name ( + list_options, &zenity_list_print_column), + ERROR_SUPPORT); + + if (zenity_list_hide_column) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_list_hide_column), + ERROR_SUPPORT); + + if (zenity_list_hide_header) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_list_hide_header), + ERROR_SUPPORT); + if (zenity_list_mid_search) + zenity_option_error ( + 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); + + 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) + zenity_option_error (zenity_option_get_name (notification_options, + &zenity_notification_listen), + ERROR_SUPPORT); + } + + return TRUE; +} +#endif + +static gboolean +zenity_progress_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_progress_active, 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; + results->progress_data->autokill = zenity_progress_auto_kill; + 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) + zenity_option_error (zenity_option_get_name (progress_options, + &zenity_progress_pulsate), + ERROR_SUPPORT); + + if (zenity_progress_percentage) + zenity_option_error (zenity_option_get_name (progress_options, + &zenity_progress_percentage), + ERROR_SUPPORT); + + if (zenity_progress_auto_close) + zenity_option_error (zenity_option_get_name (progress_options, + &zenity_progress_auto_close), + ERROR_SUPPORT); + + if (zenity_progress_auto_kill) + zenity_option_error (zenity_option_get_name (progress_options, + &zenity_progress_auto_kill), + ERROR_SUPPORT); + + if (zenity_progress_no_cancel) + zenity_option_error (zenity_option_get_name (progress_options, + &zenity_progress_no_cancel), + ERROR_SUPPORT); + + if (zenity_progress_time_remaining) + zenity_option_error (zenity_option_get_name (progress_options, + &zenity_progress_time_remaining), + ERROR_SUPPORT); + } + + return TRUE; +} + +static gboolean +zenity_question_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_question_active, 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; + if (zenity_question_switch) + results->msg_data->mode = ZENITY_MSG_SWITCH; + else + results->msg_data->mode = ZENITY_MSG_QUESTION; + 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; + results->msg_data->default_cancel = zenity_question_default_cancel; + } + 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) { + zenity_option_set_dialog_mode (zenity_text_active, 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; + results->text_data->font = zenity_text_font; + results->text_data->checkbox = zenity_text_checkbox; + results->text_data->auto_scroll = zenity_text_auto_scroll; +#ifdef HAVE_WEBKITGTK + results->text_data->html = zenity_text_enable_html; + 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); +#ifdef HAVE_WEBKITGTK + if (zenity_text_enable_html) + zenity_option_error ( + zenity_option_get_name (text_options, &zenity_text_enable_html), + ERROR_SUPPORT); +#endif + } + return TRUE; +} + +static gboolean +zenity_warning_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_warning_active, 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->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; + } + + return TRUE; +} + +static gboolean +zenity_scale_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_scale_active, 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; + results->scale_data->max_value = zenity_scale_max_value; + results->scale_data->step = zenity_scale_step; + results->scale_data->print_partial = zenity_scale_print_partial; + results->scale_data->hide_value = zenity_scale_hide_value; + } + + return TRUE; +} + +static gboolean +zenity_color_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_colorsel_active, 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); + } + + return TRUE; +} + +static gboolean +zenity_forms_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + gchar *values; + int i = 0; + + zenity_option_set_dialog_mode (zenity_forms_active, 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) { + values = zenity_forms_list_values[0]; + while (values != NULL) { + results->forms_data->list_values = + g_slist_append (results->forms_data->list_values, values); + values = zenity_forms_list_values[++i]; + } + } + if (zenity_forms_column_values) { + i = 0; + values = zenity_forms_column_values[0]; + while (values != NULL) { + results->forms_data->column_values = + g_slist_append (results->forms_data->column_values, values); + values = zenity_forms_list_values[++i]; + } + } else + results->forms_data->column_values = + g_slist_append (NULL, "column"); + + if (zenity_forms_combo_values) { + i = 0; + values = zenity_forms_combo_values[0]; + while (values != NULL) { + results->forms_data->combo_values = + g_slist_append (results->forms_data->combo_values, values); + values = zenity_forms_combo_values[++i]; + } + } + if (zenity_forms_date_format) + results->forms_data->date_format = zenity_forms_date_format; + else + results->forms_data->date_format = + g_locale_to_utf8 (nl_langinfo (D_FMT), -1, NULL, NULL, NULL); + } else { + if (zenity_forms_date_format) + zenity_option_error (zenity_option_get_name (forms_dialog_options, + &zenity_forms_date_format), + ERROR_SUPPORT); + if (zenity_forms_list_values) + 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), + ERROR_SUPPORT); + if (zenity_forms_combo_values) + zenity_option_error (zenity_option_get_name (forms_dialog_options, + &zenity_forms_combo_values), + ERROR_SUPPORT); + if (zenity_forms_show_header) + zenity_option_error (zenity_option_get_name (forms_dialog_options, + &zenity_forms_show_header), + ERROR_SUPPORT); + } + + return TRUE; +} + +static gboolean +zenity_password_post_callback (GOptionContext *context, GOptionGroup *group, + 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); + } + + return TRUE; +} + +static gboolean +zenity_misc_post_callback (GOptionContext *context, GOptionGroup *group, + gpointer data, GError **error) { + zenity_option_set_dialog_mode (zenity_misc_about, MODE_ABOUT); + zenity_option_set_dialog_mode (zenity_misc_version, MODE_VERSION); + + return TRUE; +} + +static GOptionContext * +zenity_create_context (void) { + GOptionContext *tmp_ctx; + GOptionGroup *a_group; + + tmp_ctx = g_option_context_new (NULL); + + /* Adds general option entries */ + a_group = g_option_group_new ("general", + N_ ("General options"), + N_ ("Show general options"), + 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_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 calendar option entries */ + a_group = g_option_group_new ("calendar", + N_ ("Calendar options"), + N_ ("Show calendar options"), + 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_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 entry option entries */ + a_group = g_option_group_new ("entry", + N_ ("Text entry options"), + N_ ("Show text entry options"), + 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_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); + 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); + 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 info option entries */ + 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); + 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 file selection option entries */ + a_group = g_option_group_new ("file-selection", + N_ ("File selection options"), + N_ ("Show file selection options"), + NULL, + NULL); + g_option_group_add_entries (a_group, file_selection_options); + g_option_group_set_parse_hooks ( + a_group, zenity_file_pre_callback, zenity_file_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 list option entries */ + a_group = g_option_group_new ( + "list", N_ ("List options"), N_ ("Show list options"), NULL, NULL); + g_option_group_add_entries (a_group, list_options); + g_option_group_set_parse_hooks ( + a_group, zenity_list_pre_callback, zenity_list_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); + +#ifdef HAVE_LIBNOTIFY + /* Adds notification option entries */ + a_group = g_option_group_new ("notification", + N_ ("Notification icon options"), + N_ ("Show notification icon options"), + NULL, + NULL); + g_option_group_add_entries (a_group, notification_options); + g_option_group_set_parse_hooks (a_group, + zenity_notification_pre_callback, + zenity_notification_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); +#endif + + /* Adds progress option entries */ + a_group = g_option_group_new ("progress", + N_ ("Progress options"), + N_ ("Show progress options"), + NULL, + NULL); + g_option_group_add_entries (a_group, progress_options); + g_option_group_set_parse_hooks ( + a_group, zenity_progress_pre_callback, zenity_progress_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 question option entries */ + a_group = g_option_group_new ("question", + N_ ("Question options"), + N_ ("Show question options"), + 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_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 warning option entries */ + a_group = g_option_group_new ("warning", + N_ ("Warning options"), + N_ ("Show warning options"), + 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_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); + 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); + 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 text option entries */ + a_group = g_option_group_new ("text-info", + N_ ("Text information options"), + N_ ("Show text information options"), + NULL, + NULL); + g_option_group_add_entries (a_group, text_options); + g_option_group_set_parse_hooks ( + a_group, zenity_text_pre_callback, zenity_text_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 color selection option entries */ + a_group = g_option_group_new ("color-selection", + N_ ("Color selection options"), + N_ ("Show color selection options"), + 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_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 password dialog option entries */ + a_group = g_option_group_new ("password", + N_ ("Password dialog options"), + N_ ("Show password dialog options"), + 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_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 forms dialog option entries */ + a_group = g_option_group_new ("forms", + N_ ("Forms dialog options"), + N_ ("Show forms dialog options"), + 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_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 misc option entries */ + a_group = g_option_group_new ("misc", + N_ ("Miscellaneous options"), + N_ ("Show miscellaneous options"), + 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_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); + + return tmp_ctx; +} + +void +zenity_option_error (gchar *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) { + GError *error = NULL; + + zenity_option_init (); + + ctx = zenity_create_context (); + + g_option_context_parse (ctx, &argc, &argv, &error); + + /* Some option pointer a shared among more than one group and don't + have their post condition tested. This test is done here. */ + + if (zenity_general_dialog_text) + if (results->mode == MODE_ABOUT || results->mode == MODE_VERSION) + zenity_option_error (zenity_option_get_name (calendar_options, + &zenity_general_dialog_text), + ERROR_SUPPORT); + + if (strcmp (zenity_general_separator, "|") != 0) + if (results->mode != MODE_LIST && results->mode != MODE_FILE && + results->mode != MODE_FORMS) + zenity_option_error (zenity_option_get_name ( + list_options, &zenity_general_separator), + ERROR_SUPPORT); + + if (zenity_general_multiple) + if (results->mode != MODE_FILE && results->mode != MODE_LIST) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_general_multiple), + ERROR_SUPPORT); + + if (zenity_general_editable) + if (results->mode != MODE_TEXTINFO && results->mode != MODE_LIST) + zenity_option_error ( + zenity_option_get_name (list_options, &zenity_general_editable), + ERROR_SUPPORT); + + if (zenity_general_uri) + if (results->mode != MODE_FILE && results->mode != MODE_TEXTINFO) + zenity_option_error ( + zenity_option_get_name (text_options, &zenity_general_uri), + ERROR_SUPPORT); + + if (zenity_general_ok_button) + if (results->mode == MODE_FILE) + zenity_option_error (zenity_option_get_name (general_options, + &zenity_general_ok_button), + ERROR_SUPPORT); + + if (zenity_general_cancel_button) + if (results->mode == MODE_FILE || results->mode == MODE_ERROR || + results->mode == MODE_WARNING || results->mode == MODE_INFO) + zenity_option_error (zenity_option_get_name (general_options, + &zenity_general_cancel_button), + ERROR_SUPPORT); + + if (zenity_general_dialog_no_wrap) + if (results->mode != MODE_INFO && results->mode != MODE_ERROR && + results->mode != MODE_QUESTION && results->mode != MODE_WARNING && + results->mode != MODE_TEXTINFO) + zenity_option_error (zenity_option_get_name (text_options, + &zenity_general_dialog_no_wrap), + ERROR_SUPPORT); + + if (zenity_general_dialog_ellipsize) + if (results->mode != MODE_INFO && results->mode != MODE_ERROR && + results->mode != MODE_QUESTION && results->mode != MODE_WARNING) + zenity_option_error (zenity_option_get_name (text_options, + &zenity_general_dialog_ellipsize), + ERROR_SUPPORT); + + return results; +} |