[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