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 @@
@@ -237,11 +237,27 @@
True
False
end
+
+
+
+ False
+ False
+ 0
+
+
@@ -276,7 +292,7 @@
@@ -340,6 +356,7 @@
zenity_text_close_button
+ zenity_text_save_button