Updating branch refs/heads/master to b33b3c809f397b5cbe55ac856988eadbeeb4acd3 (commit) from 20d0eba06d5847831c0f91dab6f5df59917b8930 (commit)
commit b33b3c809f397b5cbe55ac856988eadbeeb4acd3 Author: Christian Dywan <christ...@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) _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits