aboutsummaryrefslogtreecommitdiffstats
path: root/src/toolbar.c
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2004-11-01 23:14:20 +0800
committerChristian Persch <chpe@src.gnome.org>2004-11-01 23:14:20 +0800
commit1fbc48cb732fe50940b993578d3ea0412ce1bbaf (patch)
tree8768a0392c645fb2dc2cb5c1548ed63acd39f93f /src/toolbar.c
parent7214ca07b29a87ecbbee48107767263b4106fe0a (diff)
downloadgsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.tar
gsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.tar.gz
gsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.tar.bz2
gsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.tar.lz
gsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.tar.xz
gsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.tar.zst
gsoc2013-epiphany-1fbc48cb732fe50940b993578d3ea0412ce1bbaf.zip
Don't deactivate the toolbar when another item in the same toolbar gains
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.
Diffstat (limited to 'src/toolbar.c')
-rwxr-xr-xsrc/toolbar.c98
1 files changed, 88 insertions, 10 deletions
diff --git a/src/toolbar.c b/src/toolbar.c
index 94c9d7dc0..35b32ab38 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
@@ -251,6 +260,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",
@@ -449,6 +468,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);
@@ -465,26 +490,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", window->ui_merge,
- 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)
@@ -567,3 +636,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", window->ui_merge,
+ NULL));
+}