diff --git a/src/entry.c b/src/entry.c index d871812..f104d45 100644 --- a/src/entry.c +++ b/src/entry.c @@ -103,8 +103,9 @@ zenity_entry (ZenityData *data, ZenityEntryData *entry_data) { if (data->extra_label) { gint i = 0; while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); + gtk_dialog_add_button (GTK_DIALOG (dialog), + data->extra_label[i], + i + ZENITY_EXIT_CODE_LAST); i++; } } @@ -227,8 +228,10 @@ zenity_entry_dialog_response (GtkWidget *widget, int response, gpointer data) { default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) - printf ("%s\n", zen_data->extra_label[response]); + (response - ZENITY_EXIT_CODE_LAST) < + g_strv_length (zen_data->extra_label)) + printf ("%s\n", + zen_data->extra_label[response - ZENITY_EXIT_CODE_LAST]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } diff --git a/src/text.c b/src/text.c index 9712b70..bed758a 100644 --- a/src/text.c +++ b/src/text.c @@ -176,11 +176,14 @@ zenity_text (ZenityData *data, ZenityTextData *text_data) { } else zenity_text_fill_entries_from_stdin (GTK_TEXT_VIEW (text_view)); + g_object_set_data (G_OBJECT (dialog), "text_buffer", text_buffer); + if (data->extra_label) { gint i = 0; while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); + gtk_dialog_add_button (GTK_DIALOG (dialog), + data->extra_label[i], + i + ZENITY_EXIT_CODE_LAST); i++; } } @@ -217,6 +220,56 @@ zenity_text (ZenityData *data, ZenityTextData *text_data) { gtk_main (); } +static void +zenity_save (GtkWidget *widget, GtkWindow *parent_window) { + GtkFileChooserNative *dialog; + GtkFileChooser *chooser; + GtkFileFilter *filter; + gint res; + + dialog = gtk_file_chooser_native_new ("Save File", + parent_window, + GTK_FILE_CHOOSER_ACTION_SAVE, + "Cancel", + "Save"); + chooser = GTK_FILE_CHOOSER (dialog); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, "Log Files"); + gtk_file_filter_add_pattern (filter, "*.log"); + gtk_file_chooser_add_filter (chooser, filter); + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, "All Files"); + gtk_file_filter_add_pattern (filter, "*"); + gtk_file_chooser_add_filter (chooser, filter); + + gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); + + gtk_file_chooser_set_current_name ( + chooser, "minecraft-pi-reborn-crash.log"); + + res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) { + char *filename; + GtkTextBuffer *buffer; + GtkTextIter start; + GtkTextIter end; + char *text; + + filename = gtk_file_chooser_get_filename (chooser); + buffer = GTK_TEXT_BUFFER ( + g_object_get_data (G_OBJECT (widget), "text_buffer")); + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_get_end_iter (buffer, &end); + text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); + gtk_text_buffer_set_modified (buffer, FALSE); + g_file_set_contents (filename, text, -1, NULL); + g_free (filename); + } + + g_object_unref (dialog); +} + static void zenity_text_dialog_response (GtkWidget *widget, int response, gpointer data) { ZenityData *zen_data = data; @@ -230,10 +283,16 @@ zenity_text_dialog_response (GtkWidget *widget, int response, gpointer data) { zen_data->exit_code = zenity_util_return_exit_code (ZENITY_TIMEOUT); break; + case ZENITY_SAVE_BUTTON: + zenity_save (widget, GTK_WINDOW (gtk_widget_get_toplevel (widget))); + break; + default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) - printf ("%s\n", zen_data->extra_label[response]); + (response - ZENITY_EXIT_CODE_LAST) < + g_strv_length (zen_data->extra_label)) + printf ("%s\n", + zen_data->extra_label[response - ZENITY_EXIT_CODE_LAST]); zenity_util_exit_code_with_data (ZENITY_ESC, zen_data); break; } diff --git a/src/tree.c b/src/tree.c index cd253ab..90fec28 100644 --- a/src/tree.c +++ b/src/tree.c @@ -415,8 +415,9 @@ zenity_tree (ZenityData *data, ZenityTreeData *tree_data) { if (data->extra_label) { gint i = 0; while (data->extra_label[i] != NULL) { - gtk_dialog_add_button ( - GTK_DIALOG (dialog), data->extra_label[i], i); + gtk_dialog_add_button (GTK_DIALOG (dialog), + data->extra_label[i], + i + ZENITY_EXIT_CODE_LAST); i++; } } @@ -785,8 +786,10 @@ zenity_tree_dialog_response (GtkWidget *widget, int response, gpointer data) { default: if (zen_data->extra_label && - response < g_strv_length (zen_data->extra_label)) - printf ("%s\n", zen_data->extra_label[response]); + (response - ZENITY_EXIT_CODE_LAST) < + g_strv_length (zen_data->extra_label)) + printf ("%s\n", + zen_data->extra_label[response - ZENITY_EXIT_CODE_LAST]); zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC); break; } diff --git a/src/zenity.h b/src/zenity.h index 6502616..2e8f99c 100644 --- a/src/zenity.h +++ b/src/zenity.h @@ -18,12 +18,14 @@ typedef struct { } ZenityData; typedef enum { - ZENITY_OK, + ZENITY_OK = 0, ZENITY_CANCEL, ZENITY_ESC, ZENITY_ERROR, ZENITY_EXTRA, - ZENITY_TIMEOUT + ZENITY_TIMEOUT, + ZENITY_SAVE_BUTTON, + ZENITY_EXIT_CODE_LAST } ZenityExitCode; typedef struct { diff --git a/src/zenity.ui b/src/zenity.ui index 04e37e5..4210444 100644 --- a/src/zenity.ui +++ b/src/zenity.ui @@ -72,7 +72,7 @@ True False - _Enter new text: + Enter new text: True 0 @@ -237,11 +237,27 @@ True False end + + + Save + True + True + True + True + right + + + False + False + 0 + + OK True True + True True True right @@ -250,7 +266,7 @@ False False - 0 + 1 @@ -276,7 +292,7 @@ True False - _Text information: + Text information: True 0 @@ -340,6 +356,7 @@ zenity_text_close_button + zenity_text_save_button