[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