Commit 235837ad authored by Carlos Soriano's avatar Carlos Soriano Committed by Christian Hergert

gtkwindow: Use actions from focused widget to activate accel

Currently we only take into account the window GActionGroup for
activating the accels.

However, the application could have some custom GActionGroup in the
chain of focused widgets that could want to activate some action if
some accel is activated while that widget is focused.

To allow applications to set accels on widgets that use custom
GActionGroups, simply use the muxer of the focused widget, which
already contains the actions of the parents.

https://bugzilla.gnome.org/show_bug.cgi?id=740682
parent 17fec700
......@@ -397,7 +397,7 @@ gtk_action_helper_new (GtkActionable *widget)
g_object_get (G_OBJECT (helper->widget), "active", &helper->active, NULL);
}
helper->action_context = _gtk_widget_get_action_muxer (GTK_WIDGET (widget));
helper->action_context = _gtk_widget_get_action_muxer (GTK_WIDGET (widget), TRUE);
return helper;
}
......
......@@ -379,7 +379,7 @@ gtk_menu_section_box_new_toplevel (GtkStack *stack,
box = g_object_new (GTK_TYPE_MENU_SECTION_BOX, "margin", 10, NULL);
gtk_stack_add_named (stack, GTK_WIDGET (box), "main");
box->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (_gtk_widget_get_action_muxer (GTK_WIDGET (box))),
box->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (_gtk_widget_get_action_muxer (GTK_WIDGET (box), TRUE)),
model, TRUE, FALSE, action_namespace,
gtk_menu_section_box_insert_func,
gtk_menu_section_box_remove_func, box);
......
......@@ -2194,7 +2194,7 @@ gtk_menu_shell_bind_model (GtkMenuShell *menu_shell,
g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
g_return_if_fail (model == NULL || G_IS_MENU_MODEL (model));
muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (menu_shell));
muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (menu_shell), TRUE);
g_clear_pointer (&menu_shell->priv->tracker, gtk_menu_tracker_free);
......
......@@ -16481,45 +16481,54 @@ _gtk_widget_set_style (GtkWidget *widget,
widget->priv->style = style;
}
void
_gtk_widget_update_parent_muxer (GtkWidget *widget)
GtkActionMuxer *
_gtk_widget_get_parent_muxer (GtkWidget *widget,
gboolean create)
{
GtkActionMuxer *parent_muxer;
if (widget->priv->muxer == NULL)
return;
GtkWidget *parent;
if (GTK_IS_WINDOW (widget))
{
parent_muxer = gtk_application_get_parent_muxer_for_window (GTK_WINDOW (widget));
}
return gtk_application_get_parent_muxer_for_window (GTK_WINDOW (widget));
if (GTK_IS_MENU (widget))
parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
else if (GTK_IS_POPOVER (widget))
parent = gtk_popover_get_relative_to (GTK_POPOVER (widget));
else
{
GtkWidget *parent;
parent = gtk_widget_get_parent (widget);
if (GTK_IS_MENU (widget))
parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
else if (GTK_IS_POPOVER (widget))
parent = gtk_popover_get_relative_to (GTK_POPOVER (widget));
else
parent = gtk_widget_get_parent (widget);
if (parent)
return _gtk_widget_get_action_muxer (parent, create);
parent_muxer = parent ? _gtk_widget_get_action_muxer (parent) : NULL;
}
return NULL;
}
void
_gtk_widget_update_parent_muxer (GtkWidget *widget)
{
if (widget->priv->muxer == NULL)
return;
gtk_action_muxer_set_parent (widget->priv->muxer, parent_muxer);
gtk_action_muxer_set_parent (widget->priv->muxer,
_gtk_widget_get_parent_muxer (widget, TRUE));
}
GtkActionMuxer *
_gtk_widget_get_action_muxer (GtkWidget *widget)
_gtk_widget_get_action_muxer (GtkWidget *widget,
gboolean create)
{
if (widget->priv->muxer == NULL)
if (widget->priv->muxer)
return widget->priv->muxer;
if (create)
{
widget->priv->muxer = gtk_action_muxer_new ();
_gtk_widget_update_parent_muxer (widget);
}
return widget->priv->muxer;
return widget->priv->muxer;
}
else
return _gtk_widget_get_parent_muxer (widget, FALSE);
}
/**
......@@ -16548,7 +16557,7 @@ gtk_widget_insert_action_group (GtkWidget *widget,
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (name != NULL);
muxer = _gtk_widget_get_action_muxer (widget);
muxer = _gtk_widget_get_action_muxer (widget, TRUE);
if (group)
gtk_action_muxer_insert (muxer, name, group);
......
......@@ -151,7 +151,8 @@ void _gtk_widget_invalidate_style_context (GtkWidget *widget
void _gtk_widget_style_context_invalidated (GtkWidget *widget);
void _gtk_widget_update_parent_muxer (GtkWidget *widget);
GtkActionMuxer * _gtk_widget_get_action_muxer (GtkWidget *widget);
GtkActionMuxer * _gtk_widget_get_action_muxer (GtkWidget *widget,
gboolean create);
gchar ** _gtk_widget_list_action_prefixes (GtkWidget *widget);
GActionGroup * _gtk_widget_get_action_group (GtkWidget *widget,
const gchar *prefix);
......
......@@ -11214,7 +11214,12 @@ gtk_window_activate_key (GtkWindow *window,
if (window->priv->application)
{
GtkActionMuxer *muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (window));
GtkWidget *focused_widget = gtk_window_get_focus (window);
if (focused_widget == NULL)
return FALSE;
GtkActionMuxer *muxer = _gtk_widget_get_action_muxer (focused_widget, FALSE);
if (muxer == NULL)
return FALSE;
return gtk_application_activate_accel (window->priv->application,
G_ACTION_GROUP (muxer),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment