From 748a94321a69d4220b97d75cc5e64aa15a2112c7 Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Mon, 1 Nov 2004 14:48:55 +0000 Subject: Don't deactivate the toolbar when another item in the same toolbar gains 2004-11-01 Christian Persch * lib/widgets/ephy-location-entry.c: (ephy_location_entry_init), (ephy_location_entry_activate): * src/ephy-location-action.c: (ephy_location_action_class_init): * src/ephy-window.c: (ephy_window_init): * src/toolbar.c: (toolbar_class_init), (toolbar_finalize), (maybe_finish_activation_cb), (toolbar_activate_location), (toolbar_update_zoom), (toolbar_new): * src/toolbar.h: Don't deactivate the toolbar when another item in the same toolbar gains focus. Fixes bug #155650. --- ChangeLog | 14 ++++++ lib/widgets/ephy-location-entry.c | 36 +------------- src/ephy-location-action.c | 15 ------ src/ephy-window.c | 3 ++ src/toolbar.c | 98 +++++++++++++++++++++++++++++++++++---- src/toolbar.h | 3 ++ 6 files changed, 109 insertions(+), 60 deletions(-) diff --git a/ChangeLog b/ChangeLog index ead73d540..cd3d985de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2004-11-01 Christian Persch + + * lib/widgets/ephy-location-entry.c: (ephy_location_entry_init), + (ephy_location_entry_activate): + * src/ephy-location-action.c: (ephy_location_action_class_init): + * src/ephy-window.c: (ephy_window_init): + * src/toolbar.c: (toolbar_class_init), (toolbar_finalize), + (maybe_finish_activation_cb), (toolbar_activate_location), + (toolbar_update_zoom), (toolbar_new): + * src/toolbar.h: + + Don't deactivate the toolbar when another item in the same toolbar + gains focus. Fixes bug #155650. + 2004-11-01 Christian Persch * embed/downloader-view.c: (update_status_icon): diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c index 6a491b82d..451efb507 100644 --- a/lib/widgets/ephy-location-entry.c +++ b/lib/widgets/ephy-location-entry.c @@ -46,7 +46,6 @@ struct _EphyLocationEntryPrivate GtkWidget *entry; char *before_completion; gboolean user_changed; - GtkWidget *shown_widget; guint text_col; guint action_col; @@ -160,24 +159,6 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass) g_type_class_add_private (object_class, sizeof (EphyLocationEntryPrivate)); } -static void -ephy_location_entry_activation_finished (EphyLocationEntry *entry) -{ - if (entry->priv->shown_widget) - { - gtk_widget_hide (entry->priv->shown_widget); - entry->priv->shown_widget = NULL; - } -} - -static gboolean -location_focus_out_cb (GtkWidget *leidget, GdkEventFocus *event, EphyLocationEntry *le) -{ - ephy_location_entry_activation_finished (le); - - return FALSE; -} - static void editable_changed_cb (GtkEditable *editable, EphyLocationEntry *e) { @@ -381,15 +362,10 @@ ephy_location_entry_init (EphyLocationEntry *le) le->priv = p; p->user_changed = TRUE; - p->shown_widget = NULL; ephy_location_entry_construct_contents (le); gtk_tool_item_set_expand (GTK_TOOL_ITEM (le), TRUE); - - g_signal_connect (le->priv->entry, - "focus_out_event", - G_CALLBACK (location_focus_out_cb), le); } GtkWidget * @@ -479,17 +455,7 @@ ephy_location_entry_get_location (EphyLocationEntry *le) void ephy_location_entry_activate (EphyLocationEntry *le) { - GtkWidget *toplevel, *widget; - - for (widget = GTK_WIDGET (le); widget != NULL; widget = widget->parent) - { - if (!GTK_WIDGET_VISIBLE (widget)) - { - le->priv->shown_widget = widget; - gtk_widget_show (le->priv->shown_widget); - break; - } - } + GtkWidget *toplevel; toplevel = gtk_widget_get_toplevel (le->priv->entry); diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c index eae9a6a6b..505a82b7e 100644 --- a/src/ephy-location-action.c +++ b/src/ephy-location-action.c @@ -327,20 +327,6 @@ ephy_location_action_get_property (GObject *object, } } -static void -ephy_location_action_activate (GtkAction *action) -{ - GSList *proxies; - - /* Note: this makes sense only for a single proxy */ - proxies = gtk_action_get_proxies (action); - - if (proxies && EPHY_IS_LOCATION_ENTRY (proxies->data)) - { - ephy_location_entry_activate (EPHY_LOCATION_ENTRY (proxies->data)); - } -} - static void ephy_location_action_class_init (EphyLocationActionClass *class) { @@ -356,7 +342,6 @@ ephy_location_action_class_init (EphyLocationActionClass *class) action_class->toolbar_item_type = EPHY_TYPE_LOCATION_ENTRY; action_class->connect_proxy = connect_proxy; action_class->disconnect_proxy = disconnect_proxy; - action_class->activate = ephy_location_action_activate; signals[GO_LOCATION] = g_signal_new ("go_location", diff --git a/src/ephy-window.c b/src/ephy-window.c index 4be634d05..bb5f7ad33 100644 --- a/src/ephy-window.c +++ b/src/ephy-window.c @@ -2391,6 +2391,9 @@ ephy_window_init (EphyWindow *window) window->priv->toolbar = toolbar_new (window); window->priv->bookmarksbar = ephy_bookmarksbar_new (window); + g_signal_connect_swapped (window->priv->toolbar, "activation-finished", + G_CALLBACK (sync_chromes_visibility), window); + /* forward the toolbar's action_request signal to the bookmarks toolbar, * so the user can also have bookmarks on the normal toolbar */ diff --git a/src/toolbar.c b/src/toolbar.c index 67f7edb4f..2b8ffd3b7 100755 --- a/src/toolbar.c +++ b/src/toolbar.c @@ -63,6 +63,14 @@ enum PROP_WINDOW }; +enum +{ + ACTIVATION_FINISHED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + static GObjectClass *parent_class = NULL; #define CONF_LOCKDOWN_DISABLE_ARBITRARY_URL "/apps/epiphany/lockdown/disable_arbitrary_url" @@ -76,6 +84,7 @@ struct ToolbarPrivate gboolean updating_address; GtkWidget *spinner; guint disable_arbitrary_url_notifier_id; + gulong set_focus_handler; }; GType @@ -250,6 +259,16 @@ toolbar_class_init (ToolbarClass *klass) widget_class->realize = toolbar_realize; widget_class->unrealize = toolbar_unrealize; + signals[ACTIVATION_FINISHED] = + g_signal_new ("activation-finished", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ToolbarClass, activation_finished), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + g_object_class_install_property (object_class, PROP_WINDOW, g_param_spec_object ("window", @@ -454,6 +473,12 @@ toolbar_finalize (GObject *object) Toolbar *t = EPHY_TOOLBAR (object); EggEditableToolbar *eggtoolbar = EGG_EDITABLE_TOOLBAR (object); + if (t->priv->set_focus_handler != 0) + { + g_signal_handler_disconnect (t->priv->window, + t->priv->set_focus_handler); + } + eel_gconf_notification_remove (t->priv->disable_arbitrary_url_notifier_id); @@ -470,26 +495,70 @@ toolbar_finalize (GObject *object) LOG ("Toolbar finalized") } -Toolbar * -toolbar_new (EphyWindow *window) +static void +maybe_finish_activation_cb (EphyWindow *window, + GtkWidget *widget, + Toolbar *toolbar) { - return EPHY_TOOLBAR (g_object_new (EPHY_TYPE_TOOLBAR, - "window", window, - "ui-manager", ephy_window_get_ui_manager (window), - NULL)); + GtkWidget *wtoolbar = GTK_WIDGET (toolbar); + + while (widget != NULL && widget != wtoolbar) + { + widget = widget->parent; + } + + /* if widget == toolbar, the new focus widget is in the toolbar, so we + * don't deactivate. + */ + if (widget != wtoolbar) + { + g_signal_handler_disconnect (window, + toolbar->priv->set_focus_handler); + toolbar->priv->set_focus_handler = 0; + + g_signal_emit (toolbar, signals[ACTIVATION_FINISHED], 0); + } } void -toolbar_activate_location (Toolbar *t) +toolbar_activate_location (Toolbar *toolbar) { GtkActionGroup *action_group; GtkAction *action; + GSList *proxies; + GtkWidget *entry = NULL; + gboolean visible; - action_group = t->priv->action_group; + action_group = toolbar->priv->action_group; action = gtk_action_group_get_action (action_group, "Location"); - gtk_action_activate (action); -} + proxies = gtk_action_get_proxies (action); + + if (proxies != NULL && EPHY_IS_LOCATION_ENTRY (proxies->data)) + { + entry = GTK_WIDGET (proxies->data); + } + + if (entry == NULL) + { + /* happens when the user has removed the location entry from + * the toolbars. + */ + return; + } + + ephy_location_entry_activate (EPHY_LOCATION_ENTRY (entry)); + + g_object_get (G_OBJECT (toolbar), "visible", &visible, NULL); + if (visible == FALSE) + { + gtk_widget_show (GTK_WIDGET (toolbar)); + toolbar->priv->set_focus_handler = + g_signal_connect (toolbar->priv->window, "set-focus", + G_CALLBACK (maybe_finish_activation_cb), + toolbar); + } +} void toolbar_spinner_start (Toolbar *t) @@ -572,3 +641,12 @@ toolbar_update_zoom (Toolbar *t, float zoom) action = gtk_action_group_get_action (action_group, "Zoom"); g_object_set (action, "zoom", zoom, NULL); } + +Toolbar * +toolbar_new (EphyWindow *window) +{ + return EPHY_TOOLBAR (g_object_new (EPHY_TYPE_TOOLBAR, + "window", window, + "ui-manager", ephy_window_get_ui_manager (window), + NULL)); +} diff --git a/src/toolbar.h b/src/toolbar.h index 8ed3a52a3..dc9cb5271 100644 --- a/src/toolbar.h +++ b/src/toolbar.h @@ -53,6 +53,9 @@ struct Toolbar struct ToolbarClass { EggEditableToolbarClass parent_class; + + /* Signals */ + void (* activation_finished) (Toolbar *toolbar); }; GType toolbar_get_type (void); -- cgit v1.2.3