Reverse the order in which the keybindings are processed by the

2008-04-27  Cosimo Cecchi  <cosimoc@gnome.org>

	* src/nautilus-window.c: (nautilus_window_key_press_event):
	Reverse the order in which the keybindings are processed by the
	NautilusWindow, and use the same approach as GEdit.
	This fixes some bugs where the GtkWindow accelerators were executed
	before the focused widget one. (#314431).

svn path=/trunk/; revision=14098
This commit is contained in:
Cosimo Cecchi 2008-04-27 17:59:50 +00:00 committed by Cosimo Cecchi
parent c2305aff96
commit 60328a4327
2 changed files with 60 additions and 23 deletions

View file

@ -1,3 +1,11 @@
2008-04-27 Cosimo Cecchi <cosimoc@gnome.org>
* src/nautilus-window.c: (nautilus_window_key_press_event):
Reverse the order in which the keybindings are processed by the
NautilusWindow, and use the same approach as GEdit.
This fixes some bugs where the GtkWindow accelerators were executed
before the focused widget one. (#314431).
2008-04-27 Christian Neumair <cneumair@gnome.org>
* src/file-manager/fm-list-view.c (button_press_callback):

View file

@ -744,39 +744,68 @@ nautilus_window_realize (GtkWidget *widget)
update_cursor (NAUTILUS_WINDOW (widget));
}
/* Here we use an approach similar to the GEdit one. We override
* GtkWindow's handler to reverse the order in which keybindings are
* processed, and then we chain up to the grand parent handler.
*/
static gboolean
nautilus_window_key_press_event (GtkWidget *widget,
GdkEventKey *event)
{
static gpointer grand_parent_class = NULL;
NautilusWindow *window;
gboolean handled;
int i;
window = NAUTILUS_WINDOW (widget);
for (i = 0; i < G_N_ELEMENTS (extra_window_keybindings); i++) {
if (extra_window_keybindings[i].keyval == event->keyval) {
const GList *action_groups;
GtkAction *action;
action = NULL;
action_groups = gtk_ui_manager_get_action_groups (window->details->ui_manager);
while (action_groups != NULL && action == NULL) {
action = gtk_action_group_get_action (action_groups->data, extra_window_keybindings[i].action);
action_groups = action_groups->next;
}
g_assert (action != NULL);
if (gtk_action_is_sensitive (action)) {
gtk_action_activate (action);
return TRUE;
}
break;
}
handled = FALSE;
if (!grand_parent_class) {
grand_parent_class = g_type_class_peek_parent (nautilus_window_parent_class);
}
return GTK_WIDGET_CLASS (nautilus_window_parent_class)->key_press_event (widget, event);
/* handle currently focused widget */
if (!handled) {
handled = gtk_window_propagate_key_event (GTK_WINDOW (window), event);
}
/* handle extra window keybindings */
if (!handled) {
for (i = 0; i < G_N_ELEMENTS (extra_window_keybindings); i++) {
if (extra_window_keybindings[i].keyval == event->keyval) {
const GList *action_groups;
GtkAction *action;
action = NULL;
action_groups = gtk_ui_manager_get_action_groups (window->details->ui_manager);
while (action_groups != NULL && action == NULL) {
action = gtk_action_group_get_action (action_groups->data,
extra_window_keybindings[i].action);
action_groups = action_groups->next;
}
g_assert (action != NULL);
if (gtk_action_is_sensitive (action)) {
gtk_action_activate (action);
handled = TRUE;
}
break;
}
}
}
/* handle mnemonics and accelerators */
if (!handled) {
handled = gtk_window_activate_key (GTK_WINDOW (window), event);
}
/* chain up to the grand parent */
if (!handled) {
handled = GTK_WIDGET_CLASS (grand_parent_class)->key_press_event (widget, event);
}
return handled;
}
/*