Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: views/focus/accelerator_handler_gtk.cc

Issue 3046041: [Linux Views] Refactor accelerator handler related code. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Prevent ctrl+alt. Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: views/focus/accelerator_handler_gtk.cc
diff --git a/views/focus/accelerator_handler_gtk.cc b/views/focus/accelerator_handler_gtk.cc
index ee91906058a95adf710d8b32530cf574cdca6b78..e0af89bf0d027293b8a8d836da0bf32382b92fa1 100644
--- a/views/focus/accelerator_handler_gtk.cc
+++ b/views/focus/accelerator_handler_gtk.cc
@@ -13,112 +13,11 @@
namespace views {
-AcceleratorHandler::AcceleratorHandler() : only_menu_pressed_(false) {}
+AcceleratorHandler::AcceleratorHandler() {}
bool AcceleratorHandler::Dispatch(GdkEvent* event) {
- // When focus changes, we may not see a full key-press / key-release
- // pair, so clear the set of keys we think were pressed.
- if (event->type == GDK_FOCUS_CHANGE) {
- pressed_hardware_keys_.clear();
- consumed_vkeys_.clear();
- only_menu_pressed_ = false;
- }
-
- // Skip accelerator handling for non key events.
- bool skip = event->type != GDK_KEY_PRESS && event->type != GDK_KEY_RELEASE;
-
- // Skip if there is a grabbed widget and it is not a window. This is because
- // of the following two reasons:
- // 1. Widget such as pop up from GtkComboBox is a grabbed widget and use ESC
- // as its accelerator key to dismiss itself. We will break Gtk's code if
- // we eat this key. See http://crosbug.com/2355
- // 2. Modal dialogs in Gtk are grabbed windows and we want to have our
- // accelerator key processing in this case. See http://crogbug.com/3701
- if (!skip) {
- GtkWidget* grabbed_widget = gtk_grab_get_current();
- skip = grabbed_widget && !GTK_IS_WINDOW(grabbed_widget);
- }
-
- if (skip) {
- // Let Gtk processes the event.
- gtk_main_do_event(event);
- return true;
- }
-
- GdkEventKey* key_event = reinterpret_cast<GdkEventKey*>(event);
- // Let's retrieve the focus manager for the GdkWindow.
- GdkWindow* window = gdk_window_get_toplevel(key_event->window);
- gpointer ptr;
- gdk_window_get_user_data(window, &ptr);
- if (!ptr && !gdk_window_is_visible(window)) {
- // The window is destroyed while we're handling key events.
- gtk_main_do_event(event);
- return true;
- }
-
- DCHECK(ptr);
-
- // The top-level window or window widget is expected to always be associated
- // with the top-level gtk widget.
- WidgetGtk* widget =
- WidgetGtk::GetViewForNative(reinterpret_cast<GtkWidget*>(ptr));
- if (!widget) {
- // During dnd we get events for windows we don't control (such as the
- // window being dragged).
- gtk_main_do_event(event);
- return true;
- }
- FocusManager* focus_manager = widget->GetFocusManager();
- if (!focus_manager) {
- NOTREACHED();
- return true;
- }
-
- KeyEvent view_key_event(key_event);
- int key_code = view_key_event.GetKeyCode();
- int hardware_keycode = key_event->hardware_keycode;
- if (event->type == GDK_KEY_PRESS) {
- pressed_hardware_keys_.insert(hardware_keycode);
-
- // If it's the Alt key, don't send it to the focus manager until release
- // (to handle focusing the menu bar).
- if (key_code == base::VKEY_MENU && pressed_hardware_keys_.size() == 1) {
- only_menu_pressed_ = true;
- return true;
- }
-
- if (pressed_hardware_keys_.size() != 1)
- only_menu_pressed_ = false;
-
- // FocusManager::OnKeyEvent will return false if this message has been
- // consumed and should not be propagated further.
- if (!focus_manager->OnKeyEvent(view_key_event)) {
- consumed_vkeys_.insert(key_code);
- return true;
- }
- }
-
- if (event->type == GDK_KEY_RELEASE) {
- pressed_hardware_keys_.erase(hardware_keycode);
-
- // Make sure to filter out the key release for a key press consumed
- // as an accelerator, to avoid calling gtk_main_do_event with an
- // unpaired key release.
- if (consumed_vkeys_.find(key_code) != consumed_vkeys_.end()) {
- consumed_vkeys_.erase(key_code);
- return true;
- }
-
- // Special case: the Alt key can trigger an accelerator on release
- // rather than on press, but only if no other keys were pressed.
- if (key_code == base::VKEY_MENU && only_menu_pressed_) {
- Accelerator accelerator(base::VKEY_MENU, false, false, false);
- focus_manager->ProcessAccelerator(accelerator);
- return true;
- }
- }
-
- // Pass the event to gtk if we didn't consume it above.
+ // The logic for handling keyboard accelerators has been moved into
+ // WidgetGtk::OnKeyEvent handler (views/widget/widget_gtk.cc).
gtk_main_do_event(event);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698