diff options
Diffstat (limited to 'src/ephy-notebook.c')
-rw-r--r-- | src/ephy-notebook.c | 79 |
1 files changed, 49 insertions, 30 deletions
diff --git a/src/ephy-notebook.c b/src/ephy-notebook.c index 56ee692a9..b772af8f1 100644 --- a/src/ephy-notebook.c +++ b/src/ephy-notebook.c @@ -84,6 +84,7 @@ enum { TAB_DROPPED, TAB_DETACHED, + TABS_CHANGED, LAST_SIGNAL }; @@ -128,8 +129,7 @@ ephy_notebook_class_init (EphyNotebookClass *klass) g_signal_new ("tab_dropped", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EphyNotebookClass, - tab_dropped), + G_STRUCT_OFFSET (EphyNotebookClass, tab_dropped), NULL, NULL, ephy_marshal_VOID__OBJECT_OBJECT_INT, G_TYPE_NONE, @@ -141,8 +141,7 @@ ephy_notebook_class_init (EphyNotebookClass *klass) g_signal_new ("tab_detached", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EphyNotebookClass, - tab_detached), + G_STRUCT_OFFSET (EphyNotebookClass, tab_detached), NULL, NULL, ephy_marshal_VOID__INT_INT_INT, G_TYPE_NONE, @@ -150,7 +149,14 @@ ephy_notebook_class_init (EphyNotebookClass *klass) G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); - + ephy_notebook_signals[TABS_CHANGED] = + g_signal_new ("tabs_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EphyNotebookClass, tabs_changed), + NULL, NULL, + ephy_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static gboolean @@ -319,21 +325,29 @@ tab_label_size_request_cb (GtkWidget *window, void ephy_notebook_move_page (EphyNotebook *src, EphyNotebook *dest, - GtkWidget *src_page, gint dest_page) + GtkWidget *src_page, gint dest_page) { GtkWidget *tab_label; - tab_label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (src), src_page); - - /* We don't want gtk to destroy tab and src_page behind our back */ - g_object_ref (G_OBJECT (src_page)); - g_object_ref (G_OBJECT (tab_label)); - ephy_notebook_remove_page (EPHY_NOTEBOOK (src), src_page); - ephy_notebook_insert_page (EPHY_NOTEBOOK (dest), src_page, - dest_page, TRUE); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (dest), src_page, tab_label); - g_object_unref (G_OBJECT (src_page)); - g_object_unref (G_OBJECT (tab_label)); + if (dest == NULL || src == dest) + { + gtk_notebook_reorder_child (GTK_NOTEBOOK (src), src_page, dest_page); + g_signal_emit (G_OBJECT (src), ephy_notebook_signals[TABS_CHANGED], 0); + } + else + { + tab_label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (src), src_page); + + /* We don't want gtk to destroy tab and src_page behind our back */ + g_object_ref (G_OBJECT (src_page)); + g_object_ref (G_OBJECT (tab_label)); + ephy_notebook_remove_page (EPHY_NOTEBOOK (src), src_page); + ephy_notebook_insert_page (EPHY_NOTEBOOK (dest), src_page, + dest_page, TRUE); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (dest), src_page, tab_label); + g_object_unref (G_OBJECT (src_page)); + g_object_unref (G_OBJECT (tab_label)); + } } @@ -385,8 +399,8 @@ move_tab (EphyNotebook *notebook, gint dest_page_num) GtkWidget *cur_page; cur_page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), cur_page_num); - gtk_notebook_reorder_child (GTK_NOTEBOOK (notebook), cur_page, - dest_page_num); + ephy_notebook_move_page (EPHY_NOTEBOOK (notebook), NULL, cur_page, + dest_page_num); /* Reset the list of newly opened tabs when moving tabs. */ g_list_free (notebook->priv->opened_tabs); @@ -602,7 +616,7 @@ notebook_drag_data_received_cb (GtkWidget* widget, GdkDragContext *context, gchar *url = NULL; guint num = 0; gchar **tmp; - + g_signal_stop_emission_by_name (widget, "drag_data_received"); if (selection_data->length <= 0 || selection_data->data == NULL) return; @@ -651,11 +665,11 @@ notebook_drag_data_received_cb (GtkWidget* widget, GdkDragContext *context, * The first url is special: if the drag was to an * existing tab, load it there */ - ephy_embed_load_url (embed, url); + ephy_embed_load_url (embed, url); } else { - tab = ephy_shell_new_tab (ephy_shell, window, + tab = ephy_shell_new_tab (ephy_shell, window, tab, url, EPHY_NEW_TAB_IN_EXISTING_WINDOW | EPHY_NEW_TAB_APPEND_LAST | @@ -706,13 +720,13 @@ ephy_notebook_init (EphyNotebook *notebook) g_signal_connect_after (G_OBJECT (notebook), "switch_page", G_CALLBACK (ephy_notebook_switch_page_cb), NULL); - + /* Set up drag-and-drop target */ g_signal_connect (G_OBJECT(notebook), "drag_data_received", G_CALLBACK(notebook_drag_data_received_cb), NULL); gtk_drag_dest_set (GTK_WIDGET(notebook), GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_DROP, url_drag_types,n_url_drag_types, GDK_ACTION_MOVE | GDK_ACTION_COPY); } @@ -756,7 +770,7 @@ ephy_notebook_set_page_status (EphyNotebook *nb, image = g_object_get_data (G_OBJECT (tab), "loading-image"); g_return_if_fail (image != NULL); - + icon = g_object_get_data (G_OBJECT (tab), "icon"); g_return_if_fail (icon != NULL); @@ -902,7 +916,7 @@ update_tabs_visibility (EphyNotebook *nb, gboolean before_inserting) if (before_inserting) tabs_num--; - show_tabs = eel_gconf_get_boolean (CONF_TABS_TABBED) || + show_tabs = eel_gconf_get_boolean (CONF_TABS_TABBED) || gtk_notebook_get_nth_page (GTK_NOTEBOOK (nb), tabs_num) > 0; gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), show_tabs); @@ -910,9 +924,9 @@ update_tabs_visibility (EphyNotebook *nb, gboolean before_inserting) void ephy_notebook_insert_page (EphyNotebook *nb, - GtkWidget *child, - int position, - gboolean jump_to) + GtkWidget *child, + int position, + gboolean jump_to) { GtkWidget *tab_hbox; @@ -949,7 +963,7 @@ ephy_notebook_insert_page (EphyNotebook *nb, /* Set up drag-and-drop target */ g_signal_connect (G_OBJECT(tab_hbox), "drag_data_received", G_CALLBACK(notebook_drag_data_received_cb), child); - gtk_drag_dest_set (tab_hbox, GTK_DEST_DEFAULT_ALL, + gtk_drag_dest_set (tab_hbox, GTK_DEST_DEFAULT_ALL, url_drag_types,n_url_drag_types, GDK_ACTION_MOVE | GDK_ACTION_COPY); @@ -960,6 +974,8 @@ ephy_notebook_insert_page (EphyNotebook *nb, g_object_set_data (G_OBJECT (child), "jump_to", GINT_TO_POINTER (jump_to)); } + + g_signal_emit (G_OBJECT (nb), ephy_notebook_signals[TABS_CHANGED], 0); } static void @@ -1028,6 +1044,7 @@ ephy_notebook_remove_page (EphyNotebook *nb, } gtk_notebook_remove_page (GTK_NOTEBOOK (nb), position); + g_signal_emit (G_OBJECT (nb), ephy_notebook_signals[TABS_CHANGED], 0); update_tabs_visibility (nb, FALSE); } @@ -1046,4 +1063,6 @@ ephy_notebook_set_page_title (EphyNotebook *nb, ebox = GTK_WIDGET (g_object_get_data (G_OBJECT (hbox), "label-ebox")); gtk_tooltips_set_tip (GTK_TOOLTIPS (nb->priv->title_tips), ebox, title, NULL); + + g_signal_emit (G_OBJECT (nb), ephy_notebook_signals[TABS_CHANGED], 0); } |