nautilus r14098 - in trunk: . src



Author: cosimoc
Date: Sun Apr 27 17:59:50 2008
New Revision: 14098
URL: http://svn.gnome.org/viewvc/nautilus?rev=14098&view=rev

Log:
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).


Modified:
   trunk/ChangeLog
   trunk/src/nautilus-window.c

Modified: trunk/src/nautilus-window.c
==============================================================================
--- trunk/src/nautilus-window.c	(original)
+++ trunk/src/nautilus-window.c	Sun Apr 27 17:59:50 2008
@@ -744,39 +744,68 @@
 	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);
+	handled = FALSE;
+	if (!grand_parent_class) {
+		grand_parent_class = g_type_class_peek_parent (nautilus_window_parent_class);
+	}
+
+	/* 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;
+				}
 
-	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;
 			}
-
-			break;
 		}
 	}
-
-	return GTK_WIDGET_CLASS (nautilus_window_parent_class)->key_press_event (widget, event);
+	
+	/* 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;
 }
 
 /*



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]