[vinagre] Allows the save screenshot dialog to save in various formats.
- From: Jonh Wendell <jwendell src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vinagre] Allows the save screenshot dialog to save in various formats.
- Date: Fri, 7 Aug 2009 20:19:28 +0000 (UTC)
commit 3c46a56ae4eea1551d8eccd9a8dc815b89de7eff
Author: Jonh Wendell <jwendell gnome org>
Date: Fri Aug 7 17:18:21 2009 -0300
Allows the save screenshot dialog to save in various formats.
Closes #591104.
vinagre/vinagre-tab.c | 120 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 103 insertions(+), 17 deletions(-)
---
diff --git a/vinagre/vinagre-tab.c b/vinagre/vinagre-tab.c
index c910b4c..2256c70 100644
--- a/vinagre/vinagre-tab.c
+++ b/vinagre/vinagre-tab.c
@@ -688,14 +688,60 @@ vinagre_tab_remove_from_notebook (VinagreTab *tab)
vinagre_notebook_close_tab (tab->priv->nb, tab);
}
+static void
+add_if_writable (GdkPixbufFormat *data, GSList **list)
+{
+ if (gdk_pixbuf_format_is_writable (data))
+ *list = g_slist_prepend (*list, data);
+}
+
+static GSList *
+get_supported_image_formats (void)
+{
+ GSList *formats = gdk_pixbuf_get_formats ();
+ GSList *writable_formats = NULL;
+
+ g_slist_foreach (formats, (GFunc)add_if_writable, &writable_formats);
+ g_slist_free (formats);
+
+ return writable_formats;
+}
+
+static void
+filter_changed_cb (GObject *object, GParamSpec *pspec, VinagreTab *tab)
+{
+ GtkFileFilter *filter;
+ gchar *extension, *filename, *basename, *newbase;
+ GtkFileChooser *chooser = GTK_FILE_CHOOSER (object);
+ int i;
+
+ filter = gtk_file_chooser_get_filter (chooser);
+ extension = g_object_get_data (G_OBJECT (filter), "extension");
+
+ filename = gtk_file_chooser_get_filename (chooser);
+ basename = g_path_get_basename (filename);
+ for (i = strlen (basename)-1; i>=0; i--)
+ if (basename[i] == '.')
+ break;
+ basename[i] = '\0';
+ newbase = g_strdup_printf ("%s.%s", basename, extension);
+
+ gtk_file_chooser_set_current_name (chooser, newbase);
+
+ g_free (filename);
+ g_free (basename);
+ g_free (newbase);
+}
+
void
vinagre_tab_take_screenshot (VinagreTab *tab)
{
GdkPixbuf *pix;
GtkWidget *dialog;
GString *suggested_filename;
- gchar *filename, *name;
- GtkFileFilter *filter;
+ gchar *name;
+ GtkFileFilter *filter, *initial_filter;
+ GSList *formats, *l;
g_return_if_fail (VINAGRE_IS_TAB (tab));
@@ -708,12 +754,6 @@ vinagre_tab_take_screenshot (VinagreTab *tab)
return;
}
- filename = NULL;
- name = vinagre_connection_get_best_name (tab->priv->conn);
- suggested_filename = g_string_new (NULL);
- g_string_printf (suggested_filename, _("Screenshot of %s"), name);
- g_string_append (suggested_filename, ".png");
-
dialog = gtk_file_chooser_dialog_new (_("Save Screenshot"),
GTK_WINDOW (tab->priv->window),
GTK_FILE_CHOOSER_ACTION_SAVE,
@@ -721,25 +761,71 @@ vinagre_tab_take_screenshot (VinagreTab *tab)
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
NULL);
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested_filename->str);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Supported formats"));
- gtk_file_filter_add_pixbuf_formats (filter);
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+ name = vinagre_connection_get_best_name (tab->priv->conn);
+ suggested_filename = g_string_new (NULL);
+ g_string_printf (suggested_filename, _("Screenshot of %s"), name);
+ g_string_append (suggested_filename, ".png");
+ g_free (name);
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested_filename->str);
+ g_string_free (suggested_filename, TRUE);
+
+ formats = get_supported_image_formats ();
+ for (l = formats; l; l = l->next)
+ {
+ GdkPixbufFormat *data = (GdkPixbufFormat *)l->data;
+ gchar **exts;
+ int i;
+
+ filter = gtk_file_filter_new ();
+
+ name = gdk_pixbuf_format_get_description (data);
+ gtk_file_filter_set_name (filter, name);
+ g_free (name);
+
+ exts = gdk_pixbuf_format_get_extensions (data);
+ g_object_set_data_full (G_OBJECT (filter), "extension", g_strdup (exts[0]), g_free);
+ if (strcmp (exts[0], "png") == 0)
+ initial_filter = filter;
+
+ for (i = 0; exts[i]; i++)
+ {
+ name = g_strdup_printf ("*.%s", exts[i]);
+ gtk_file_filter_add_pattern (filter, name);
+ g_free (name);
+ }
+ g_strfreev (exts);
+
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+ }
+ g_slist_free (formats);
+
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), initial_filter);
+ g_signal_connect (dialog, "notify::filter", G_CALLBACK (filter_changed_cb), tab);
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
- gdk_pixbuf_save (pix, filename, "png", NULL, NULL);
+ GError *error = NULL;
+ gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+ filter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog));
+ name = g_object_get_data (G_OBJECT (filter), "extension");
+ if (!name)
+ name = "png";
+
+ if (!gdk_pixbuf_save (pix, filename, name, &error, NULL))
+ {
+ vinagre_utils_show_error (_("Error saving screenshot"),
+ error->message,
+ GTK_WINDOW (tab->priv->window));
+ g_error_free (error);
+ }
g_free (filename);
}
gtk_widget_destroy (dialog);
g_object_unref (pix);
- g_string_free (suggested_filename, TRUE);
- g_free (name);
}
const GSList *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]