]> spindle.queued.net Git - midori/commitdiff
Implement FTP support in External Applications
authorChristian Dywan <christian@twotoasts.de>
Wed, 12 May 2010 21:54:24 +0000 (23:54 +0200)
committerChristian Dywan <christian@twotoasts.de>
Wed, 12 May 2010 23:06:58 +0000 (01:06 +0200)
For the moment 'gftp' is hardcoded for ftp://.

extensions/external-applications.vala
midori/midori-view.c

index 692cd5c1c4b03633a5aa4f8bbaeaead539ffac93..8661286356826c51382759cabcd390ccffa36793 100644 (file)
 */
 
 using Gtk;
+using WebKit;
 using Midori;
 
 public class ExternalApplications : Midori.Extension {
     Dialog? dialog;
-    void tab_added (Widget tab) {
-        /* */
+    bool launch (string command, string uri) {
+        try {
+            var info = GLib.AppInfo.create_from_commandline (command, null, 0);
+            var uris = new List<string>();
+            uris.prepend (uri);
+            info.launch_uris (uris, null);
+            return true;
+        }
+        catch (GLib.Error error) {
+            var error_dialog = new Gtk.MessageDialog (null, 0,
+                Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
+                "Failed to launch external application.");
+            error_dialog.format_secondary_text (error.message);
+            error_dialog.response.connect ((dialog, response)
+                => { dialog.destroy (); });
+            error_dialog.show ();
+        }
+        return false;
+    }
+    bool navigating (WebFrame web_frame, NetworkRequest request,
+                     WebNavigationAction action, WebPolicyDecision decision) {
+        string uri = request.get_uri ();
+        if (uri.has_prefix ("ftp://")) {
+            if (launch ("gftp", uri)) {
+                decision.ignore ();
+                return true;
+            }
+        }
+        return false;
+    }
+    void tab_added (View tab) {
+        var web_view = tab.get_web_view ();
+        web_view.navigation_policy_decision_requested.connect (navigating);
     }
     void configure_external_applications () {
         if (dialog == null) {
@@ -68,7 +100,7 @@ public Midori.Extension extension_init () {
     extension.name = "External Applications";
     extension.description = "Lalala";
     extension.version = "0.1";
-    extension.authors = "nobody";
+    extension.authors = "Christian Dywan <christian@twotoasts.de>";
     return extension;
 }
 
index bf6e1fc2845c186ea4b79b11f396539ed7748b5e..ea23e8b5ffb27256b6fd56dbc997ad0d888ef44f 100644 (file)
@@ -966,7 +966,6 @@ midori_view_web_view_navigation_decision_cb (WebKitWebView*             web_view
             return TRUE;
         }
     }
-    /* TODO: Handle more external protocols */
     view->special = FALSE;
     return FALSE;
 }