diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ephy-nautilus-view.c | 3 | ||||
-rw-r--r-- | src/ephy-notebook.c | 167 | ||||
-rw-r--r-- | src/ephy-notebook.h | 43 | ||||
-rw-r--r-- | src/ephy-session.c | 8 | ||||
-rw-r--r-- | src/ephy-shell.c | 3 | ||||
-rw-r--r-- | src/ephy-tab.c | 138 | ||||
-rw-r--r-- | src/ephy-tab.h | 7 | ||||
-rw-r--r-- | src/ephy-tabs-menu.c | 36 | ||||
-rw-r--r-- | src/ephy-window.c | 103 | ||||
-rw-r--r-- | src/ephy-window.h | 2 | ||||
-rw-r--r-- | src/window-commands.c | 15 |
11 files changed, 261 insertions, 264 deletions
diff --git a/src/ephy-nautilus-view.c b/src/ephy-nautilus-view.c index 7a05e0b91..fd6b5420e 100644 --- a/src/ephy-nautilus-view.c +++ b/src/ephy-nautilus-view.c @@ -428,12 +428,13 @@ gnv_embed_new_window_cb (EphyEmbed *embed, EphyEmbed **new_embed, window = ephy_window_new (); new_tab = ephy_tab_new (); + gtk_widget_show (GTK_WIDGET (new_tab)); + ephy_window_add_tab (window, new_tab, EPHY_NOTEBOOK_INSERT_LAST, FALSE); *new_embed = ephy_tab_get_embed (new_tab); } - static void gnv_bonobo_control_activate_cb (BonoboControl *control, gboolean state, EphyNautilusView *view) { diff --git a/src/ephy-notebook.c b/src/ephy-notebook.c index 56353b936..1a6d65cc8 100644 --- a/src/ephy-notebook.c +++ b/src/ephy-notebook.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2002 Christophe Fergeau - * Copyright (C) 2003 Christian Persch + * Copyright (C) 2003 Marco Pesenti Gritti + * Copyright (C) 2003, 2004 Christian Persch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -74,7 +75,7 @@ static void ephy_notebook_class_init (EphyNotebookClass *klass); static void ephy_notebook_finalize (GObject *object); static void move_tab_to_another_notebook (EphyNotebook *src, EphyNotebook *dest, - gint dest_page); + int dest_position); /* Local variables */ static GdkCursor *cursor = NULL; @@ -146,7 +147,7 @@ ephy_notebook_class_init (EphyNotebookClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - GTK_TYPE_WIDGET); + EPHY_TYPE_TAB); signals[TAB_REMOVED] = g_signal_new ("tab_removed", G_OBJECT_CLASS_TYPE (object_class), @@ -156,7 +157,7 @@ ephy_notebook_class_init (EphyNotebookClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - GTK_TYPE_WIDGET); + EPHY_TYPE_TAB); signals[TAB_DETACHED] = g_signal_new ("tab_detached", G_OBJECT_CLASS_TYPE (object_class), @@ -166,7 +167,7 @@ ephy_notebook_class_init (EphyNotebookClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - GTK_TYPE_WIDGET); + EPHY_TYPE_TAB); signals[TABS_REORDERED] = g_signal_new ("tabs_reordered", G_OBJECT_CLASS_TYPE (object_class), @@ -185,7 +186,7 @@ ephy_notebook_class_init (EphyNotebookClass *klass) ephy_marshal_BOOLEAN__OBJECT, G_TYPE_BOOLEAN, 1, - GTK_TYPE_WIDGET); + EPHY_TYPE_TAB); g_type_class_add_private (object_class, sizeof(EphyNotebookPrivate)); } @@ -344,26 +345,28 @@ tab_label_set_size (GtkWidget *window, GtkWidget *label) static void tab_label_size_request_cb (GtkWidget *window, GtkRequisition *requisition, - GtkWidget *child) + GtkWidget *tab) { GtkWidget *hbox; GtkWidget *nb; - nb = child->parent; + nb = tab->parent; hbox = gtk_notebook_get_tab_label (GTK_NOTEBOOK (nb), - child); + tab); tab_label_set_size (window, hbox); } - void -ephy_notebook_move_page (EphyNotebook *src, EphyNotebook *dest, - GtkWidget *src_page, gint dest_page) +ephy_notebook_move_tab (EphyNotebook *src, + EphyNotebook *dest, + EphyTab *tab, + int dest_position) { if (dest == NULL || src == dest) { - gtk_notebook_reorder_child (GTK_NOTEBOOK (src), src_page, dest_page); + gtk_notebook_reorder_child + (GTK_NOTEBOOK (src), GTK_WIDGET (tab), dest_position); if (src->priv->drag_in_progress == FALSE) { @@ -372,12 +375,11 @@ ephy_notebook_move_page (EphyNotebook *src, EphyNotebook *dest, } else { - /* make sure the tab isn't destroyed while we move its embed */ - g_object_ref (G_OBJECT (src_page)); - ephy_notebook_remove_page (EPHY_NOTEBOOK (src), src_page); - ephy_notebook_insert_page (EPHY_NOTEBOOK (dest), src_page, - dest_page, TRUE); - g_object_unref (G_OBJECT (src_page)); + /* make sure the tab isn't destroyed while we move it */ + g_object_ref (tab); + ephy_notebook_remove_tab (src, tab); + ephy_notebook_insert_tab (dest, tab, dest_position, TRUE); + g_object_unref (tab); } } @@ -420,19 +422,22 @@ drag_stop (EphyNotebook *notebook) * here, instead we do it on drag_stop */ static void -move_tab (EphyNotebook *notebook, gint dest_page_num) +move_tab (EphyNotebook *notebook, + int dest_position) { gint cur_page_num; cur_page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook)); - if (dest_page_num != cur_page_num) + if (dest_position != cur_page_num) { - GtkWidget *cur_page; - cur_page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), - cur_page_num); - ephy_notebook_move_page (EPHY_NOTEBOOK (notebook), NULL, cur_page, - dest_page_num); + GtkWidget *cur_tab; + + cur_tab = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), + cur_page_num); + ephy_notebook_move_tab (EPHY_NOTEBOOK (notebook), NULL, + EPHY_TAB (cur_tab), + dest_position); /* Reset the list of newly opened tabs when moving tabs. */ g_list_free (notebook->priv->opened_tabs); @@ -441,7 +446,8 @@ move_tab (EphyNotebook *notebook, gint dest_page_num) } static gboolean -motion_notify_cb (EphyNotebook *notebook, GdkEventMotion *event, +motion_notify_cb (EphyNotebook *notebook, + GdkEventMotion *event, gpointer data) { EphyNotebook *dest; @@ -485,11 +491,12 @@ motion_notify_cb (EphyNotebook *notebook, GdkEventMotion *event, } static void -move_tab_to_another_notebook(EphyNotebook *src, - EphyNotebook *dest, gint dest_page) +move_tab_to_another_notebook (EphyNotebook *src, + EphyNotebook *dest, + int dest_position) { - GtkWidget *child; - gint cur_page; + EphyTab *tab; + int cur_page; /* This is getting tricky, the tab was dragged in a notebook * in another window of the same app, we move the tab @@ -500,13 +507,13 @@ move_tab_to_another_notebook(EphyNotebook *src, g_assert (dest != src); cur_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (src)); - child = gtk_notebook_get_nth_page (GTK_NOTEBOOK (src), cur_page); + tab = EPHY_TAB (gtk_notebook_get_nth_page (GTK_NOTEBOOK (src), cur_page)); /* stop drag in origin window */ drag_stop (src); gtk_grab_remove (GTK_WIDGET (src)); - ephy_notebook_move_page (src, dest, child, dest_page); + ephy_notebook_move_tab (src, dest, tab, dest_position); /* start drag handling in dest notebook */ drag_start (dest); @@ -518,9 +525,9 @@ move_tab_to_another_notebook(EphyNotebook *src, NULL); } -/* Callbacks */ static gboolean -button_release_cb (EphyNotebook *notebook, GdkEventButton *event, +button_release_cb (EphyNotebook *notebook, + GdkEventButton *event, gpointer data) { if (notebook->priv->drag_in_progress) @@ -553,7 +560,6 @@ button_release_cb (EphyNotebook *notebook, GdkEventButton *event, return FALSE; } - static gboolean button_press_cb (EphyNotebook *notebook, GdkEventButton *event, @@ -590,9 +596,9 @@ ephy_notebook_new (void) static void ephy_notebook_switch_page_cb (GtkNotebook *notebook, - GtkNotebookPage *page, - guint page_num, - gpointer data) + GtkNotebookPage *page, + guint page_num, + gpointer data) { EphyNotebook *nb = EPHY_NOTEBOOK (notebook); GtkWidget *child; @@ -737,6 +743,10 @@ ephy_notebook_init (EphyNotebook *notebook) { notebook->priv = EPHY_NOTEBOOK_GET_PRIVATE (notebook); + gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE); + notebook->priv->title_tips = gtk_tooltips_new (); g_object_ref (G_OBJECT (notebook->priv->title_tips)); gtk_object_sink (GTK_OBJECT (notebook->priv->title_tips)); @@ -864,22 +874,22 @@ sync_label (EphyTab *tab, GParamSpec *pspec, GtkWidget *proxy) } static void -close_button_clicked_cb (GtkWidget *widget, GtkWidget *child) +close_button_clicked_cb (GtkWidget *widget, GtkWidget *tab) { EphyNotebook *notebook; gboolean inhibited = FALSE; - notebook = EPHY_NOTEBOOK (gtk_widget_get_parent (child)); - g_signal_emit (G_OBJECT (notebook), signals[TAB_DELETE], 0, child, &inhibited); + notebook = EPHY_NOTEBOOK (gtk_widget_get_parent (tab)); + g_signal_emit (G_OBJECT (notebook), signals[TAB_DELETE], 0, tab, &inhibited); if (inhibited == FALSE) { - ephy_notebook_remove_page (notebook, child); + ephy_notebook_remove_tab (notebook, EPHY_TAB (tab)); } } static GtkWidget * -build_tab_label (EphyNotebook *nb, GtkWidget *child) +build_tab_label (EphyNotebook *nb, EphyTab *tab) { GtkWidget *label, *hbox, *close_button, *image; int h, w; @@ -930,7 +940,7 @@ build_tab_label (EphyNotebook *nb, GtkWidget *child) tab_label_set_size (GTK_WIDGET (window), hbox); closure = g_cclosure_new (G_CALLBACK (tab_label_size_request_cb), - child, NULL); + tab, NULL); g_object_watch_closure (G_OBJECT (label), closure); g_signal_connect_closure_by_id (G_OBJECT (window), g_signal_lookup ("size_request", @@ -944,7 +954,7 @@ build_tab_label (EphyNotebook *nb, GtkWidget *child) g_signal_connect (G_OBJECT (close_button), "clicked", G_CALLBACK (close_button_clicked_cb), - child); + tab); gtk_widget_show (hbox); gtk_widget_show (label_ebox); @@ -970,19 +980,16 @@ ephy_notebook_set_show_tabs (EphyNotebook *nb, gboolean show_tabs) } void -ephy_notebook_insert_page (EphyNotebook *nb, - GtkWidget *child, - int position, - gboolean jump_to) +ephy_notebook_insert_tab (EphyNotebook *nb, + EphyTab *tab, + int position, + gboolean jump_to) { - EphyTab *tab; GtkWidget *label; - g_return_if_fail (EPHY_IS_EMBED (child)); - tab = ephy_tab_for_embed (EPHY_EMBED (child)); g_return_if_fail (EPHY_IS_TAB (tab)); - label = build_tab_label (nb, child); + label = build_tab_label (nb, tab); update_tabs_visibility (nb, TRUE); @@ -1005,16 +1012,16 @@ ephy_notebook_insert_page (EphyNotebook *nb, (GTK_NOTEBOOK (nb)) + 1; } nb->priv->opened_tabs = - g_list_append (nb->priv->opened_tabs, child); + g_list_append (nb->priv->opened_tabs, tab); } - gtk_notebook_insert_page (GTK_NOTEBOOK (nb), child, + gtk_notebook_insert_page (GTK_NOTEBOOK (nb), GTK_WIDGET (tab), label, position); /* Set up drag-and-drop target */ g_signal_connect (G_OBJECT(label), "drag_data_received", - G_CALLBACK(notebook_drag_data_received_cb), child); + G_CALLBACK(notebook_drag_data_received_cb), tab); gtk_drag_dest_set (label, GTK_DEST_DEFAULT_ALL, url_drag_types,n_url_drag_types, GDK_ACTION_MOVE | GDK_ACTION_COPY); @@ -1030,25 +1037,25 @@ ephy_notebook_insert_page (EphyNotebook *nb, g_signal_connect_object (tab, "notify::load-status", G_CALLBACK (sync_load_status), label, 0); - g_signal_emit (G_OBJECT (nb), signals[TAB_ADDED], 0, child); + g_signal_emit (G_OBJECT (nb), signals[TAB_ADDED], 0, tab); if (jump_to) { gtk_notebook_set_current_page (GTK_NOTEBOOK (nb), position); - g_object_set_data (G_OBJECT (child), "jump_to", + g_object_set_data (G_OBJECT (tab), "jump_to", GINT_TO_POINTER (jump_to)); } } static void smart_tab_switching_on_closure (EphyNotebook *nb, - GtkWidget *child) + EphyTab *tab) { gboolean jump_to; jump_to = GPOINTER_TO_INT (g_object_get_data - (G_OBJECT (child), "jump_to")); + (G_OBJECT (tab), "jump_to")); if (!jump_to || !nb->priv->focused_pages) { @@ -1071,17 +1078,13 @@ smart_tab_switching_on_closure (EphyNotebook *nb, } void -ephy_notebook_remove_page (EphyNotebook *nb, - GtkWidget *child) +ephy_notebook_remove_tab (EphyNotebook *nb, + EphyTab *tab) { int num, position, curr; - EphyTab *tab; GtkWidget *label, *ebox; g_return_if_fail (EPHY_IS_NOTEBOOK (nb)); - g_return_if_fail (EPHY_IS_EMBED (child)); - - tab = ephy_tab_for_embed (EPHY_EMBED (child)); g_return_if_fail (EPHY_IS_TAB (tab)); num = gtk_notebook_get_n_pages (GTK_NOTEBOOK (nb)); @@ -1095,39 +1098,39 @@ ephy_notebook_remove_page (EphyNotebook *nb, /* Remove the page from the focused pages list */ nb->priv->focused_pages = g_list_remove (nb->priv->focused_pages, - child); - nb->priv->opened_tabs = g_list_remove (nb->priv->opened_tabs, child); + tab); + nb->priv->opened_tabs = g_list_remove (nb->priv->opened_tabs, tab); - position = gtk_notebook_page_num (GTK_NOTEBOOK (nb), child); + position = gtk_notebook_page_num (GTK_NOTEBOOK (nb), GTK_WIDGET (tab)); curr = gtk_notebook_get_current_page (GTK_NOTEBOOK (nb)); if (position == curr) { - smart_tab_switching_on_closure (nb, child); + smart_tab_switching_on_closure (nb, tab); } - label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (nb), child); + label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (nb), GTK_WIDGET (tab)); ebox = GTK_WIDGET (g_object_get_data (G_OBJECT (label), "label-ebox")); gtk_tooltips_set_tip (GTK_TOOLTIPS (nb->priv->title_tips), ebox, NULL, NULL); - g_signal_handlers_disconnect_by_func (label, - G_CALLBACK (sync_icon), tab); - g_signal_handlers_disconnect_by_func (label, - G_CALLBACK (sync_label), tab); - g_signal_handlers_disconnect_by_func (label, - G_CALLBACK (sync_load_status), tab); + g_signal_handlers_disconnect_by_func (tab, + G_CALLBACK (sync_icon), label); + g_signal_handlers_disconnect_by_func (tab, + G_CALLBACK (sync_label), label); + g_signal_handlers_disconnect_by_func (tab, + G_CALLBACK (sync_load_status), label); /** - * we ref the child so that it's still alive while the tabs_removed + * we ref the tab so that it's still alive while the tabs_removed * signal is processed. */ - g_object_ref (child); + g_object_ref (tab); gtk_notebook_remove_page (GTK_NOTEBOOK (nb), position); update_tabs_visibility (nb, FALSE); - g_signal_emit (G_OBJECT (nb), signals[TAB_REMOVED], 0, child); + g_signal_emit (G_OBJECT (nb), signals[TAB_REMOVED], 0, tab); - g_object_unref (child); + g_object_unref (tab); } diff --git a/src/ephy-notebook.h b/src/ephy-notebook.h index 314ad098c..452fb10db 100644 --- a/src/ephy-notebook.h +++ b/src/ephy-notebook.h @@ -1,5 +1,7 @@ /* * Copyright (C) 2002 Christophe Fergeau + * Copyright (C) 2003 Marco Pesenti Gritti + * Copyright (C) 2003, 2004 Christian Persch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +23,8 @@ #ifndef EPHY_NOTEBOOK_H #define EPHY_NOTEBOOK_H +#include "ephy-tab.h" + #include <glib.h> #include <gtk/gtknotebook.h> @@ -33,21 +37,14 @@ G_BEGIN_DECLS #define EPHY_IS_NOTEBOOK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_NOTEBOOK)) #define EPHY_NOTEBOOK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EPHY_TYPE_NOTEBOOK, EphyNotebookClass)) -typedef struct EphyNotebookClass EphyNotebookClass; -typedef struct EphyNotebook EphyNotebook; -typedef struct EphyNotebookPrivate EphyNotebookPrivate; - -typedef enum -{ - EPHY_NOTEBOOK_TAB_LOAD_NORMAL, - EPHY_NOTEBOOK_TAB_LOAD_LOADING, - EPHY_NOTEBOOK_TAB_LOAD_COMPLETED -} EphyNotebookPageLoadStatus; +typedef struct EphyNotebookClass EphyNotebookClass; +typedef struct EphyNotebook EphyNotebook; +typedef struct EphyNotebookPrivate EphyNotebookPrivate; enum { - EPHY_NOTEBOOK_INSERT_LAST = -1, - EPHY_NOTEBOOK_INSERT_GROUPED = -2 + EPHY_NOTEBOOK_INSERT_LAST = -1, + EPHY_NOTEBOOK_INSERT_GROUPED = -2 }; struct EphyNotebook @@ -64,32 +61,32 @@ struct EphyNotebookClass /* Signals */ void (* tab_added) (EphyNotebook *notebook, - GtkWidget *child); + EphyTab *tab); void (* tab_removed) (EphyNotebook *notebook, - GtkWidget *child); + EphyTab *tab); void (* tab_detached) (EphyNotebook *notebook, - GtkWidget *child); + EphyTab *tab); void (* tabs_reordered) (EphyNotebook *notebook); void (* tab_delete) (EphyNotebook *notebook, - GtkWidget *child); + EphyTab *tab); }; GType ephy_notebook_get_type (void); GtkWidget *ephy_notebook_new (void); -void ephy_notebook_insert_page (EphyNotebook *nb, - GtkWidget *child, +void ephy_notebook_insert_tab (EphyNotebook *nb, + EphyTab *tab, int position, gboolean jump_to); -void ephy_notebook_remove_page (EphyNotebook *nb, - GtkWidget *child); +void ephy_notebook_remove_tab (EphyNotebook *nb, + EphyTab *tab); -void ephy_notebook_move_page (EphyNotebook *src, +void ephy_notebook_move_tab (EphyNotebook *src, EphyNotebook *dest, - GtkWidget *src_page, - gint dest_page); + EphyTab *tab, + int dest_position); void ephy_notebook_set_show_tabs (EphyNotebook *nb, gboolean show_tabs); diff --git a/src/ephy-session.c b/src/ephy-session.c index cd318d264..7c91444e5 100644 --- a/src/ephy-session.c +++ b/src/ephy-session.c @@ -151,22 +151,22 @@ net_stop_cb (EphyEmbed *embed, static void tab_added_cb (GtkWidget *notebook, - GtkWidget *child, + EphyTab *tab, EphySession *session) { - g_signal_connect (child, "net_stop", + g_signal_connect (ephy_tab_get_embed (tab), "net_stop", G_CALLBACK (net_stop_cb), session); } static void tab_removed_cb (GtkWidget *notebook, - GtkWidget *child, + EphyTab *tab, EphySession *session) { ephy_session_save (session, SESSION_CRASHED); g_signal_handlers_disconnect_by_func - (child, G_CALLBACK (net_stop_cb), session); + (ephy_tab_get_embed (tab), G_CALLBACK (net_stop_cb), session); } static void diff --git a/src/ephy-shell.c b/src/ephy-shell.c index f22da2cc0..7bd229531 100644 --- a/src/ephy-shell.c +++ b/src/ephy-shell.c @@ -600,8 +600,9 @@ ephy_shell_new_tab (EphyShell *shell, } tab = ephy_tab_new (); + gtk_widget_show (GTK_WIDGET (tab)); embed = ephy_tab_get_embed (tab); - gtk_widget_show (GTK_WIDGET(embed)); + ephy_window_add_tab (window, tab, position, jump_to); diff --git a/src/ephy-tab.c b/src/ephy-tab.c index 5cf9c83aa..0f0d84d67 100644 --- a/src/ephy-tab.c +++ b/src/ephy-tab.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2000-2003 Marco Pesenti Gritti - * Copyright (C) 2003 Christian Persch + * Copyright (C) 2003, 2004 Christian Persch + * Copyright (C) 2004 Crispin Flowerday * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -61,7 +62,6 @@ struct EphyTabPrivate { - EphyEmbed *embed; EphyWindow *window; char *status_message; char *link_message; @@ -146,7 +146,7 @@ ephy_tab_get_type (void) (GInstanceInitFunc) ephy_tab_init }; - ephy_tab_type = g_type_register_static (G_TYPE_OBJECT, + ephy_tab_type = g_type_register_static (GTK_TYPE_BIN, "EphyTab", &our_info, 0); } @@ -233,6 +233,40 @@ ephy_tab_get_property (GObject *object, } static void +ephy_tab_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GtkWidget *child; + + widget->allocation = *allocation; + + child = GTK_BIN (widget)->child; + + if (child && GTK_WIDGET_VISIBLE (child)) + { + gtk_widget_size_allocate (child, allocation); + } +} + +static void +ephy_tab_parent_set (GtkWidget *widget, + GtkWidget *previous_parent) +{ + if (widget->parent) + { + GtkWidget *toplevel; + toplevel = gtk_widget_get_toplevel (widget); + + ephy_tab_set_window (EPHY_TAB (widget), EPHY_WINDOW (toplevel)); + } + + if (GTK_WIDGET_CLASS (parent_class)->parent_set) + { + GTK_WIDGET_CLASS (parent_class)->parent_set (widget, previous_parent); + } +} + +static void ephy_tab_action_activate_cb (GtkAction *action, EphyTab *tab) { g_return_if_fail (EPHY_IS_TAB (tab)); @@ -248,6 +282,7 @@ static void ephy_tab_class_init (EphyTabClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); parent_class = g_type_class_peek_parent (class); @@ -255,6 +290,9 @@ ephy_tab_class_init (EphyTabClass *class) object_class->get_property = ephy_tab_get_property; object_class->set_property = ephy_tab_set_property; + widget_class->size_allocate = ephy_tab_size_allocate; + widget_class->parent_set = ephy_tab_parent_set; + g_object_class_install_property (object_class, PROP_ADDRESS, g_param_spec_string ("address", @@ -357,31 +395,13 @@ ephy_tab_class_init (EphyTabClass *class) } static void -ephy_tab_parent_set_cb (GtkWidget *widget, GtkWidget *previous_parent, - EphyTab *tab) -{ - GtkWidget *toplevel; - - if (widget->parent == NULL) return; - - toplevel = gtk_widget_get_toplevel (widget); - ephy_tab_set_window (tab, EPHY_WINDOW (toplevel)); -} -static void -ephy_tab_embed_destroy_cb (GtkWidget *widget, EphyTab *tab) -{ - LOG ("GtkMozEmbed destroy signal on EphyTab") - g_object_unref (tab); -} - -static void ephy_tab_finalize (GObject *object) { EphyTab *tab = EPHY_TAB (object); - g_idle_remove_by_data (tab->priv->embed); + g_idle_remove_by_data (tab); - if (tab->priv->action) + if (tab->priv->action != NULL) { g_object_unref (tab->priv->action); } @@ -420,11 +440,7 @@ address_has_web_scheme (const char *address) EphyTab * ephy_tab_new (void) { - EphyTab *tab; - - tab = EPHY_TAB (g_object_new (EPHY_TYPE_TAB, NULL)); - - return tab; + return EPHY_TAB (g_object_new (EPHY_TYPE_TAB, NULL)); } static void @@ -469,19 +485,20 @@ ephy_tab_get_embed (EphyTab *tab) { g_return_val_if_fail (EPHY_IS_TAB (tab), NULL); - return tab->priv->embed; + return EPHY_EMBED (gtk_bin_get_child (GTK_BIN (tab))); } EphyTab * ephy_tab_for_embed (EphyEmbed *embed) { - EphyTab *tab; + GtkWidget *parent; g_return_val_if_fail (EPHY_IS_EMBED (embed), NULL); - tab = EPHY_TAB (g_object_get_data (G_OBJECT (embed), "ephy-tab")); + parent = GTK_WIDGET (embed)->parent; + g_return_val_if_fail (parent != NULL, NULL); - return tab; + return EPHY_TAB (parent); } void @@ -878,30 +895,38 @@ ephy_tab_new_window_cb (EphyEmbed *embed, EphyEmbed **new_embed, ephy_window_request_chrome (window, chromemask); new_tab = ephy_tab_new (); + gtk_widget_show (GTK_WIDGET (new_tab)); + ephy_window_add_tab (window, new_tab, EPHY_NOTEBOOK_INSERT_GROUPED, FALSE); *new_embed = ephy_tab_get_embed (new_tab); } static gboolean -let_me_resize_hack (gpointer data) +let_me_resize_hack (gpointer *tab_ptr) { - gtk_widget_set_size_request (GTK_WIDGET(data), - -1, -1); + if (*tab_ptr != NULL) + { + g_object_remove_weak_pointer (G_OBJECT (*tab_ptr), tab_ptr); + gtk_widget_set_size_request (GTK_WIDGET (*tab_ptr), -1, -1); + + g_free (tab_ptr); + } + return FALSE; } static void ephy_tab_visibility_cb (EphyEmbed *embed, gboolean visibility, - EphyTab *tab) + EphyTab *tab) { if (visibility) { - gtk_widget_show (GTK_WIDGET(embed)); + gtk_widget_show (GTK_WIDGET (tab)); } else { - gtk_widget_hide (GTK_WIDGET(embed)); + gtk_widget_hide (GTK_WIDGET (tab)); } ephy_tab_set_visibility (tab, visibility); @@ -922,14 +947,13 @@ ephy_tab_size_to_cb (EphyEmbed *embed, gint width, gint height, { GtkWidget *notebook; EphyWindow *window; - GtkWidget *widget; + gpointer *tab_ptr; tab->priv->width = width; tab->priv->height = height; window = tab->priv->window; notebook = ephy_window_get_notebook (window); - widget = GTK_WIDGET (embed); /* Do not resize window with multiple tabs. * Do not resize window already showed because @@ -939,14 +963,18 @@ ephy_tab_size_to_cb (EphyEmbed *embed, gint width, gint height, !tab->priv->visibility) { gtk_widget_set_size_request - (widget, width, height); + (GTK_WIDGET (tab), width, height); /* HACK reset widget requisition after the container * has been resized. It appears to be the only way * to have the window sized according to embed * size correctly. */ - g_idle_add (let_me_resize_hack, embed); + + tab_ptr = g_new (gpointer, 1); + *tab_ptr = tab; + g_object_add_weak_pointer (G_OBJECT (tab), tab_ptr); + g_idle_add ((GSourceFunc) let_me_resize_hack, tab_ptr); } } @@ -1100,7 +1128,7 @@ ephy_tab_dom_mouse_click_cb (EphyEmbed *embed, g_object_add_weak_pointer (G_OBJECT (tab), weak_ptr); gtk_clipboard_request_text - (gtk_widget_get_clipboard (GTK_WIDGET (tab->priv->embed), + (gtk_widget_get_clipboard (GTK_WIDGET (tab), GDK_SELECTION_PRIMARY), (GtkClipboardTextReceivedFunc) clipboard_text_received_cb, weak_ptr); @@ -1124,7 +1152,7 @@ ephy_tab_security_change_cb (EphyEmbed *embed, EmbedSecurityLevel level, static void ephy_tab_init (EphyTab *tab) { - GObject *embed, *embed_widget; + GObject *embed; EphyFaviconCache *cache; char *id; @@ -1150,12 +1178,11 @@ ephy_tab_init (EphyTab *tab) tab->priv->setting_zoom = FALSE; tab->priv->address_expire = TAB_ADDRESS_EXPIRE_NOW; - tab->priv->embed = EPHY_EMBED - (ephy_embed_factory_new_object ("EphyEmbed")); - g_assert (tab->priv->embed != NULL); + embed = ephy_embed_factory_new_object ("EphyEmbed"); + g_assert (embed != NULL); - embed = G_OBJECT (tab->priv->embed); - embed_widget = G_OBJECT (tab->priv->embed); + gtk_container_add (GTK_CONTAINER (tab), GTK_WIDGET (embed)); + gtk_widget_show (GTK_WIDGET (embed)); id = g_strdup_printf ("Tab%lu", tab_id++); @@ -1169,15 +1196,6 @@ ephy_tab_init (EphyTab *tab) g_signal_connect (tab->priv->action, "activate", G_CALLBACK (ephy_tab_action_activate_cb), tab); - /* set a pointer in the embed's widget back to the tab */ - g_object_set_data (embed_widget, "ephy-tab", tab); - - g_signal_connect_object (embed_widget, "parent_set", - G_CALLBACK (ephy_tab_parent_set_cb), - tab, 0); - g_signal_connect_object (embed_widget, "destroy", - G_CALLBACK (ephy_tab_embed_destroy_cb), - tab, 0); g_signal_connect_object (embed, "link_message", G_CALLBACK (ephy_tab_link_message_cb), tab, 0); @@ -1249,7 +1267,7 @@ ephy_tab_update_navigation_flags (EphyTab *tab) EphyEmbed *embed; TabNavigationFlags flags = 0; - embed = tab->priv->embed; + embed = ephy_tab_get_embed (tab); if (ephy_embed_can_go_up (embed)) { @@ -1318,7 +1336,7 @@ ephy_tab_set_title (EphyTab *tab, const char *new_title) GnomeVFSURI *uri = NULL; char *address; - address = ephy_embed_get_location (tab->priv->embed, TRUE); + address = ephy_embed_get_location (ephy_tab_get_embed (tab), TRUE); if (address) { diff --git a/src/ephy-tab.h b/src/ephy-tab.h index cb685cd74..69408213f 100644 --- a/src/ephy-tab.h +++ b/src/ephy-tab.h @@ -24,8 +24,7 @@ #include "ephy-embed.h" -#include <glib-object.h> -#include <gtk/gtkwidget.h> +#include <gtk/gtkbin.h> G_BEGIN_DECLS @@ -56,7 +55,7 @@ typedef enum struct EphyTab { - GObject parent; + GtkBin parent; /*< private >*/ EphyTabPrivate *priv; @@ -64,7 +63,7 @@ struct EphyTab struct EphyTabClass { - GObjectClass parent_class; + GtkBinClass parent_class; }; /* Include the header down here to resolve circular dependency */ diff --git a/src/ephy-tabs-menu.c b/src/ephy-tabs-menu.c index ffa4a7058..df6984627 100644 --- a/src/ephy-tabs-menu.c +++ b/src/ephy-tabs-menu.c @@ -38,10 +38,6 @@ #define MAX_LABEL_LENGTH 30 -/** - * Private data - */ - #define EPHY_TABS_MENU_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_TABS_MENU, EphyTabsMenuPrivate)) struct _EphyTabsMenuPrivate @@ -51,9 +47,6 @@ struct _EphyTabsMenuPrivate guint ui_id; }; -/** - * Private functions, only availble from this file - */ static void ephy_tabs_menu_class_init (EphyTabsMenuClass *klass); static void ephy_tabs_menu_init (EphyTabsMenu *menu); @@ -63,10 +56,6 @@ enum PROP_WINDOW }; -/** - * EphyTabsMenu object - */ - GType ephy_tabs_menu_get_type (void) { @@ -96,13 +85,11 @@ ephy_tabs_menu_get_type (void) } static void -tab_added_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyTabsMenu *menu) +tab_added_cb (EphyNotebook *notebook, EphyTab *tab, EphyTabsMenu *menu) { - EphyTab *tab; GtkAction *action; - g_return_if_fail (EPHY_IS_EMBED (embed)); - tab = ephy_tab_for_embed (embed); + g_return_if_fail (EPHY_IS_TAB (tab)); action = GTK_ACTION (ephy_tab_get_action (tab)); gtk_action_group_add_action (menu->priv->action_group, action); @@ -111,13 +98,11 @@ tab_added_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyTabsMenu *menu) } static void -tab_removed_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyTabsMenu *menu) +tab_removed_cb (EphyNotebook *notebook, EphyTab *tab, EphyTabsMenu *menu) { - EphyTab *tab; GtkAction *action; - g_return_if_fail (EPHY_IS_EMBED (embed)); - tab = ephy_tab_for_embed (embed); + g_return_if_fail (EPHY_IS_TAB (tab)); action = GTK_ACTION (ephy_tab_get_action (tab)); gtk_action_group_remove_action (menu->priv->action_group, action); @@ -126,6 +111,12 @@ tab_removed_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyTabsMenu *menu) } static void +tabs_reordered_cb (EphyNotebook *notebook, EphyTabsMenu *menu) +{ + ephy_tabs_menu_update (menu); +} + +static void ephy_tabs_menu_set_window (EphyTabsMenu *menu, EphyWindow *window) { GtkWidget *notebook; @@ -143,6 +134,8 @@ ephy_tabs_menu_set_window (EphyTabsMenu *menu, EphyWindow *window) G_CALLBACK (tab_added_cb), menu, 0); g_signal_connect_object (notebook, "tab_removed", G_CALLBACK (tab_removed_cb), menu, 0); + g_signal_connect_object (notebook, "tabs_reordered", + G_CALLBACK (tabs_reordered_cb), menu, 0); } static void @@ -281,7 +274,6 @@ ephy_tabs_menu_update (EphyTabsMenu *menu) EphyTab *tab; GtkAction *action; guint i = 0; - guint num = 0; GList *tabs = NULL, *l; g_return_if_fail (EPHY_IS_TABS_MENU (menu)); @@ -296,8 +288,7 @@ ephy_tabs_menu_update (EphyTabsMenu *menu) tabs = ephy_window_get_tabs (p->window); - num = g_list_length (tabs); - if (num == 0) return; + if (g_list_length (tabs) == 0) return; p->ui_id = gtk_ui_manager_new_merge_id (merge); @@ -306,7 +297,6 @@ ephy_tabs_menu_update (EphyTabsMenu *menu) const char *action_name; char *name; - tab = (EphyTab *) l->data; action = GTK_ACTION (ephy_tab_get_action (tab)); action_name = gtk_action_get_name (action); diff --git a/src/ephy-window.c b/src/ephy-window.c index 193858355..0b3a4fa5e 100644 --- a/src/ephy-window.c +++ b/src/ephy-window.c @@ -1563,12 +1563,11 @@ update_tabs_menu_sensitivity (EphyWindow *window) } static void -tab_added_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyWindow *window) +tab_added_cb (EphyNotebook *notebook, + EphyTab *tab, + EphyWindow *window) { - EphyTab *tab; - - g_return_if_fail (EPHY_IS_EMBED (embed)); - tab = ephy_tab_for_embed (embed); + g_return_if_fail (EPHY_IS_TAB (tab)); window->priv->num_tabs++; @@ -1579,12 +1578,11 @@ tab_added_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyWindow *window) } static void -tab_removed_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyWindow *window) +tab_removed_cb (EphyNotebook *notebook, + EphyTab *tab, + EphyWindow *window) { - EphyTab *tab; - - g_return_if_fail (EPHY_IS_EMBED (embed)); - tab = ephy_tab_for_embed (embed); + g_return_if_fail (EPHY_IS_TAB (tab)); g_signal_handlers_disconnect_by_func (G_OBJECT (tab), G_CALLBACK (sync_tab_visibility), @@ -1604,18 +1602,18 @@ tab_removed_cb (EphyNotebook *notebook, EphyEmbed *embed, EphyWindow *window) } static void -tab_detached_cb (EphyNotebook *notebook, GtkWidget *child, +tab_detached_cb (EphyNotebook *notebook, + EphyTab *tab, gpointer data) { EphyWindow *window; - g_return_if_fail (EPHY_IS_NOTEBOOK (notebook)); - g_return_if_fail (EPHY_IS_EMBED (child)); + g_return_if_fail (EPHY_IS_TAB (tab)); window = ephy_window_new (); - ephy_notebook_move_page (notebook, - EPHY_NOTEBOOK (ephy_window_get_notebook (window)), - child, 0); + ephy_notebook_move_tab (notebook, + EPHY_NOTEBOOK (ephy_window_get_notebook (window)), + tab, 0); gtk_widget_show (GTK_WIDGET (window)); } @@ -1623,15 +1621,16 @@ static void tabs_reordered_cb (EphyNotebook *notebook, EphyWindow *window) { update_tabs_menu_sensitivity (window); - ephy_tabs_menu_update (window->priv->tabs_menu); } static gboolean -tab_delete_cb (EphyNotebook *notebook, GtkWidget *child, EphyWindow *window) +tab_delete_cb (EphyNotebook *notebook, + EphyTab *tab, + EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_EMBED (child), FALSE); + g_return_val_if_fail (EPHY_IS_TAB (tab), FALSE); - if (ephy_embed_has_modified_forms (EPHY_EMBED (child))) + if (ephy_embed_has_modified_forms (ephy_tab_get_embed (tab))) { return !confirm_close_with_modified_forms (window); } @@ -1645,9 +1644,6 @@ setup_notebook (EphyWindow *window) GtkNotebook *notebook; notebook = GTK_NOTEBOOK (ephy_notebook_new ()); - gtk_notebook_set_scrollable (notebook, TRUE); - gtk_notebook_set_show_border (notebook, FALSE); - gtk_notebook_set_show_tabs (notebook, FALSE); g_signal_connect_after (G_OBJECT (notebook), "switch_page", G_CALLBACK ( @@ -2126,21 +2122,18 @@ ephy_window_add_tab (EphyWindow *window, widget = GTK_WIDGET(ephy_tab_get_embed (tab)); - ephy_notebook_insert_page (EPHY_NOTEBOOK (window->priv->notebook), - widget, position, jump_to); + ephy_notebook_insert_tab (EPHY_NOTEBOOK (window->priv->notebook), + tab, position, jump_to); } void ephy_window_jump_to_tab (EphyWindow *window, - EphyTab *tab) + EphyTab *tab) { - GtkWidget *widget; int page; - widget = GTK_WIDGET(ephy_tab_get_embed (tab)); - page = gtk_notebook_page_num - (window->priv->notebook, widget); + (window->priv->notebook, GTK_WIDGET (tab)); gtk_notebook_set_current_page (window->priv->notebook, page); } @@ -2148,21 +2141,17 @@ ephy_window_jump_to_tab (EphyWindow *window, static EphyTab * real_get_active_tab (EphyWindow *window, int page_num) { - EphyTab *tab; - GtkWidget *embed_widget; + GtkWidget *tab; if (page_num == -1) { page_num = gtk_notebook_get_current_page (window->priv->notebook); } - embed_widget = gtk_notebook_get_nth_page (window->priv->notebook, - page_num); + tab = gtk_notebook_get_nth_page (window->priv->notebook, page_num); - g_return_val_if_fail (GTK_IS_WIDGET (embed_widget), NULL); - tab = ephy_tab_for_embed (EPHY_EMBED (embed_widget)); g_return_val_if_fail (EPHY_IS_TAB (tab), NULL); - return tab; + return EPHY_TAB (tab); } void @@ -2186,8 +2175,7 @@ ephy_window_remove_tab (EphyWindow *window, return; } - ephy_notebook_remove_page (EPHY_NOTEBOOK (window->priv->notebook), - GTK_WIDGET (embed)); + ephy_notebook_remove_tab (EPHY_NOTEBOOK (window->priv->notebook), tab); } /** @@ -2264,6 +2252,7 @@ EphyTab * ephy_window_get_active_tab (EphyWindow *window) { g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_TAB (window->priv->active_tab), NULL); return window->priv->active_tab; } @@ -2276,35 +2265,33 @@ ephy_window_get_active_embed (EphyWindow *window) g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); tab = ephy_window_get_active_tab (window); + g_return_val_if_fail (EPHY_IS_TAB (tab), NULL); - if (tab) - { - return ephy_tab_get_embed (tab); - } - - return NULL; + return ephy_tab_get_embed (tab); } +/** + * ephy_window_get_tabs: + * @window: a #EphyWindow + * + * Returns the list of #EphyTab:s in the window. + * + */ GList * ephy_window_get_tabs (EphyWindow *window) { - GList *tabs = NULL; - GtkWidget *w; - int i = 0; + GtkNotebook *notebook; + GList *list = NULL; + int i, num; - while ((w = gtk_notebook_get_nth_page (window->priv->notebook, i)) != NULL) + notebook = GTK_NOTEBOOK (window->priv->notebook); + num = gtk_notebook_get_n_pages (notebook); + for (i = 0; i < num; i++) { - EphyTab *tab; - - g_return_val_if_fail (EPHY_IS_EMBED (w), NULL); - tab = ephy_tab_for_embed (EPHY_EMBED (w)); - g_return_val_if_fail (EPHY_IS_TAB (tab), NULL); - - tabs = g_list_prepend (tabs, tab); - i++; + list = g_list_prepend (list, gtk_notebook_get_nth_page (notebook, i)); } - return g_list_reverse (tabs); + return g_list_reverse (list); } static void diff --git a/src/ephy-window.h b/src/ephy-window.h index 8d124ea77..dede5259f 100644 --- a/src/ephy-window.h +++ b/src/ephy-window.h @@ -23,7 +23,6 @@ #include "ephy-embed.h" #include "ephy-dialog.h" -#include "ephy-notebook.h" #include <glib-object.h> #include <glib.h> @@ -66,6 +65,7 @@ typedef enum /* Include the header down here to resolve circular dependency */ #include "ephy-tab.h" +#include "ephy-notebook.h" GType ephy_window_get_type (void); diff --git a/src/window-commands.c b/src/window-commands.c index dd952d474..5a39dee4e 100644 --- a/src/window-commands.c +++ b/src/window-commands.c @@ -1058,7 +1058,8 @@ window_cmd_tabs_move_left (GtkAction *action, GtkWidget *child; child = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page); - ephy_notebook_move_page (EPHY_NOTEBOOK (notebook), NULL, child, page - 1); + ephy_notebook_move_tab (EPHY_NOTEBOOK (notebook), NULL, + EPHY_TAB (child), page - 1); } } @@ -1078,7 +1079,8 @@ void window_cmd_tabs_move_right (GtkAction *action, GtkWidget *child; child = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page); - ephy_notebook_move_page (EPHY_NOTEBOOK (notebook), NULL, child, page + 1); + ephy_notebook_move_tab (EPHY_NOTEBOOK (notebook), NULL, + EPHY_TAB (child), page + 1); } } @@ -1087,19 +1089,18 @@ window_cmd_tabs_detach (GtkAction *action, EphyWindow *window) { EphyTab *tab; - GtkWidget *src_page, *nb; + GtkWidget *nb; EphyWindow *new_win; nb = ephy_window_get_notebook (window); if (gtk_notebook_get_n_pages (GTK_NOTEBOOK (nb)) <= 1) return; tab = ephy_window_get_active_tab (window); - src_page = GTK_WIDGET (ephy_tab_get_embed (tab)); + new_win = ephy_window_new (); - ephy_notebook_move_page (EPHY_NOTEBOOK (ephy_window_get_notebook (window)), + ephy_notebook_move_tab (EPHY_NOTEBOOK (ephy_window_get_notebook (window)), EPHY_NOTEBOOK (ephy_window_get_notebook (new_win)), - src_page, 0); - ephy_tab_set_window (tab, new_win); + tab, 0); gtk_widget_show (GTK_WIDGET (new_win)); } |