Fix race condition by introducing switch_page (old, new)

So there's no confusion which one is the new, current tab.
This commit is contained in:
André Stösel 2012-09-13 21:52:15 +02:00 committed by Christian Dywan
parent 7124e36dd5
commit ec04a1a274
5 changed files with 45 additions and 19 deletions

View file

@ -132,17 +132,17 @@ namespace DelayedLoad {
} }
} }
private void tab_changed (GLib.Object window, GLib.ParamSpec pspec) { private void tab_changed (Midori.View? old_view, Midori.View? new_view) {
Midori.Browser browser = window as Midori.Browser; if (new_view != null) {
Midori.View? view = browser.tab as Midori.View; Midori.App app = get_app ();
Midori.Browser browser = app.browser;
if (view != null) { Katze.Item item = new_view.get_proxy_item ();
Katze.Item item = view.get_proxy_item ();
item.ref(); item.ref();
int64 delay = item.get_meta_integer ("delay"); int64 delay = item.get_meta_integer ("delay");
if (delay == -2 && view.progress < 1.0) { if (delay == -2 && new_view.progress < 1.0) {
this.schedule_reload (browser, view); this.schedule_reload (browser, new_view);
} }
} }
} }
@ -176,11 +176,11 @@ namespace DelayedLoad {
} }
private void browser_added (Midori.Browser browser) { 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) { 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) { public void activated (Midori.App app) {

View file

@ -462,7 +462,7 @@ namespace HistoryList {
tab_added (browser, tab); tab_added (browser, tab);
browser.add_tab.connect (tab_added); browser.add_tab.connect (tab_added);
browser.remove_tab.connect (tab_removed); 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) { void browser_removed (Midori.Browser browser) {
@ -491,7 +491,7 @@ namespace HistoryList {
browser.add_tab.disconnect (tab_added); browser.add_tab.disconnect (tab_added);
browser.remove_tab.disconnect (tab_removed); 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) { 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) { if(this.ignoreNextChange) {
this.ignoreNextChange = false; this.ignoreNextChange = false;
} else { } else {
Midori.Browser browser = window as Midori.Browser; Midori.Browser browser = history_window as Midori.Browser;
Midori.View view = null; Midori.View? last_view
Midori.View last_view = null; = browser.get_data<Midori.View?> ("history-list-last-change");
browser.get ("tab", ref view);
last_view = browser.get_data<Midori.View?> ("history-list-last-change");
if (last_view != null) { if (last_view != null) {
this.tab_list_resort (browser, last_view); 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);
} }
} }

View file

@ -6,6 +6,7 @@ OBJECT:OBJECT
VOID:BOOLEAN,STRING VOID:BOOLEAN,STRING
VOID:OBJECT,ENUM,BOOLEAN VOID:OBJECT,ENUM,BOOLEAN
VOID:OBJECT,INT,INT VOID:OBJECT,INT,INT
VOID:OBJECT,OBJECT
VOID:POINTER,INT VOID:POINTER,INT
VOID:STRING,BOOLEAN VOID:STRING,BOOLEAN
VOID:STRING,INT,STRING VOID:STRING,INT,STRING

View file

@ -145,6 +145,7 @@ enum
ADD_TAB, ADD_TAB,
REMOVE_TAB, REMOVE_TAB,
MOVE_TAB, MOVE_TAB,
SWITCH_TAB,
ACTIVATE_ACTION, ACTIVATE_ACTION,
ADD_DOWNLOAD, ADD_DOWNLOAD,
SEND_NOTIFICATION, SEND_NOTIFICATION,
@ -1884,6 +1885,28 @@ midori_browser_class_init (MidoriBrowserClass* class)
G_TYPE_NONE, 3, G_TYPE_NONE, 3,
GTK_TYPE_NOTEBOOK, G_TYPE_INT, G_TYPE_INT); 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 ( signals[ACTIVATE_ACTION] = g_signal_new (
"activate-action", "activate-action",
G_TYPE_FROM_CLASS (class), G_TYPE_FROM_CLASS (class),
@ -5107,7 +5130,10 @@ midori_browser_switched_tab (MidoriBrowser* browser,
} }
if (new_view == NULL) if (new_view == NULL)
{
g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view);
return; return;
}
g_return_if_fail (MIDORI_IS_VIEW (new_view)); g_return_if_fail (MIDORI_IS_VIEW (new_view));
@ -5123,6 +5149,7 @@ midori_browser_switched_tab (MidoriBrowser* browser,
if (browser->proxy_array) if (browser->proxy_array)
katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current", new_page); katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current", new_page);
g_object_notify (G_OBJECT (browser), "tab"); 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_set_statusbar_text (browser, new_view, NULL);
_midori_browser_update_interface (browser, new_view); _midori_browser_update_interface (browser, new_view);

View file

@ -82,6 +82,7 @@ namespace Midori {
public signal void add_tab (View tab); public signal void add_tab (View tab);
[HasEmitter] [HasEmitter]
public signal void remove_tab (View tab); public signal void remove_tab (View tab);
public signal void switch_tab (View? old_view, View? new_view);
[HasEmitter] [HasEmitter]
public signal void activate_action (string name); public signal void activate_action (string name);
public signal void add_download (GLib.Object download); public signal void add_download (GLib.Object download);