summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-11-01 23:16:07 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2008-11-01 23:16:07 +0000
commita2c01f0fab5e0106f6053bbbcbc5818b80eaa785 (patch)
tree8a923bbf9e2a56f983fd23e99e91b04e066b88a1
parent1db8e3cc3f23656dcc76b51c76d68d17d2274610 (diff)
Save traces.
-rw-r--r--src/main.c73
1 files changed, 72 insertions, 1 deletions
diff --git a/src/main.c b/src/main.c
index cb3f46a..53313dd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -218,6 +218,77 @@ print_trace_cb (GtkAction *action, sphinx_t *sphinx)
g_object_unref (operation);
}
+static void
+save_trace_cb (GtkAction *action, sphinx_t *sphinx)
+{
+ GtkTextIter start, end;
+ GtkWidget *dialog;
+ GtkFileFilter *filter;
+ gchar *filename;
+ gchar *text;
+ gboolean ok;
+ GError *error = NULL;
+
+ dialog = gtk_file_chooser_dialog_new ("Choose location to save trace...",
+ GTK_WINDOW (sphinx->window),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_OK,
+ NULL);
+
+ if (sphinx->trace_name != NULL) {
+ gchar *s;
+
+ s = strchr (filename = sphinx->trace_name, ' ');
+ if (s != NULL) {
+ filename = g_strndup (sphinx->trace_name,
+ s - sphinx->trace_name);
+ }
+ s = g_strconcat (filename, ".trace", NULL);
+ if (filename != sphinx->trace_name)
+ g_free (filename);
+
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), s);
+ g_free (s);
+ }
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog),
+ TRUE);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, "Traces");
+ gtk_file_filter_add_pattern (filter, "*.trace");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, "All");
+ gtk_file_filter_add_pattern (filter, "*");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ ok = gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK;
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ gtk_widget_destroy (dialog);
+
+ gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (sphinx->buffer),
+ &start, &end);
+ text = gtk_text_buffer_get_text (GTK_TEXT_BUFFER (sphinx->buffer),
+ &start, &end, FALSE);
+ if (! g_file_set_contents (filename, text, -1, &error)) {
+ dialog = gtk_message_dialog_new (GTK_WINDOW (sphinx->window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "Failed to save trace '%s': %s",
+ filename, error->message);
+ g_signal_connect (dialog,
+ "response", G_CALLBACK (gtk_widget_destroy), NULL);
+ gtk_widget_show (dialog);
+ g_error_free (error);
+ }
+ g_free (text);
+}
+
static gchar **
prepend_search_path (const gchar *const *dirs, const gchar *const *paths)
{
@@ -690,7 +761,7 @@ sphinx_new (void)
{ "Execute", GTK_STOCK_EXECUTE, "_Execute", "<control>E",
"Execute a new trace", G_CALLBACK (execute_command_dlg) },
{ "Save", GTK_STOCK_SAVE, "_Save", "<control>S",
- "Save the trace", G_CALLBACK (gtk_main_quit) },
+ "Save the trace", G_CALLBACK (save_trace_cb) },
{ "Print", GTK_STOCK_PRINT, "_Print", "<control>P",
"Print the trace", G_CALLBACK (print_trace_cb) },
{ "Quit", GTK_STOCK_QUIT, "_Quit", "<control>Q",