[Xfce4-commits] <midori:master> Add completion for currently open views/ tabs

Christian Dywan noreply at xfce.org
Sat Oct 6 20:00:01 CEST 2012


Updating branch refs/heads/master
         to b49aba5ed21a0ae2dae8f9abf8ceb141980bd58a (commit)
       from 536036283ae440447f61614816c1b7b794c3213b (commit)

commit b49aba5ed21a0ae2dae8f9abf8ceb141980bd58a
Author: Christian Dywan <christian at twotoasts.de>
Date:   Sat Oct 6 19:55:18 2012 +0200

    Add completion for currently open views/ tabs

 midori/midori-app.c               |   28 +++++++------
 midori/midori-browser.c           |   66 ++++++++++++++++++++++++----
 midori/midori-browser.h           |    4 ++
 midori/midori-locationaction.c    |   14 ++++++-
 midori/midori-viewcompletion.vala |   85 +++++++++++++++++++++++++++++++++++++
 midori/midori.vapi                |    2 +-
 6 files changed, 174 insertions(+), 25 deletions(-)

diff --git a/midori/midori-app.c b/midori/midori-app.c
index b3653e1..0b4fba5 100644
--- a/midori/midori-app.c
+++ b/midori/midori-app.c
@@ -543,19 +543,10 @@ midori_app_command_received (MidoriApp*   app,
                     else
                     {
                         /* Switch to already open tab if possible */
-                        guint i = 0;
-                        GtkWidget* tab;
-                        gboolean found = FALSE;
-                        while ((tab = midori_browser_get_nth_tab (browser, i++)))
-                            if (g_str_equal (
-                                midori_view_get_display_uri (MIDORI_VIEW (tab)),
-                                fixed_uri))
-                            {
-                                found = TRUE;
-                                break;
-                            }
-                        if (found)
-                            midori_browser_set_current_tab (browser, tab);
+                        KatzeArray* items = midori_browser_get_proxy_array (browser);
+                        KatzeItem* found = katze_array_find_uri (items, fixed_uri);
+                        if (found != NULL)
+                            midori_browser_set_current_item (browser, found);
                         else
                             midori_browser_set_current_page (browser,
                                 midori_browser_add_uri (browser, fixed_uri));
@@ -1206,6 +1197,17 @@ midori_app_add_browser (MidoriApp*     app,
     g_signal_emit (app, signals[ADD_BROWSER], 0, browser);
 }
 
+void
+midori_app_set_browsers (MidoriApp*     app,
+                         KatzeArray*    browsers,
+                         MidoriBrowser* browser)
+{
+    g_return_if_fail (MIDORI_IS_APP (app));
+    g_return_if_fail (KATZE_IS_ARRAY (browsers));
+    katze_object_assign (app->browsers, g_object_ref (browsers));
+    app->browser = browser;
+}
+
 /**
  * midori_app_create_browser:
  * @app: a #MidoriApp
diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index c4c0f7a..5fd5806 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -131,6 +131,7 @@ enum
     PROP_STATUSBAR,
     PROP_STATUSBAR_TEXT,
     PROP_SETTINGS,
+    PROP_PROXY_ITEMS,
     PROP_BOOKMARKS,
     PROP_TRASH,
     PROP_SEARCH_ENGINES,
@@ -2171,6 +2172,22 @@ midori_browser_class_init (MidoriBrowserClass* class)
                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
     /**
+    * MidoriBrowser:proxy-items:
+    *
+    * The open views, automatically updated, for session management.
+    *
+    * Since: 0.4.8
+    */
+    g_object_class_install_property (gobject_class,
+                                     PROP_PROXY_ITEMS,
+                                     g_param_spec_object (
+                                     "proxy-items",
+                                     "Proxy Items",
+                                     "The open tabs as an array",
+                                     KATZE_TYPE_ARRAY,
+                                     G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+    /**
     * MidoriBrowser:bookmarks:
     *
     * The bookmarks folder, containing all bookmarks.
@@ -3099,16 +3116,7 @@ _action_window_activate_item_alt (GtkAction*     action,
                                   gint           button,
                                   MidoriBrowser* browser)
 {
-    guint i;
-    guint n = katze_array_get_length (browser->proxy_array);
-
-    for (i = 0; i < n; i++)
-    {
-        GtkWidget* view;
-        view = midori_browser_get_nth_tab (browser, i);
-        if (midori_view_get_proxy_item (MIDORI_VIEW (view)) == item)
-            midori_browser_set_current_page (browser, i);
-    }
+    midori_browser_set_current_item (browser, item);
 }
 
 static void
@@ -3846,6 +3854,15 @@ _action_location_submit_uri (GtkAction*     action,
     gchar* new_uri;
     gint n;
 
+    /* Switch to already open tab if possible */
+    KatzeItem* found = katze_array_find_uri (browser->proxy_array, uri);
+    if (found != NULL && !new_tab
+     && !g_str_equal (midori_browser_get_current_uri (browser), uri))
+    {
+        midori_browser_set_current_item (browser, found);
+        return;
+    }
+
     uri = katze_skip_whitespace (uri);
     new_uri = sokoke_magic_uri (uri);
     if (!new_uri)
@@ -7441,6 +7458,9 @@ midori_browser_get_property (GObject*    object,
     case PROP_SETTINGS:
         g_value_set_object (value, browser->settings);
         break;
+    case PROP_PROXY_ITEMS:
+        g_value_set_object (value, browser->proxy_array);
+        break;
     case PROP_BOOKMARKS:
         g_value_set_object (value, browser->bookmarks);
         break;
@@ -7837,6 +7857,32 @@ midori_browser_get_current_page (MidoriBrowser* browser)
 }
 
 /**
+ * midori_browser_set_current_item:
+ * @browser: a #MidoriBrowser
+ * @item: a #KatzeItem
+ *
+ * Switches to the page containing @item, see also midori_browser_set_current_page().
+ *
+ * The widget will also grab the focus automatically.
+ *
+ * Since: 0.4.8
+ **/
+void
+midori_browser_set_current_item (MidoriBrowser* browser,
+                                 KatzeItem*     item)
+{
+    guint i;
+    guint n = katze_array_get_length (browser->proxy_array);
+
+    for (i = 0; i < n; i++)
+    {
+        GtkWidget* view = midori_browser_get_nth_tab (browser, i);
+        if (midori_view_get_proxy_item (MIDORI_VIEW (view)) == item)
+            midori_browser_set_current_page (browser, i);
+    }
+}
+
+/**
  * midori_browser_get_nth_tab:
  * @browser: a #MidoriBrowser
  * @page: the index of a tab
diff --git a/midori/midori-browser.h b/midori/midori-browser.h
index 7f56ebb..fd53928 100644
--- a/midori/midori-browser.h
+++ b/midori/midori-browser.h
@@ -139,6 +139,10 @@ midori_browser_set_current_page       (MidoriBrowser*     browser,
 gint
 midori_browser_get_current_page       (MidoriBrowser*     browser);
 
+void
+midori_browser_set_current_item       (MidoriBrowser* browser,
+                                       KatzeItem*     item);
+
 GtkWidget*
 midori_browser_get_nth_tab            (MidoriBrowser*     browser,
                                        gint               n);
diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c
index ad13677..079448e 100644
--- a/midori/midori-locationaction.c
+++ b/midori/midori-locationaction.c
@@ -409,6 +409,11 @@ midori_location_action_populated_suggestions_cb (MidoriAutocompleter*  autocompl
     midori_location_action_popup_position (action, count);
 }
 
+void
+midori_app_set_browsers (MidoriApp*     app,
+                         KatzeArray*    browsers,
+                         MidoriBrowser* browser);
+
 static gboolean
 midori_location_action_popup_timeout_cb (gpointer data)
 {
@@ -427,16 +432,23 @@ midori_location_action_popup_timeout_cb (gpointer data)
 
     if (action->autocompleter == NULL)
     {
-        /* FIXME: use a real app here */
+        /* We use a proxy app to control what can be accessed */
+        MidoriBrowser* browser = midori_browser_get_for_widget (action->entry);
         GObject* app = g_object_new (MIDORI_TYPE_APP,
             "history", action->history,
             "search-engines", action->search_engines,
             NULL);
+        /* FIXME: tabs of multiple windows */
+        KatzeArray* browsers = katze_array_new (MIDORI_TYPE_BROWSER);
+        katze_array_add_item (browsers, browser);
+        midori_app_set_browsers (MIDORI_APP (app), browsers, browser);
         action->autocompleter = midori_autocompleter_new (app);
         g_signal_connect (action->autocompleter, "populated",
             G_CALLBACK (midori_location_action_populated_suggestions_cb), action);
         g_object_unref (app);
         midori_autocompleter_add (action->autocompleter,
+            MIDORI_COMPLETION (midori_view_completion_new ()));
+        midori_autocompleter_add (action->autocompleter,
             MIDORI_COMPLETION (midori_history_completion_new ()));
         midori_autocompleter_add (action->autocompleter,
             MIDORI_COMPLETION (midori_search_completion_new ()));
diff --git a/midori/midori-viewcompletion.vala b/midori/midori-viewcompletion.vala
new file mode 100644
index 0000000..a259c85
--- /dev/null
+++ b/midori/midori-viewcompletion.vala
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2012 Christian Dywan <christian at twotoasts.de>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ See the file COPYING for the full license text.
+*/
+
+namespace Midori {
+    public class ViewCompletion : Completion {
+        GLib.Object app;
+        GLib.Object browsers;
+
+        public ViewCompletion () {
+            GLib.Object (description: "Open tabs");
+        }
+
+        public override void prepare (GLib.Object app) {
+            this.app = app;
+            app.get ("browsers", out browsers);
+        }
+
+        public override bool can_complete (string text) {
+            return browsers != null;
+        }
+
+        public override bool can_action (string action) {
+            return action == "about:views";
+        }
+
+        public override async List<Suggestion>? complete (string text, string? action, Cancellable cancellable) {
+            return_val_if_fail (browsers != null, null);
+
+            unowned List<GLib.Object> browsers_list = Katze.array_peek_items (browsers);
+            var suggestions = new List<Suggestion> ();
+            uint n = 0;
+            string key = text.casefold ();
+            foreach (var browser in browsers_list) {
+                /* FIXME multiple windows */
+                GLib.Object current_browser;
+                app.get ("browser", out current_browser);
+                if (browser != current_browser)
+                    continue;
+
+                GLib.Object items;
+                browser.get ("proxy-items", out items);
+                unowned List<GLib.Object> items_list = Katze.array_peek_items (items);
+
+                foreach (var item in items_list) {
+                    string uri, title;
+                    item.get ("uri", out uri);
+                    item.get ("name", out title);
+                    if (!(key in uri.casefold () || key in title.casefold ()))
+                        continue;
+
+                    Gdk.Pixbuf? icon = Katze.load_cached_icon (uri, null);
+                    /* FIXME: Theming? Win32? */
+                    string background = "gray";
+                    var suggestion = new Suggestion (uri, title + "\n" + uri, false, background, icon);
+                    suggestions.append (suggestion);
+
+                    n++;
+                    if (n == 3 && action == null) {
+                        suggestion = new Suggestion ("about:views", _("More open tabs…"), false, background);
+                        suggestion.action = true;
+                        suggestions.append (suggestion);
+                        break;
+                    }
+
+                    uint src = Idle.add (complete.callback);
+                    yield;
+                    Source.remove (src);
+                }
+            }
+
+            if (cancellable.is_cancelled ())
+                return null;
+
+            return suggestions;
+        }
+    }
+}
diff --git a/midori/midori.vapi b/midori/midori.vapi
index ec45b9d..68ca4f7 100644
--- a/midori/midori.vapi
+++ b/midori/midori.vapi
@@ -49,7 +49,7 @@ namespace Midori {
         public unowned Gtk.ActionGroup get_action_group ();
         public static unowned Browser get_for_widget (Gtk.Widget widget);
         public unowned string[] get_toolbar_actions ();
-        public unowned Katze.Array get_proxy_items ();
+        public Katze.Array proxy_items { get; }
 
         [NoAccessorMethod]
         public Gtk.MenuBar menubar { owned get; }


More information about the Xfce4-commits mailing list