diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | lib/widgets/ephy-location-entry.c | 36 | ||||
-rw-r--r-- | src/ephy-location-action.c | 15 | ||||
-rw-r--r-- | src/ephy-window.c | 3 | ||||
-rwxr-xr-x | src/toolbar.c | 98 | ||||
-rw-r--r-- | src/toolbar.h | 3 |
6 files changed, 109 insertions, 60 deletions
@@ -1,5 +1,19 @@ 2004-11-01 Christian Persch <chpe@cvs.gnome.org> + * 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 <chpe@cvs.gnome.org> + * embed/downloader-view.c: (update_status_icon): Remove seconds remaining display from tooltip of tray 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; @@ -161,24 +160,6 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass) } 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) { EphyLocationEntryPrivate *p = e->priv; @@ -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 @@ -328,20 +328,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) { GObjectClass *object_class = G_OBJECT_CLASS (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); |