[Xfce4-commits] <midori:master> Fix race condition by introducing switch_page (old, new)

Christian Dywan noreply at xfce.org
Sat Sep 15 01:22:01 CEST 2012


Updating branch refs/heads/master
         to ec04a1a2741b2e4ce497673e01527d8e97e1cdaa (commit)
       from 7124e36dd546beacb74065c3beae9254c4903346 (commit)

commit ec04a1a2741b2e4ce497673e01527d8e97e1cdaa
Author: André Stösel <andre at stoesel.de>
Date:   Thu Sep 13 21:52:15 2012 +0200

    Fix race condition by introducing switch_page (old, new)
    
    So there's no confusion which one is the new, current tab.

 extensions/delayed-load.vala |   18 +++++++++---------
 extensions/history-list.vala |   17 +++++++----------
 midori/marshal.list          |    1 +
 midori/midori-browser.c      |   27 +++++++++++++++++++++++++++
 midori/midori.vapi           |    1 +
 5 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/extensions/delayed-load.vala b/extensions/delayed-load.vala
index 895296e..6f6f254 100644
--- a/extensions/delayed-load.vala
+++ b/extensions/delayed-load.vala
@@ -132,17 +132,17 @@ namespace DelayedLoad {
             }
         }
 
-        private void tab_changed (GLib.Object window, GLib.ParamSpec pspec) {
-            Midori.Browser browser = window as Midori.Browser;
-            Midori.View? view = browser.tab as Midori.View;
+        private void tab_changed (Midori.View? old_view, Midori.View? new_view) {
+            if (new_view != null) {
+                Midori.App app = get_app ();
+                Midori.Browser browser = app.browser;
 
-            if (view != null) {
-                Katze.Item item = view.get_proxy_item ();
+                Katze.Item item = new_view.get_proxy_item ();
                 item.ref();
 
                 int64 delay = item.get_meta_integer ("delay");
-                if (delay == -2 && view.progress < 1.0) {
-                    this.schedule_reload (browser, view);
+                if (delay == -2 && new_view.progress < 1.0) {
+                    this.schedule_reload (browser, new_view);
                 }
             }
         }
@@ -176,11 +176,11 @@ namespace DelayedLoad {
         }
 
         private void browser_added (Midori.Browser browser) {
-            browser.notify["tab"].connect (this.tab_changed);
+            browser.switch_tab.connect_after (this.tab_changed);
         }
 
         private void browser_removed (Midori.Browser browser) {
-            browser.notify["tab"].disconnect (this.tab_changed);
+            browser.switch_tab.disconnect (this.tab_changed);
         }
 
         public void activated (Midori.App app) {
diff --git a/extensions/history-list.vala b/extensions/history-list.vala
index 44af649..83aee2c 100644
--- a/extensions/history-list.vala
+++ b/extensions/history-list.vala
@@ -462,7 +462,7 @@ namespace HistoryList {
                 tab_added (browser, tab);
             browser.add_tab.connect (tab_added);
             browser.remove_tab.connect (tab_removed);
-            browser.notify["tab"].connect (this.tab_changed);
+            browser.switch_tab.connect (this.tab_changed);
         }
 
         void browser_removed (Midori.Browser browser) {
@@ -491,7 +491,7 @@ namespace HistoryList {
 
             browser.add_tab.disconnect (tab_added);
             browser.remove_tab.disconnect (tab_removed);
-            browser.notify["tab"].disconnect (this.tab_changed);
+            browser.switch_tab.disconnect (this.tab_changed);
         }
 
         void tab_added (Midori.Browser browser, Midori.View view) {
@@ -520,21 +520,18 @@ namespace HistoryList {
             }
         }
 
-        void tab_changed (GLib.Object window, GLib.ParamSpec pspec) {
+        void tab_changed (Midori.View? old_view, Midori.View? new_view) {
             if(this.ignoreNextChange) {
                 this.ignoreNextChange = false;
             } else {
-                Midori.Browser browser = window as Midori.Browser;
-                Midori.View view = null;
-                Midori.View last_view = null;
-                browser.get ("tab", ref view);
-
-                last_view = browser.get_data<Midori.View?> ("history-list-last-change");
+                Midori.Browser browser = history_window as Midori.Browser;
+                Midori.View? last_view
+                    = browser.get_data<Midori.View?> ("history-list-last-change");
 
                 if (last_view != null) {
                     this.tab_list_resort (browser, last_view);
                 }
-                browser.set_data<Midori.View?> ("history-list-last-change", view);
+                browser.set_data<Midori.View?> ("history-list-last-change", new_view);
             }
         }
 
diff --git a/midori/marshal.list b/midori/marshal.list
index b0808f8..df8bfd3 100644
--- a/midori/marshal.list
+++ b/midori/marshal.list
@@ -6,6 +6,7 @@ OBJECT:OBJECT
 VOID:BOOLEAN,STRING
 VOID:OBJECT,ENUM,BOOLEAN
 VOID:OBJECT,INT,INT
+VOID:OBJECT,OBJECT
 VOID:POINTER,INT
 VOID:STRING,BOOLEAN
 VOID:STRING,INT,STRING
diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index dc1c1f3..cec7517 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -145,6 +145,7 @@ enum
     ADD_TAB,
     REMOVE_TAB,
     MOVE_TAB,
+    SWITCH_TAB,
     ACTIVATE_ACTION,
     ADD_DOWNLOAD,
     SEND_NOTIFICATION,
@@ -1884,6 +1885,28 @@ midori_browser_class_init (MidoriBrowserClass* class)
         G_TYPE_NONE, 3,
         GTK_TYPE_NOTEBOOK, G_TYPE_INT, G_TYPE_INT);
 
+    /**
+     * MidoriBrowser::switch-tab:
+     * @browser: the object on which the signal is emitted
+     * @old_view: the previous tab
+     * @new_view: the new tab
+     *
+     * Emitted when a tab is switched.
+     * There's no guarantee what the current tab is.
+     *
+     * Since: 0.4.7
+     */
+     signals[SWITCH_TAB] = g_signal_new (
+        "switch-tab",
+        G_TYPE_FROM_CLASS (class),
+        (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+        0,
+        0,
+        NULL,
+        midori_cclosure_marshal_VOID__OBJECT_OBJECT,
+        G_TYPE_NONE, 2,
+        G_TYPE_POINTER, G_TYPE_POINTER);
+
     signals[ACTIVATE_ACTION] = g_signal_new (
         "activate-action",
         G_TYPE_FROM_CLASS (class),
@@ -5107,7 +5130,10 @@ midori_browser_switched_tab (MidoriBrowser* browser,
     }
 
     if (new_view == NULL)
+    {
+        g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view);
         return;
+    }
 
     g_return_if_fail (MIDORI_IS_VIEW (new_view));
 
@@ -5123,6 +5149,7 @@ midori_browser_switched_tab (MidoriBrowser* browser,
     if (browser->proxy_array)
         katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current", new_page);
     g_object_notify (G_OBJECT (browser), "tab");
+    g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view);
 
     _midori_browser_set_statusbar_text (browser, new_view, NULL);
     _midori_browser_update_interface (browser, new_view);
diff --git a/midori/midori.vapi b/midori/midori.vapi
index 3e984b0..62688c7 100644
--- a/midori/midori.vapi
+++ b/midori/midori.vapi
@@ -82,6 +82,7 @@ namespace Midori {
         public signal void add_tab (View tab);
         [HasEmitter]
         public signal void remove_tab (View tab);
+        public signal void switch_tab (View? old_view, View? new_view);
         [HasEmitter]
         public signal void activate_action (string name);
         public signal void add_download (GLib.Object download);


More information about the Xfce4-commits mailing list