diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | src/calendar.c | 2 | ||||
-rw-r--r-- | src/entry.c | 4 | ||||
-rw-r--r-- | src/fileselection.c | 2 | ||||
-rw-r--r-- | src/main.c | 589 | ||||
-rw-r--r-- | src/msg.c | 2 | ||||
-rw-r--r-- | src/progress.c | 5 | ||||
-rw-r--r-- | src/text.c | 1 | ||||
-rw-r--r-- | src/tree.c | 27 | ||||
-rw-r--r-- | src/zenity.h | 2 |
11 files changed, 365 insertions, 282 deletions
@@ -1,3 +1,14 @@ +2003-04-13 Glynn Foster <glynn.foster@sun.com> + + * src/calendar.c, src/entry.c, src/fileselection.c, + src/main.c, src/msg.c, src/progress.c, src/text.c, + src/tree.c, src/zenity.h: Finish off the indentation cleanup. + Add new '--width' and '--height' options to the general options. + Fix up the radio list view, so that we can now act like a radio + button group. + + * TODO: Update + 2003-04-08 Alessio Frusciante <algol@firenze.linux.it> * configure.in: Added "it" (Italian) to ALL_LINGUAS. @@ -1 +1,3 @@ +* List dialog should read data from stdin +* Fix up progress dialog so that it actually works * Add some accessibility I guess diff --git a/src/calendar.c b/src/calendar.c index fc1c014d..1316d518 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -63,6 +63,8 @@ zenity_calendar (ZenityData *data, ZenityCalendarData *cal_data) else zenity_util_set_window_icon (dialog, ZENITY_IMAGE_FULLPATH ("zenity-calendar.png")); + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); + text = glade_xml_get_widget (glade_dialog, "zenity_calendar_text"); if (cal_data->dialog_text) diff --git a/src/entry.c b/src/entry.c index 0ccd4c0e..a46fd613 100644 --- a/src/entry.c +++ b/src/entry.c @@ -58,7 +58,9 @@ zenity_entry (ZenityData *data, ZenityEntryData *entry_data) zenity_util_set_window_icon (dialog, data->window_icon); else zenity_util_set_window_icon (dialog, ZENITY_IMAGE_FULLPATH ("zenity-entry.png")); - + + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); + text = glade_xml_get_widget (glade_dialog, "zenity_entry_text"); if (entry_data->dialog_text) diff --git a/src/fileselection.c b/src/fileselection.c index 6655f925..ec46f0c1 100644 --- a/src/fileselection.c +++ b/src/fileselection.c @@ -57,6 +57,8 @@ void zenity_fileselection (ZenityData *data, ZenityFileData *file_data) else zenity_util_set_window_icon (dialog, ZENITY_IMAGE_FULLPATH ("zenity-file.png")); + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); + if (file_data->uri) gtk_file_selection_set_filename (GTK_FILE_SELECTION (dialog), file_data->uri); @@ -76,6 +76,8 @@ enum { OPTION_WARNING, OPTION_TITLE, OPTION_ICON, + OPTION_WIDTH, + OPTION_HEIGHT, OPTION_CALENDARTEXT, OPTION_DAY, OPTION_MONTH, @@ -86,6 +88,7 @@ enum { OPTION_ERRORTEXT, OPTION_INFOTEXT, OPTION_FILENAME, + OPTION_TEXTFILENAME, OPTION_COLUMN, OPTION_SEPERATOR, OPTION_LISTEDIT, @@ -95,7 +98,6 @@ enum { OPTION_PERCENTAGE, OPTION_PULSATE, OPTION_QUESTIONTEXT, - OPTION_TEXTFILE, OPTION_WARNINGTEXT, OPTION_ABOUT, OPTION_VERSION, @@ -239,6 +241,24 @@ struct poptOption general_options[] = { N_("Set the window icon"), N_("ICONPATH") }, + { + "width", + '\0', + POPT_ARG_STRING, + NULL, + OPTION_WIDTH, + N_("Set the width"), + N_("WIDTH") + }, + { + "height", + '\0', + POPT_ARG_STRING, + NULL, + OPTION_HEIGHT, + N_("Set the height"), + N_("HEIGHT") + }, POPT_TABLEEND }; @@ -531,7 +551,7 @@ struct poptOption text_options[] = { '\0', POPT_ARG_STRING, NULL, - OPTION_TEXTFILE, + OPTION_TEXTFILENAME, N_("Open file"), N_("FILENAME") }, @@ -886,6 +906,8 @@ zenity_init_parsing_options (void) { results->tree_data = g_new0 (ZenityTreeData, 1); /* Give some sensible defaults */ + results->data->width = -1; + results->data->height = -1; results->calendar_data->date_format = g_strdup (nl_langinfo (D_FMT)); results->calendar_data->day = 0; results->calendar_data->month = 0; @@ -979,7 +1001,7 @@ main (gint argc, gchar **argv) { if (nextopt != -1) { g_printerr (_("%s in an invalid option for this dialog. See zenity --help for more details\n"), - poptBadOption (ctx, 0)); + poptBadOption (ctx, 0)); zenity_free_parsing_options (); exit (-1); } @@ -1070,290 +1092,303 @@ zenity_parse_options_callback (poptContext ctx, static gint parse_option_file = 0; static gint parse_option_editable = 0; - if (reason == POPT_CALLBACK_REASON_POST) { - return; - } - else if (reason != POPT_CALLBACK_REASON_OPTION) - return; - - switch (opt->val & POPT_ARG_MASK) { - - case OPTION_CALENDAR: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_CALENDAR; - break; - case OPTION_ENTRY: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_ENTRY; - break; - case OPTION_ERROR: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_ERROR; - results->msg_data->mode = ZENITY_MSG_ERROR; - break; - case OPTION_INFO: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_INFO; - results->msg_data->mode = ZENITY_MSG_INFO; - break; - case OPTION_FILE: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_FILE; - break; - case OPTION_LIST: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_LIST; - break; - case OPTION_PROGRESS: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_PROGRESS; - break; - case OPTION_QUESTION: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_QUESTION; - results->msg_data->mode = ZENITY_MSG_QUESTION; - break; - case OPTION_TEXTINFO: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_TEXTINFO; - break; - case OPTION_WARNING: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); - - results->mode = MODE_WARNING; - results->msg_data->mode = ZENITY_MSG_WARNING; - break; - case OPTION_TITLE: - if (results->data->dialog_title != NULL) - zenity_error ("--title", ERROR_DUPLICATE); - - results->data->dialog_title = g_strdup (arg); - break; - case OPTION_ICON: - if (results->data->window_icon != NULL) - zenity_error ("--window-icon", ERROR_DUPLICATE); - - results->data->window_icon = g_strdup (arg); - break; - case OPTION_CALENDARTEXT: - case OPTION_ENTRYTEXT: - case OPTION_ERRORTEXT: - case OPTION_QUESTIONTEXT: - case OPTION_PROGRESSTEXT: - case OPTION_WARNINGTEXT: - - /* FIXME: This is an ugly hack because of the way the poptOptions are - * ordered above. When you try and use an --option more than once - * parse_options_callback gets called for each option. Suckage - */ - - if (parse_option_text > 6) - zenity_error ("--text", ERROR_DUPLICATE); - - switch (results->mode) { - case MODE_CALENDAR: - results->calendar_data->dialog_text = g_strdup (arg); - break; - case MODE_ENTRY: - results->entry_data->dialog_text = g_strdup (arg); - break; - case MODE_ERROR: - case MODE_QUESTION: - case MODE_WARNING: - case MODE_INFO: - results->msg_data->dialog_text = g_strdup (arg); - break; - case MODE_PROGRESS: - results->progress_data->dialog_text = g_strdup (arg); - break; - default: - zenity_error ("--text", ERROR_SUPPORT); - } - parse_option_text++; - break; - case OPTION_DAY: - if (results->mode != MODE_CALENDAR) - zenity_error ("--day", ERROR_SUPPORT); + if (reason == POPT_CALLBACK_REASON_POST) + return; + else if (reason != POPT_CALLBACK_REASON_OPTION) + return; - if (results->calendar_data->day > 0) - zenity_error ("--day", ERROR_DUPLICATE); + switch (opt->val & POPT_ARG_MASK) { - results->calendar_data->day = atoi (arg); - break; - case OPTION_MONTH: - if (results->mode != MODE_CALENDAR) - zenity_error ("--month", ERROR_SUPPORT); + case OPTION_CALENDAR: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - if (results->calendar_data->month > 0) - zenity_error ("--day", ERROR_DUPLICATE); - - results->calendar_data->month = atoi (arg); - break; - case OPTION_YEAR: - if (results->mode != MODE_CALENDAR) - zenity_error ("--year", ERROR_SUPPORT); - - if (results->calendar_data->year > 0) - zenity_error ("--year", ERROR_DUPLICATE); - - results->calendar_data->year = atoi (arg); - break; - case OPTION_DATEFORMAT: - if (results->mode != MODE_CALENDAR) - zenity_error ("--date-format", ERROR_SUPPORT); - - if (parse_option_dateformat) - zenity_error ("--date-format", ERROR_DUPLICATE); - - results->calendar_data->date_format = g_strdup (arg); - parse_option_dateformat = TRUE; - break; - case OPTION_INPUTTEXT: - if (results->mode != MODE_ENTRY) - zenity_error ("--entry-text", ERROR_SUPPORT); - - if (results->entry_data->entry_text != NULL) - zenity_error ("--entry-text", ERROR_DUPLICATE); - - results->entry_data->entry_text = g_strdup (arg); - break; - case OPTION_HIDETEXT: - if (results->mode != MODE_ENTRY) - zenity_error ("--hide-text", ERROR_SUPPORT); - - if (!results->entry_data->visible) - zenity_error ("--hide-text", ERROR_DUPLICATE); - - results->entry_data->visible = FALSE; - break; - case OPTION_LISTEDIT: - case OPTION_TEXTEDIT: - - /* FIXME: This is an ugly hack because of the way the poptOptions are - * ordered above. When you try and use an --option more than once - * parse_options_callback gets called for each option. Suckage - */ - - if (parse_option_file > 2) - zenity_error ("--editable", ERROR_DUPLICATE); - - switch (results->mode) { - case MODE_TEXTINFO: - results->text_data->editable = TRUE; - break; - case MODE_LIST: - results->tree_data->editable = TRUE; - break; - default: - zenity_error ("--editable", ERROR_SUPPORT); - } - parse_option_editable++; - break; - case OPTION_FILENAME: - case OPTION_TEXTFILE: - - /* FIXME: This is an ugly hack because of the way the poptOptions are - * ordered above. When you try and use an --option more than once - * parse_options_callback gets called for each option. Suckage - */ + results->mode = MODE_CALENDAR; + break; + case OPTION_ENTRY: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - if (parse_option_file > 2) - zenity_error ("--filename", ERROR_DUPLICATE); + results->mode = MODE_ENTRY; + break; + case OPTION_ERROR: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - switch (results->mode) { - case MODE_FILE: - results->file_data->uri = g_strdup (arg); - break; - case MODE_TEXTINFO: - results->text_data->uri = g_strdup (arg); - break; - default: - zenity_error ("--filename", ERROR_SUPPORT); - } - parse_option_file++; - break; - case OPTION_COLUMN: - if (results->mode != MODE_LIST) - zenity_error ("--column", ERROR_SUPPORT); + results->mode = MODE_ERROR; + results->msg_data->mode = ZENITY_MSG_ERROR; + break; + case OPTION_INFO: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - results->tree_data->columns = g_slist_append (results->tree_data->columns, g_strdup (arg)); - break; - case OPTION_CHECKLIST: - if (results->mode != MODE_LIST) - zenity_error ("--checkbox", ERROR_SUPPORT); + results->mode = MODE_INFO; + results->msg_data->mode = ZENITY_MSG_INFO; + break; + case OPTION_FILE: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - if (results->tree_data->checkbox) - zenity_error ("--checkbox", ERROR_DUPLICATE); + results->mode = MODE_FILE; + break; + case OPTION_LIST: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - results->tree_data->checkbox = TRUE; - break; - case OPTION_RADIOLIST: - if (results->mode != MODE_LIST) - zenity_error ("--radiobox", ERROR_SUPPORT); + results->mode = MODE_LIST; + break; + case OPTION_PROGRESS: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - if (results->tree_data->radiobox) - zenity_error ("--radiobox", ERROR_DUPLICATE); - - results->tree_data->radiobox = TRUE; - break; - case OPTION_SEPERATOR: - if (results->mode != MODE_LIST) - zenity_error ("--separator", ERROR_SUPPORT); - - if (parse_option_separator) - zenity_error ("--separator", ERROR_DUPLICATE); - - results->tree_data->separator = g_strdup (arg); - parse_option_separator = TRUE; - break; - case OPTION_PERCENTAGE: - if (results->mode != MODE_PROGRESS) - zenity_error ("--percentage", ERROR_SUPPORT); + results->mode = MODE_PROGRESS; + break; + case OPTION_QUESTION: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - if (results->progress_data->percentage > -1) - zenity_error ("--percentage", ERROR_DUPLICATE); - - results->progress_data->percentage = atoi (arg); - break; - case OPTION_PULSATE: - if (results->mode != MODE_PROGRESS) - zenity_error ("--pulsate", ERROR_SUPPORT); - - results->progress_data->pulsate = TRUE; - break; - case OPTION_ABOUT: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); + results->mode = MODE_QUESTION; + results->msg_data->mode = ZENITY_MSG_QUESTION; + break; + case OPTION_TEXTINFO: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - results->mode = MODE_ABOUT; - break; - case OPTION_VERSION: - if (results->mode != MODE_LAST) - zenity_error (NULL, ERROR_DIALOG); + results->mode = MODE_TEXTINFO; + break; + case OPTION_WARNING: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); - g_print ("%s\n", VERSION); - exit (0); - break; - default: - break; - } + results->mode = MODE_WARNING; + results->msg_data->mode = ZENITY_MSG_WARNING; + break; + case OPTION_TITLE: + if (results->data->dialog_title != NULL) + zenity_error ("--title", ERROR_DUPLICATE); + + results->data->dialog_title = g_strdup (arg); + break; + case OPTION_ICON: + if (results->data->window_icon != NULL) + zenity_error ("--window-icon", ERROR_DUPLICATE); + + results->data->window_icon = g_strdup (arg); + break; + case OPTION_WIDTH: + if (results->data->width != -1) + zenity_error ("--width", ERROR_DUPLICATE); + + results->data->width = atoi (arg); + break; + case OPTION_HEIGHT: + if (results->data->height != -1) + zenity_error ("--height", ERROR_DUPLICATE); + + results->data->height = atoi (arg); + break; + case OPTION_CALENDARTEXT: + case OPTION_ENTRYTEXT: + case OPTION_ERRORTEXT: + case OPTION_QUESTIONTEXT: + case OPTION_PROGRESSTEXT: + case OPTION_WARNINGTEXT: + + /* FIXME: This is an ugly hack because of the way the poptOptions are + * ordered above. When you try and use an --option more than once + * parse_options_callback gets called for each option. Suckage + */ + + if (parse_option_text > 6) + zenity_error ("--text", ERROR_DUPLICATE); + + switch (results->mode) { + case MODE_CALENDAR: + results->calendar_data->dialog_text = g_strdup (arg); + break; + case MODE_ENTRY: + results->entry_data->dialog_text = g_strdup (arg); + break; + case MODE_ERROR: + case MODE_QUESTION: + case MODE_WARNING: + case MODE_INFO: + results->msg_data->dialog_text = g_strdup (arg); + break; + case MODE_PROGRESS: + results->progress_data->dialog_text = g_strdup (arg); + break; + default: + zenity_error ("--text", ERROR_SUPPORT); + } + parse_option_text++; + break; + case OPTION_DAY: + if (results->mode != MODE_CALENDAR) + zenity_error ("--day", ERROR_SUPPORT); + + if (results->calendar_data->day > 0) + zenity_error ("--day", ERROR_DUPLICATE); + + results->calendar_data->day = atoi (arg); + break; + case OPTION_MONTH: + if (results->mode != MODE_CALENDAR) + zenity_error ("--month", ERROR_SUPPORT); + + if (results->calendar_data->month > 0) + zenity_error ("--day", ERROR_DUPLICATE); + + results->calendar_data->month = atoi (arg); + break; + case OPTION_YEAR: + if (results->mode != MODE_CALENDAR) + zenity_error ("--year", ERROR_SUPPORT); + + if (results->calendar_data->year > 0) + zenity_error ("--year", ERROR_DUPLICATE); + + results->calendar_data->year = atoi (arg); + break; + case OPTION_DATEFORMAT: + if (results->mode != MODE_CALENDAR) + zenity_error ("--date-format", ERROR_SUPPORT); + + if (parse_option_dateformat) + zenity_error ("--date-format", ERROR_DUPLICATE); + + results->calendar_data->date_format = g_strdup (arg); + parse_option_dateformat = TRUE; + break; + case OPTION_INPUTTEXT: + if (results->mode != MODE_ENTRY) + zenity_error ("--entry-text", ERROR_SUPPORT); + + if (results->entry_data->entry_text != NULL) + zenity_error ("--entry-text", ERROR_DUPLICATE); + + results->entry_data->entry_text = g_strdup (arg); + break; + case OPTION_HIDETEXT: + if (results->mode != MODE_ENTRY) + zenity_error ("--hide-text", ERROR_SUPPORT); + + if (!results->entry_data->visible) + zenity_error ("--hide-text", ERROR_DUPLICATE); + + results->entry_data->visible = FALSE; + break; + case OPTION_LISTEDIT: + case OPTION_TEXTEDIT: + + /* FIXME: This is an ugly hack because of the way the poptOptions are + * ordered above. When you try and use an --option more than once + * parse_options_callback gets called for each option. Suckage + */ + + if (parse_option_file > 2) + zenity_error ("--editable", ERROR_DUPLICATE); + + switch (results->mode) { + case MODE_TEXTINFO: + results->text_data->editable = TRUE; + break; + case MODE_LIST: + results->tree_data->editable = TRUE; + break; + default: + zenity_error ("--editable", ERROR_SUPPORT); + } + parse_option_editable++; + break; + case OPTION_FILENAME: + case OPTION_TEXTFILENAME: + + /* FIXME: This is an ugly hack because of the way the poptOptions are + * ordered above. When you try and use an --option more than once + * parse_options_callback gets called for each option. Suckage + */ + + if (parse_option_file > 2) + zenity_error ("--filename", ERROR_DUPLICATE); + + switch (results->mode) { + case MODE_FILE: + results->file_data->uri = g_strdup (arg); + break; + case MODE_TEXTINFO: + results->text_data->uri = g_strdup (arg); + break; + case MODE_LIST: + results->tree_data->uri = g_strdup (arg); + break; + default: + zenity_error ("--filename", ERROR_SUPPORT); + } + parse_option_file++; + break; + case OPTION_COLUMN: + if (results->mode != MODE_LIST) + zenity_error ("--column", ERROR_SUPPORT); + + results->tree_data->columns = g_slist_append (results->tree_data->columns, g_strdup (arg)); + break; + case OPTION_CHECKLIST: + if (results->mode != MODE_LIST) + zenity_error ("--checkbox", ERROR_SUPPORT); + + if (results->tree_data->checkbox) + zenity_error ("--checkbox", ERROR_DUPLICATE); + + results->tree_data->checkbox = TRUE; + break; + case OPTION_RADIOLIST: + if (results->mode != MODE_LIST) + zenity_error ("--radiobox", ERROR_SUPPORT); + if (results->tree_data->radiobox) + zenity_error ("--radiobox", ERROR_DUPLICATE); + + results->tree_data->radiobox = TRUE; + break; + case OPTION_SEPERATOR: + if (results->mode != MODE_LIST) + zenity_error ("--separator", ERROR_SUPPORT); + + if (parse_option_separator) + zenity_error ("--separator", ERROR_DUPLICATE); + + results->tree_data->separator = g_strdup (arg); + parse_option_separator = TRUE; + break; + case OPTION_PERCENTAGE: + if (results->mode != MODE_PROGRESS) + zenity_error ("--percentage", ERROR_SUPPORT); + + if (results->progress_data->percentage > -1) + zenity_error ("--percentage", ERROR_DUPLICATE); + + results->progress_data->percentage = atoi (arg); + break; + case OPTION_PULSATE: + if (results->mode != MODE_PROGRESS) + zenity_error ("--pulsate", ERROR_SUPPORT); + + results->progress_data->pulsate = TRUE; + break; + case OPTION_ABOUT: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); + + results->mode = MODE_ABOUT; + break; + case OPTION_VERSION: + if (results->mode != MODE_LAST) + zenity_error (NULL, ERROR_DIALOG); + zenity_free_parsing_options (); + g_print ("%s\n", VERSION); + exit (0); + break; + default: + break; + } } @@ -106,6 +106,8 @@ zenity_msg (ZenityData *data, ZenityMsgData *msg_data) break; } } + + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); if (msg_data->dialog_text) gtk_label_set_text (GTK_LABEL (text), msg_data->dialog_text); diff --git a/src/progress.c b/src/progress.c index 41153bc4..d7ae35e3 100644 --- a/src/progress.c +++ b/src/progress.c @@ -61,9 +61,10 @@ zenity_progress (ZenityData *data, ZenityProgressData *progress_data) if (data->window_icon) zenity_util_set_window_icon (dialog, data->window_icon); - else { + else zenity_util_set_window_icon (dialog, ZENITY_IMAGE_FULLPATH ("zenity-progress.png")); - } + + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); text = glade_xml_get_widget (glade_dialog, "zenity_progress_text"); gtk_label_set_text (GTK_LABEL (text), progress_data->dialog_text); @@ -60,6 +60,7 @@ zenity_text (ZenityData *data, ZenityTextData *text_data) else zenity_util_set_window_icon (dialog, ZENITY_IMAGE_FULLPATH ("zenity-text.png")); + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); text_buffer = gtk_text_buffer_new (NULL); @@ -36,6 +36,17 @@ static gchar *separator; static void zenity_tree_dialog_response (GtkWidget *widget, int response, gpointer data); +static gboolean +zenity_tree_dialog_untoggle (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) +{ + GValue toggle_value = {0, }; + + gtk_tree_model_get_value (model, iter, 0, &toggle_value); + + if (g_value_get_boolean (&toggle_value)) + gtk_list_store_set (GTK_LIST_STORE (model), iter, 0, FALSE, -1); +} + static void zenity_tree_toggled_callback (GtkCellRendererToggle *cell, gchar *path_string, gpointer data) { @@ -45,8 +56,16 @@ zenity_tree_toggled_callback (GtkCellRendererToggle *cell, gchar *path_string, g gboolean value; model = GTK_TREE_MODEL (data); - path = gtk_tree_path_new_from_string (path_string); + /* Because this is a radio list, we should untoggle the previous toggle so that + * we only have one selection at any given time + */ + + if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "radio")) == 1) { + gtk_tree_model_foreach (model, zenity_tree_dialog_untoggle, NULL); + } + + path = gtk_tree_path_new_from_string (path_string); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, 0, &value, -1); @@ -176,6 +195,8 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) else zenity_util_set_window_icon (dialog, ZENITY_IMAGE_FULLPATH ("zenity-list.png")); + gtk_window_set_default_size (GTK_WINDOW (dialog), data->width, data->height); + tree_view = glade_xml_get_widget (glade_dialog, "zenity_tree_view"); /* Create an empty list store */ @@ -216,8 +237,10 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) cell_renderer = gtk_cell_renderer_toggle_new (); - if (tree_data->radiobox) + if (tree_data->radiobox) { g_object_set (G_OBJECT (cell_renderer), "radio", TRUE, NULL); + g_object_set_data (G_OBJECT (model), "radio", (gint *) 1); + } g_signal_connect (cell_renderer, "toggled", G_CALLBACK (zenity_tree_toggled_callback), model); diff --git a/src/zenity.h b/src/zenity.h index 16dcab77..95f477ca 100644 --- a/src/zenity.h +++ b/src/zenity.h @@ -26,6 +26,8 @@ G_BEGIN_DECLS typedef struct { gchar *dialog_title; gchar *window_icon; + gint width; + gint height; gint exit_code; } ZenityData; |