diff --git a/src/option.c b/src/option.c new file mode 100644 index 0000000..b230633 --- /dev/null +++ b/src/option.c @@ -0,0 +1,1364 @@ +/* + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Glynn Foster + * Lucas Rocha + */ + +#include "option.h" + +/* General Options */ +gchar *zenity_general_dialog_title; +gchar *zenity_general_window_icon; +int zenity_general_width; +int zenity_general_height; +gchar *zenity_general_dialog_text; +gchar *zenity_general_separator; +gboolean zenity_general_editable; +gchar *zenity_general_uri; + +/* Calendar Dialog Options */ +gboolean zenity_calendar_active; +int zenity_calendar_day; +int zenity_calendar_month; +int zenity_calendar_year; +gchar *zenity_calendar_date_format; + +/* Entry Dialog Options */ +gboolean zenity_entry_active; +gchar *zenity_entry_entry_text; +gboolean zenity_entry_visible; + +/* Error Dialog Options */ +gboolean zenity_error_active; + +/* Info Dialog Options */ +gboolean zenity_info_active; + +/* File Selection Dialog Options */ +gboolean zenity_file_active; +gboolean zenity_file_multiple; +gboolean zenity_file_directory; +gboolean zenity_file_save; + +/* List Dialog Options */ +gboolean zenity_list_active; +gchar **zenity_list_columns; +gboolean zenity_list_checklist; +gboolean zenity_list_radiolist; +gchar *zenity_list_print_column; + +/* Notification Dialog Options */ +gboolean zenity_notification_active; +gboolean zenity_notification_listen; + +/* Progress Dialog Options */ +gboolean zenity_progress_active; +int zenity_progress_percentage; +gboolean zenity_progress_pulsate; +gboolean zenity_progress_auto_close; + +/* Question Dialog Options */ +gboolean zenity_question_active; + +/* Text Dialog Options */ +gboolean zenity_text_active; + +/* Warning Dialog Options */ +gboolean zenity_warning_active; + +/* Miscelaneus Options */ +gboolean zenity_misc_about; +gboolean zenity_misc_version; + +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") + }, + { + NULL + } +}; + +GOptionEntry calendar_options[] = { + { + "calendar", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_calendar_active, + N_("Display calendar dialog"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + "day", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_calendar_day, + N_("Set the calendar day"), + NULL + }, + { + "month", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_calendar_month, + N_("Set the calendar month"), + NULL + }, + { + "year", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_calendar_year, + N_("Set the calendar year"), + NULL + }, + { "date-format", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_calendar_date_format, + N_("Set the format for the returned date"), + NULL + }, + { + NULL + } +}; + +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', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + "entry-text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_entry_entry_text, + N_("Set the entry text"), + NULL + }, + { + "hide-text", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_entry_visible, + N_("Hide the entry text"), + NULL + }, + { + NULL + } +}; + + +GOptionEntry error_options[] = { + { + "error", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_error_active, + N_("Display error dialog"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + NULL + } +}; + +GOptionEntry info_options[] = { + { + "info", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_info_active, + N_("Display info dialog"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + NULL + } +}; + +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', + 0, + G_OPTION_ARG_FILENAME, + &zenity_general_uri, + N_("Set the filename"), + N_("FILENAME") + }, + { + "multiple", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_file_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', + 0, + G_OPTION_ARG_STRING, + &zenity_general_separator, + N_("Set output separator character"), + N_("SEPARATOR") + }, + { + NULL + } +}; + +GOptionEntry list_options[] = { + { + "list", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_list_active, + N_("Display list dialog"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + "column", + '\0', + 0, + G_OPTION_ARG_STRING_ARRAY, + &zenity_list_columns, + N_("Set the column header"), + NULL + }, + { + "checklist", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_list_checklist, + N_("Use check boxes for first column"), + NULL + }, + { + "radiolist", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_list_radiolist, + N_("Use radio buttons for first column"), + NULL + }, + { + "separator", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_separator, + N_("Set output separator character"), + N_("SEPARATOR") + }, + { + "editable", + '\0', + 0, + 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)"), + NULL + }, + { + NULL + } +}; + +GOptionEntry notification_options[] = { + { + "notification", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_notification_active, + N_("Display notification"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the notification text"), + NULL + }, + { + "listen", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_notification_listen, + N_("Listen for commands on stdin"), + NULL + }, + { + NULL + } +}; + +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', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + "percentage", + '\0', + 0, + G_OPTION_ARG_INT, + &zenity_progress_percentage, + N_("Set initial percentage"), + NULL + }, + { + "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 + }, + { + NULL + } +}; + +GOptionEntry question_options[] = { + { + "question", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_question_active, + N_("Display question dialog"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + NULL + } +}; + +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', + 0, + G_OPTION_ARG_FILENAME, + &zenity_general_uri, + N_("Open file"), + N_("FILENAME") + }, + { + "editable", + '\0', + 0, + G_OPTION_ARG_NONE, + &zenity_general_editable, + N_("Allow changes to text"), + NULL + }, + { + NULL + } +}; + +GOptionEntry warning_options[] = { + { + "warning", + '\0', + G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, + &zenity_warning_active, + N_("Display warning dialog"), + NULL + }, + { + "text", + '\0', + 0, + G_OPTION_ARG_STRING, + &zenity_general_dialog_text, + N_("Set the dialog text"), + NULL + }, + { + NULL + } +}; + +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 + } +}; + +ZenityParsingOptions *results; +GOptionContext *ctx; + +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->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); + results->notification_data = g_new0 (ZenityNotificationData, 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_calendar_date_format) + g_free (zenity_calendar_date_format); + + if (zenity_entry_entry_text) + g_free (zenity_entry_entry_text); + + if (zenity_list_columns) + g_strfreev (zenity_list_columns); + if (zenity_list_print_column) + g_free (zenity_list_print_column); + + g_option_context_free (ctx); +} + +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); + } +} + +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; + } +} + +/* Error callback */ +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 */ + +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_editable = FALSE; + zenity_general_uri = NULL; + + return TRUE; +} + +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 = 0; + zenity_calendar_month = 0; + zenity_calendar_year = 0; + + return TRUE; +} + +gboolean +zenity_entry_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_entry_active = FALSE; + zenity_entry_entry_text = NULL; + zenity_entry_visible = FALSE; + + return TRUE; +} + +gboolean +zenity_error_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_error_active = FALSE; + + return TRUE; +} + +gboolean +zenity_info_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_info_active = FALSE; + + return TRUE; +} + +gboolean +zenity_file_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_file_active = FALSE; + zenity_file_multiple = FALSE; + zenity_file_directory = FALSE; + zenity_file_save = FALSE; + + return TRUE; +} + +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_print_column = NULL; + + return TRUE; +} + +gboolean +zenity_notification_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_notification_active = FALSE; + zenity_notification_listen = FALSE; + + return TRUE; +} + +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; + + return TRUE; +} + +gboolean +zenity_question_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_question_active = FALSE; + + return TRUE; +} + +gboolean +zenity_text_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_text_active = FALSE; + + return TRUE; +} + +gboolean +zenity_warning_pre_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + zenity_warning_active = FALSE; + + return TRUE; +} + +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 */ + +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; + + return TRUE; +} + +gboolean +zenity_calendar_post_callback (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + int i; + + zenity_option_set_dialog_mode (zenity_calendar_active, MODE_CALENDAR); + + if (results->mode == MODE_CALENDAR) { + 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) + zenity_option_error (zenity_option_get_name (calendar_options, &zenity_calendar_day), + ERROR_SUPPORT); + + if (zenity_calendar_month) + zenity_option_error (zenity_option_get_name (calendar_options, &zenity_calendar_month), + ERROR_SUPPORT); + + if (zenity_calendar_year) + 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; +} + +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->visible = !zenity_entry_visible; + } else { + if (zenity_entry_entry_text) + zenity_option_error (zenity_option_get_name (entry_options, &zenity_entry_entry_text), + ERROR_SUPPORT); + + if (zenity_entry_visible) + zenity_option_error (zenity_option_get_name (entry_options, &zenity_entry_visible), + ERROR_SUPPORT); + } + + return TRUE; +} + +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->mode = ZENITY_MSG_ERROR; + } + + return TRUE; +} + +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->mode = ZENITY_MSG_INFO; + } + + return TRUE; +} + +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_file_multiple; + results->file_data->directory = zenity_file_directory; + results->file_data->save = zenity_file_save; + results->file_data->separator = zenity_general_separator; + } else { + if (zenity_file_multiple) + zenity_option_error (zenity_option_get_name (file_selection_options, &zenity_file_multiple), + ERROR_SUPPORT); + + 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); + } + + return TRUE; +} + +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->editable = zenity_general_editable; + results->tree_data->print_column = zenity_list_print_column; + results->tree_data->separator = zenity_general_separator; + } 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_print_column) + zenity_option_error (zenity_option_get_name (list_options, &zenity_list_print_column), + ERROR_SUPPORT); + } + + return TRUE; +} + +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; + } else { + if (zenity_notification_listen) + zenity_option_error (zenity_option_get_name (notification_options, &zenity_notification_listen), + ERROR_SUPPORT); + } + + return TRUE; +} + +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->percentage = zenity_progress_percentage; + } 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); + } + + return TRUE; +} + +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->mode = ZENITY_MSG_QUESTION; + } + + return TRUE; +} + +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; + } + + return TRUE; +} + +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->mode = ZENITY_MSG_WARNING; + } + + return TRUE; +} + +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; +} + +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, 0); + 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_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, 0); + 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_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, 0); + 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_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, 0); + 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_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, 0); + 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_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, 0); + 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_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, 0); + 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_context_add_group(tmp_ctx, a_group); + + /* Adds notification option entries */ + a_group = g_option_group_new("notification", + N_("Notication options"), + N_("Show notification options"), NULL, 0); + 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_context_add_group(tmp_ctx, a_group); + + /* Adds progress option entries */ + a_group = g_option_group_new("progress", + N_("Progress options"), + N_("Show progress options"), NULL, 0); + 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_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, 0); + 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_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, 0); + 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_context_add_group(tmp_ctx, a_group); + + /* Adds text option entries */ + a_group = g_option_group_new("text", + N_("Text options"), + N_("Show text options"), NULL, 0); + 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_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, 0); + 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_context_add_group(tmp_ctx, a_group); + + /* Adds gtk option entries */ + a_group = gtk_get_option_group(TRUE); + 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 (_("Syntax error\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) + zenity_option_error (zenity_option_get_name (list_options, &zenity_general_separator), 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); + + return results; +} diff --git a/src/option.h b/src/option.h new file mode 100644 index 0000000..63b2824 --- /dev/null +++ b/src/option.h @@ -0,0 +1,81 @@ +/* + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Glynn Foster + * Lucas Rocha + */ + +#ifndef OPTION_H +#define OPTION_H + +#include "zenity.h" +#include +#include +#ifdef HAVE_LOCALE_H +#include +#endif + +typedef enum { + MODE_CALENDAR, + MODE_ENTRY, + MODE_ERROR, + MODE_FILE, + MODE_LIST, + MODE_PROGRESS, + MODE_QUESTION, + MODE_TEXTINFO, + MODE_WARNING, + MODE_INFO, + MODE_NOTIFICATION, + MODE_ABOUT, + MODE_VERSION, + MODE_LAST +} ZenityDialogMode; + +typedef enum { + ERROR_SYNTAX, + ERROR_SUPPORT, + ERROR_DIALOG, + ERROR_LAST +} ZenityError; + +typedef struct { + ZenityDialogMode mode; + ZenityData *data; + + ZenityCalendarData *calendar_data; + ZenityMsgData *msg_data; + ZenityFileData *file_data; + ZenityEntryData *entry_data; + ZenityProgressData *progress_data; + ZenityTextData *text_data; + ZenityTreeData *tree_data; + ZenityNotificationData *notification_data; +} ZenityParsingOptions; + +void zenity_option_error (gchar *string, + ZenityError error); + +ZenityParsingOptions * zenity_option_parse (gint argc, + gchar **argv); + +void zenity_option_free (void); + +#endif /* OPTION_H */