[Xfce4-commits] <midori:master> Distinguish connecting and closing of tabs
Christian Dywan
noreply at xfce.org
Thu Oct 18 22:44:01 CEST 2012
Updating branch refs/heads/master
to b33b3c809f397b5cbe55ac856988eadbeeb4acd3 (commit)
from 20d0eba06d5847831c0f91dab6f5df59917b8930 (commit)
commit b33b3c809f397b5cbe55ac856988eadbeeb4acd3
Author: Christian Dywan <christian at twotoasts.de>
Date: Thu Oct 18 22:33:37 2012 +0200
Distinguish connecting and closing of tabs
Rename midori_browser_remove/close_tab, factor out
connecting and disconnecting menu item and signals.
Fixes: https://bugs.launchpad.net/midori/+bug/905759
extensions/tab-panel.c | 4 +-
midori/main.c | 2 +-
midori/midori-browser.c | 205 +++++++++++++++++++++++++++++++++--------------
midori/midori-browser.h | 2 +-
midori/midori-view.c | 8 +-
5 files changed, 152 insertions(+), 69 deletions(-)
diff --git a/extensions/tab-panel.c b/extensions/tab-panel.c
index 44e23e6..ea138d3 100644
--- a/extensions/tab-panel.c
+++ b/extensions/tab-panel.c
@@ -229,12 +229,12 @@ midori_extension_button_release_event_cb (GtkWidget* widget,
if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
event->x, event->y, NULL, &column, NULL, NULL)
&& column == gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 1))
- midori_browser_remove_tab (browser, view);
+ midori_browser_close_tab (browser, view);
else
midori_browser_set_current_tab (browser, view);
}
else if (event->button == 2)
- midori_browser_remove_tab (midori_browser_get_for_widget (widget), view);
+ midori_browser_close_tab (midori_browser_get_for_widget (widget), view);
else
tab_panel_popup (widget, event, view);
diff --git a/midori/main.c b/midori/main.c
index e56d4a3..45d2daa 100644
--- a/midori/main.c
+++ b/midori/main.c
@@ -1554,7 +1554,7 @@ midori_inactivity_timeout (gpointer data)
GList* data_items = sokoke_register_privacy_item (NULL, NULL, NULL);
while ((view = midori_browser_get_nth_tab (mit->browser, i++)))
- midori_browser_remove_tab (mit->browser, view);
+ midori_browser_close_tab (mit->browser, view);
midori_browser_set_current_uri (mit->browser, mit->uri);
/* Clear all private data */
if (history != NULL)
diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index ff1d7c1..28aca95 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -1321,13 +1321,13 @@ midori_browser_download_status_cb (WebKitDownload* download,
}
static gboolean
-midori_browser_remove_tab_idle (gpointer view)
+midori_browser_close_tab_idle (gpointer view)
{
MidoriBrowser* browser;
g_return_val_if_fail (GTK_IS_WIDGET (view), FALSE);
browser = midori_browser_get_for_widget (GTK_WIDGET (view));
- midori_browser_remove_tab (browser, GTK_WIDGET (view));
+ midori_browser_close_tab (browser, GTK_WIDGET (view));
return G_SOURCE_REMOVE;
}
@@ -1420,7 +1420,7 @@ midori_view_download_requested_cb (GtkWidget* view,
web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view));
datasource = webkit_web_frame_get_data_source (web_frame);
if (midori_view_is_blank (MIDORI_VIEW (view)) && webkit_web_data_source_get_data (datasource) == NULL)
- g_idle_add (midori_browser_remove_tab_idle, view);
+ g_idle_add (midori_browser_close_tab_idle, view);
return handled;
}
@@ -1445,38 +1445,28 @@ midori_browser_get_n_pages (MidoriBrowser* browser)
}
static void
-midori_browser_tab_destroy_cb (MidoriView* view,
- MidoriBrowser* browser)
-{
- if (browser->proxy_array)
- {
- KatzeItem* item = midori_view_get_proxy_item (view);
- if (katze_array_get_item_index (browser->proxy_array, item) != -1)
- {
- if (!midori_view_is_blank (view))
- {
- if (browser->trash)
- katze_array_add_item (browser->trash, item);
- midori_browser_update_history (item, "website", "leave");
- }
- katze_array_remove_item (browser->proxy_array, item);
- }
-
- /* We don't ever want to be in a situation with no tabs,
- so just create an empty one if the last one is closed.
- The only exception is when we are closing the window,
- which is indicated by the proxy array having been unset. */
- if (midori_browser_get_n_pages (browser) == 0)
- midori_browser_add_uri (browser, "");
- }
+midori_browser_disconnect_tab (MidoriBrowser* browser,
+ MidoriView* view);
- _midori_browser_update_actions (browser);
+static gboolean
+midori_browser_tab_connected (MidoriBrowser* browser,
+ MidoriView* view)
+{
+ return browser->proxy_array &&
+ (katze_array_get_item_index (browser->proxy_array, midori_view_get_proxy_item (view)) != -1);
}
static void
_midori_browser_remove_tab (MidoriBrowser* browser,
GtkWidget* widget)
{
+ MidoriView* view = MIDORI_VIEW (widget);
+#ifdef HAVE_GRANITE
+ granite_widgets_dynamic_notebook_remove_tab (
+ GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), midori_view_get_tab (view));
+#endif
+ if (midori_browser_tab_connected (browser, view))
+ midori_browser_disconnect_tab (browser, view);
}
#ifndef HAVE_GRANITE
@@ -1579,12 +1569,85 @@ midori_browser_connect_tab (MidoriBrowser* browser,
midori_view_search_text_cb, browser,
"signal::leave-notify-event",
midori_browser_tab_leave_notify_event_cb, browser,
- "signal::destroy",
- midori_browser_tab_destroy_cb, browser,
NULL);
}
static void
+midori_browser_add_tab_to_trash (MidoriBrowser* browser,
+ MidoriView* view)
+{
+ if (browser->proxy_array)
+ {
+ KatzeItem* item = midori_view_get_proxy_item (view);
+ if (katze_array_get_item_index (browser->proxy_array, item) != -1)
+ {
+ if (!midori_view_is_blank (view))
+ {
+ if (browser->trash)
+ katze_array_add_item (browser->trash, item);
+ midori_browser_update_history (item, "website", "leave");
+ }
+ }
+ }
+}
+
+
+static void
+midori_browser_disconnect_tab (MidoriBrowser* browser,
+ MidoriView* view)
+{
+ KatzeItem* item = midori_view_get_proxy_item (view);
+ katze_array_remove_item (browser->proxy_array, item);
+
+ /* We don't ever want to be in a situation with no tabs,
+ so just create an empty one if the last one is closed.
+ The only exception is when we are closing the window,
+ which is indicated by the proxy array having been unset. */
+ if (katze_array_is_empty (browser->proxy_array))
+ {
+ midori_browser_add_uri (browser, "");
+ midori_browser_set_current_page (browser, 0);
+ }
+
+ _midori_browser_update_actions (browser);
+
+ g_object_disconnect (view,
+ "any_signal",
+ midori_view_notify_icon_cb, browser,
+ "any_signal",
+ midori_view_notify_load_status_cb, browser,
+ "any_signal",
+ midori_view_notify_progress_cb, browser,
+ "any_signal",
+ midori_view_notify_uri_cb, browser,
+ "any_signal",
+ midori_view_notify_title_cb, browser,
+ "any_signal",
+ midori_view_notify_minimized_cb, browser,
+ "any_signal",
+ midori_view_notify_zoom_level_cb, browser,
+ "any_signal",
+ midori_view_notify_statusbar_text_cb, browser,
+ "any_signal::attach-inspector",
+ midori_view_attach_inspector_cb, browser,
+ "any_signal::detach-inspector",
+ midori_view_detach_inspector_cb, browser,
+ "any_signal::new-tab",
+ midori_view_new_tab_cb, browser,
+ "any_signal::new-window",
+ midori_view_new_window_cb, browser,
+ "any_signal::new-view",
+ midori_view_new_view_cb, browser,
+ "any_signal::download-requested::after",
+ midori_view_download_requested_cb, browser,
+ "any_signal::search-text",
+ midori_view_search_text_cb, browser,
+ "any_signal::leave-notify-event",
+ midori_browser_tab_leave_notify_event_cb, browser,
+ NULL);
+}
+
+static void
_midori_browser_add_tab (MidoriBrowser* browser,
GtkWidget* view)
{
@@ -2515,16 +2578,7 @@ _action_tab_close_activate (GtkAction* action,
MidoriBrowser* browser)
{
GtkWidget* widget = midori_browser_get_current_tab (browser);
- MidoriView* view = MIDORI_VIEW (widget);
- gboolean last_tab = midori_browser_get_n_pages (browser) == 1;
- if (last_tab && midori_paths_is_readonly () /* APP, PRIVATE */)
- {
- gtk_widget_destroy (GTK_WIDGET (browser));
- return;
- }
- if (last_tab && midori_view_is_blank (view))
- return;
- midori_browser_remove_tab (browser, widget);
+ midori_browser_close_tab (browser, widget);
}
static void
@@ -5159,17 +5213,34 @@ midori_browser_notebook_tab_removed_cb (GtkWidget* notebook,
MidoriBrowser* browser)
{
MidoriView* view = MIDORI_VIEW (granite_widgets_tab_get_page (tab));
- g_signal_emit (browser, signals[REMOVE_TAB], 0, view);
- gtk_widget_destroy (view);
+ if (midori_browser_tab_connected (browser, MIDORI_VIEW (view)))
+ midori_browser_disconnect_tab (browser, MIDORI_VIEW (view));
return TRUE;
}
static void
+midori_browser_move_tab_to_notebook (MidoriBrowser* browser,
+ GtkWidget* view,
+ GraniteWidgetsTab* tab,
+ GtkWidget* new_notebook)
+{
+ g_object_ref (tab);
+ _midori_browser_remove_tab (browser, view);
+ granite_widgets_dynamic_notebook_insert_tab (
+ GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (new_notebook), tab, 0);
+ midori_browser_connect_tab (midori_browser_get_for_widget (new_notebook), view);
+ g_object_unref (tab);
+}
+
+static void
midori_browser_notebook_tab_switched_cb (GraniteWidgetsDynamicNotebook* notebook,
GraniteWidgetsTab* old_tab,
GraniteWidgetsTab* new_tab,
MidoriBrowser* browser)
{
+ if (old_tab && granite_widgets_dynamic_notebook_get_tab_position (notebook, old_tab) == -1)
+ return;
+
gint new_pos = granite_widgets_dynamic_notebook_get_tab_position (notebook, new_tab);
midori_browser_switched_tab (browser,
@@ -5192,14 +5263,7 @@ midori_browser_notebook_tab_moved_cb (GtkWidget* notebook,
GtkWidget* notebook = midori_browser_notebook_create_window_cb (
browser->notebook, view, x, y, browser);
if (notebook != NULL)
- {
- g_object_ref (tab);
- granite_widgets_dynamic_notebook_remove_tab (
- GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), tab);
- granite_widgets_dynamic_notebook_insert_tab (
- GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab, 0);
- g_object_unref (tab);
- }
+ midori_browser_move_tab_to_notebook (browser, view, tab, notebook);
}
else
{
@@ -5211,6 +5275,18 @@ midori_browser_notebook_tab_moved_cb (GtkWidget* notebook,
}
#else
static void
+midori_browser_notebook_page_added_cb (GtkNotebook* notebook,
+ GtkWidget* child,
+ guint page_num,
+ MidoriBrowser* browser)
+{
+ if (!midori_browser_tab_connected (browser, MIDORI_VIEW (child)))
+ midori_browser_connect_tab (browser, child);
+ midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook),
+ MIDORI_VIEW (child), page_num, browser);
+}
+
+static void
midori_browser_notebook_switch_page_cb (GtkWidget* notebook,
gpointer page,
guint page_num,
@@ -5227,7 +5303,8 @@ midori_browser_notebook_page_removed_cb (GtkWidget* notebook,
guint page_num,
MidoriBrowser* browser)
{
- _midori_browser_remove_tab (browser, view);
+ if (midori_browser_tab_connected (browser, MIDORI_VIEW (view)))
+ midori_browser_disconnect_tab (browser, MIDORI_VIEW (view));
midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser);
}
@@ -6422,10 +6499,18 @@ midori_browser_init (MidoriBrowser* browser)
GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE);
/* FIXME: work-around a bug */
gtk_widget_show_all (browser->notebook);
+ granite_widgets_dynamic_notebook_set_group_name (
+ GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), PACKAGE_NAME);
#else
browser->notebook = gtk_notebook_new ();
gtk_notebook_set_scrollable (GTK_NOTEBOOK (browser->notebook), TRUE);
+ #if GTK_CHECK_VERSION (3, 0, 0)
+ gtk_notebook_set_group_name (GTK_NOTEBOOK (browser->notebook), PACKAGE_NAME);
+ #else
+ gtk_notebook_set_group_id (GTK_NOTEBOOK (browser->notebook), GPOINTER_TO_INT (PACKAGE_NAME));
+ #endif
#endif
+
#if !GTK_CHECK_VERSION (3, 0, 0)
{
/* Remove the inner border between scrollbars and the window border */
@@ -6457,6 +6542,9 @@ midori_browser_init (MidoriBrowser* browser)
g_signal_connect (browser->notebook, "page-reordered",
G_CALLBACK (midori_browser_notebook_page_reordered_cb),
browser);
+ g_signal_connect (browser->notebook, "page-added",
+ G_CALLBACK (midori_browser_notebook_page_added_cb),
+ browser);
g_signal_connect (browser->notebook, "page-removed",
G_CALLBACK (midori_browser_notebook_page_removed_cb),
browser);
@@ -7506,28 +7594,23 @@ midori_browser_page_num (MidoriBrowser* browser,
/**
- * midori_browser_remove_tab:
+ * midori_browser_close_tab:
* @browser: a #MidoriBrowser
* @widget: a view
*
- * Removes an existing view from the browser,
- * including an associated menu item.
+ * Closes an existing view, removing it and
+ * its associated menu item from the browser.
**/
void
-midori_browser_remove_tab (MidoriBrowser* browser,
+midori_browser_close_tab (MidoriBrowser* browser,
GtkWidget* view)
{
g_return_if_fail (MIDORI_IS_BROWSER (browser));
g_return_if_fail (GTK_IS_WIDGET (view));
+ midori_browser_add_tab_to_trash (browser, MIDORI_VIEW (view));
g_signal_emit (browser, signals[REMOVE_TAB], 0, view);
- #ifdef HAVE_GRANITE
- granite_widgets_dynamic_notebook_remove_tab (
- GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook),
- midori_view_get_tab (MIDORI_VIEW (view)));
- #else
gtk_widget_destroy (view);
- #endif
}
/**
diff --git a/midori/midori-browser.h b/midori/midori-browser.h
index fd53928..211d342 100644
--- a/midori/midori-browser.h
+++ b/midori/midori-browser.h
@@ -86,7 +86,7 @@ midori_browser_add_tab (MidoriBrowser* browser,
GtkWidget* widget);
void
-midori_browser_remove_tab (MidoriBrowser* browser,
+midori_browser_close_tab (MidoriBrowser* browser,
GtkWidget* widget);
void
diff --git a/midori/midori-view.c b/midori/midori-view.c
index 8b80e12..37cc78f 100644
--- a/midori/midori-view.c
+++ b/midori/midori-view.c
@@ -4334,7 +4334,7 @@ midori_view_browser_close_tabs_cb (GtkWidget* view,
{
GtkWidget* remaining_view = data;
if (view != remaining_view)
- midori_browser_remove_tab (midori_browser_get_for_widget (view), view);
+ midori_browser_close_tab (midori_browser_get_for_widget (view), view);
}
static void
@@ -4356,7 +4356,7 @@ static void
midori_view_tab_label_menu_close_cb (GtkWidget* menuitem,
GtkWidget* view)
{
- midori_browser_remove_tab (midori_browser_get_for_widget (view), view);
+ midori_browser_close_tab (midori_browser_get_for_widget (view), view);
}
/**
@@ -4457,7 +4457,7 @@ midori_view_tab_label_button_press_event (GtkWidget* tab_label,
if (event->button == 2)
{
/* Close the widget on middle click */
- midori_browser_remove_tab (midori_browser_get_for_widget (widget), widget);
+ midori_browser_close_tab (midori_browser_get_for_widget (widget), widget);
return TRUE;
}
else if (MIDORI_EVENT_CONTEXT_MENU (event))
@@ -4477,7 +4477,7 @@ static void
midori_view_tab_close_clicked (GtkWidget* tab_close,
GtkWidget* widget)
{
- midori_browser_remove_tab (midori_browser_get_for_widget (widget), widget);
+ midori_browser_close_tab (midori_browser_get_for_widget (widget), widget);
}
#if !GTK_CHECK_VERSION (3, 0, 0)
More information about the Xfce4-commits
mailing list