[Xfce4-commits] <midori:master> Implement Open in Image Viewer menu item

Christian Dywan noreply at xfce.org
Sat Jan 14 07:02:02 CET 2012


Updating branch refs/heads/master
         to b045c01d069f67e325ef58c5a8dae302229e6a14 (commit)
       from c9f982633d7e9ea4f44f882e06bfded411b03971 (commit)

commit b045c01d069f67e325ef58c5a8dae302229e6a14
Author: Peter Hatina <phatina at redhat.com>
Date:   Fri Jan 13 23:53:09 2012 +0100

    Implement Open in Image Viewer menu item
    
    Add helper functions to handle filenames:
    midori_browser_download_prepare_destination_uri
    midori_browser_download_prepare_filename
    
    Fixes: https://bugs.launchpad.net/midori/+bug/699992

 midori/midori-browser.c |  101 ++++++++++++++++++++++++++++++++++++++++++++++-
 midori/midori-view.c    |   17 ++++++++
 2 files changed, 117 insertions(+), 1 deletions(-)

diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index e164e1b..3ff8726 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -1346,12 +1346,111 @@ midori_view_download_save_as_response_cb (GtkWidget*      dialog,
     gtk_widget_hide (dialog);
 }
 
+static void
+midori_browser_download_status_cb (WebKitDownload*  download,
+                                   GParamSpec*      pspec,
+                                   gpointer         user_data)
+{
+    const gchar* uri = webkit_download_get_destination_uri (download);
+    switch (webkit_download_get_status (download))
+    {
+        case WEBKIT_DOWNLOAD_STATUS_FINISHED:
+            if (!g_app_info_launch_default_for_uri (uri, NULL, NULL))
+            {
+                sokoke_message_dialog (GTK_MESSAGE_ERROR,
+                    _("Error opening the image!"),
+                    _("Can not open selected image in a default viewer."), FALSE);
+            }
+            break;
+        case WEBKIT_DOWNLOAD_STATUS_ERROR:
+            webkit_download_cancel (download);
+            sokoke_message_dialog (GTK_MESSAGE_ERROR,
+                _("Error downloading the image!"),
+                _("Can not downlaod selected image."), FALSE);
+            break;
+        case WEBKIT_DOWNLOAD_STATUS_CREATED:
+        case WEBKIT_DOWNLOAD_STATUS_STARTED:
+        case WEBKIT_DOWNLOAD_STATUS_CANCELLED:
+            break;
+    }
+}
+
+static gchar*
+midori_browser_download_prepare_filename (gchar* filename)
+{
+    if (g_file_test (filename, G_FILE_TEST_EXISTS))
+    {
+        int i = 1;
+        const gchar* dot_pos;
+        const gchar* last_separator;
+        gchar* serial;
+        GString* tmp_filename;
+        gssize position;
+
+        last_separator = strrchr (filename, G_DIR_SEPARATOR);
+        dot_pos = strrchr ((last_separator) ? last_separator : filename, '.');
+        position = dot_pos ? (dot_pos - filename) : (gssize) strlen (filename);
+        tmp_filename = g_string_new (NULL);
+
+        do
+        {
+            serial = g_strdup_printf ("-%d", i++);
+            g_string_assign (tmp_filename, filename);
+            g_string_insert (tmp_filename, position, serial);
+            g_free (serial);
+        } while (g_file_test (tmp_filename->str, G_FILE_TEST_EXISTS));
+
+        g_free (filename);
+        filename = g_string_free (tmp_filename, FALSE);
+    }
+    return filename;
+}
+
+static gchar*
+midori_browser_download_prepare_destination_uri (WebKitDownload* download)
+{
+    GFile* file_source;
+    gchar* file_basename;
+    gchar* download_dir;
+    gchar* destination_uri;
+    gchar* destination_filename;
+    gchar* midori_tmp_dir;
+
+    file_source = g_file_new_for_uri (webkit_download_get_uri (download));
+    file_basename = g_file_get_basename (file_source);
+    midori_tmp_dir = g_strconcat ("midori-", g_get_user_name (), NULL);
+    download_dir = g_build_filename (g_get_tmp_dir (), midori_tmp_dir, NULL);
+    destination_filename = g_build_filename (download_dir, file_basename, NULL);
+    destination_filename = midori_browser_download_prepare_filename (destination_filename);
+    destination_uri = g_filename_to_uri (destination_filename, NULL, NULL);
+
+    if (!g_file_test (download_dir, G_FILE_TEST_EXISTS))
+        katze_mkdir_with_parents (download_dir, 0700);
+
+    g_free (file_basename);
+    g_free (download_dir);
+    g_free (destination_filename);
+    g_free (midori_tmp_dir);
+    g_object_unref (file_source);
+
+    return destination_uri;
+}
+
 static gboolean
 midori_view_download_requested_cb (GtkWidget*      view,
                                    WebKitDownload* download,
                                    MidoriBrowser*  browser)
 {
-    if (!webkit_download_get_destination_uri (download))
+    if (g_object_get_data (G_OBJECT (download), "open-in-viewer"))
+    {
+        gchar* destination_uri = midori_browser_download_prepare_destination_uri (download);
+        midori_browser_prepare_download (browser, download, destination_uri);
+        g_signal_connect (download, "notify::status",
+            G_CALLBACK (midori_browser_download_status_cb), (gpointer) browser);
+        webkit_download_start (download);
+        g_free (destination_uri);
+    }
+    else if (!webkit_download_get_destination_uri (download))
     {
         gchar* folder;
         if (g_object_get_data (G_OBJECT (download), "save-as-download"))
diff --git a/midori/midori-view.c b/midori/midori-view.c
index 2463599..a1a5aae 100644
--- a/midori/midori-view.c
+++ b/midori/midori-view.c
@@ -2063,6 +2063,20 @@ midori_web_view_menu_image_save_activate_cb (GtkWidget*  widget,
 }
 
 static void
+midori_web_view_open_picture_cb (GtkWidget* widget,
+                                 MidoriView* view)
+{
+    gchar* uri = katze_object_get_string (view->hit_test, "image-uri");
+    WebKitNetworkRequest* request = webkit_network_request_new (uri);
+    WebKitDownload* download = webkit_download_new (request);
+    gboolean handled;
+    g_object_unref (request);
+    g_object_set_data (G_OBJECT (download), "open-in-viewer", (void*)0xdeadbeef);
+    g_signal_emit (view, signals[DOWNLOAD_REQUESTED], 0, download, &handled);
+    g_free (uri);
+}
+
+static void
 midori_web_view_menu_video_copy_activate_cb (GtkWidget*  widget,
                                              MidoriView* view)
 {
@@ -2402,6 +2416,9 @@ midori_view_populate_popup (MidoriView* view,
         midori_view_insert_menu_item (menu_shell, -1,
             _("Save I_mage"), GTK_STOCK_SAVE,
             G_CALLBACK (midori_web_view_menu_image_save_activate_cb), widget);
+        midori_view_insert_menu_item (menu_shell, -1,
+            _("Open in Image _Viewer"), GTK_STOCK_OPEN,
+            G_CALLBACK (midori_web_view_open_picture_cb), widget);
     }
 
     if (is_media)


More information about the Xfce4-commits mailing list