diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-27 18:29:48 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-27 18:29:48 +0000 |
commit | db0f3b52e3eb9665eb0d073c72fb0bec6e645108 (patch) | |
tree | 941b453385208b3c00e3abef819095ee6d521766 /views | |
parent | 13e042909448bfe09c740eb2935be9f007ceb7f4 (diff) | |
download | chromium_src-db0f3b52e3eb9665eb0d073c72fb0bec6e645108.zip chromium_src-db0f3b52e3eb9665eb0d073c72fb0bec6e645108.tar.gz chromium_src-db0f3b52e3eb9665eb0d073c72fb0bec6e645108.tar.bz2 |
Grab keyboard input when showing domui/views menu.
BUG=chromium-os:8118
TEST=manual: open more than 2 windows, then open wrench menu and hit alt-tab.
It will not switch to other window.
Review URL: http://codereview.chromium.org/4189002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@64103 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/controls/menu/menu_host_gtk.cc | 31 | ||||
-rw-r--r-- | views/controls/menu/menu_host_gtk.h | 6 |
2 files changed, 21 insertions, 16 deletions
diff --git a/views/controls/menu/menu_host_gtk.cc b/views/controls/menu/menu_host_gtk.cc index c3d5d1f..917ded3 100644 --- a/views/controls/menu/menu_host_gtk.cc +++ b/views/controls/menu/menu_host_gtk.cc @@ -22,7 +22,7 @@ MenuHostGtk::MenuHostGtk(SubmenuView* submenu) : WidgetGtk(WidgetGtk::TYPE_POPUP), destroying_(false), submenu_(submenu), - did_pointer_grab_(false) { + did_input_grab_(false) { GdkEvent* event = gtk_get_current_event(); if (event) { if (event->type == GDK_BUTTON_PRESS || event->type == GDK_2BUTTON_PRESS || @@ -100,9 +100,10 @@ bool MenuHostGtk::ReleaseCaptureOnMouseReleased() { void MenuHostGtk::ReleaseGrab() { WidgetGtk::ReleaseGrab(); - if (did_pointer_grab_) { - did_pointer_grab_ = false; + if (did_input_grab_) { + did_input_grab_ = false; gdk_pointer_ungrab(GDK_CURRENT_TIME); + gdk_keyboard_ungrab(GDK_CURRENT_TIME); } } @@ -117,13 +118,12 @@ void MenuHostGtk::OnDestroy(GtkWidget* object) { } gboolean MenuHostGtk::OnGrabBrokeEvent(GtkWidget* widget, GdkEvent* event) { - did_pointer_grab_ = false; + did_input_grab_ = false; // Grab can be broken by drag & drop, other menu or screen locker. MenuController* menu_controller = submenu_->GetMenuItem()->GetMenuController(); - if (!menu_controller->drag_in_progress()) { + if (!menu_controller->drag_in_progress()) menu_controller->CancelAll(); - } return WidgetGtk::OnGrabBrokeEvent(widget, event); } @@ -133,20 +133,25 @@ void MenuHostGtk::DoCapture() { if (current_grab_window) gtk_grab_remove(current_grab_window); - // Make sure all app mouse events are targetted at us only. + // Make sure all app mouse/keyboard events are targetted at us only. DoGrab(); - // And do a grab. - // NOTE: we do this to ensure we get mouse events from other apps, a grab - // done with gtk_grab_add doesn't get events from other apps. - GdkGrabStatus grab_status = + // And do a grab. NOTE: we do this to ensure we get mouse/keyboard + // events from other apps, a grab done with gtk_grab_add doesn't get + // events from other apps. + GdkGrabStatus pointer_grab_status = gdk_pointer_grab(window_contents()->window, FALSE, static_cast<GdkEventMask>( GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK), NULL, NULL, GDK_CURRENT_TIME); - did_pointer_grab_ = (grab_status == GDK_GRAB_SUCCESS); - DCHECK(did_pointer_grab_); + GdkGrabStatus keyboard_grab_status = + gdk_keyboard_grab(window_contents()->window, FALSE, + GDK_CURRENT_TIME); + + did_input_grab_ = pointer_grab_status == GDK_GRAB_SUCCESS && + keyboard_grab_status == GDK_GRAB_SUCCESS; + DCHECK(did_input_grab_); // need keyboard grab. } diff --git a/views/controls/menu/menu_host_gtk.h b/views/controls/menu/menu_host_gtk.h index 02eb2e6..135b1c3 100644 --- a/views/controls/menu/menu_host_gtk.h +++ b/views/controls/menu/menu_host_gtk.h @@ -40,7 +40,7 @@ class MenuHostGtk : public WidgetGtk, public MenuHost { // release. virtual bool ReleaseCaptureOnMouseReleased(); - // Overriden to also release pointer grab. + // Overriden to also release input grab. virtual void ReleaseGrab(); virtual void OnDestroy(GtkWidget* object); @@ -55,8 +55,8 @@ class MenuHostGtk : public WidgetGtk, public MenuHost { // The view we contain. SubmenuView* submenu_; - // Have we done a pointer grab? - bool did_pointer_grab_; + // Have we done input grab? + bool did_input_grab_; DISALLOW_COPY_AND_ASSIGN(MenuHostGtk); }; |