| 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;
|
| }
|
|
|