summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-27 18:29:48 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-27 18:29:48 +0000
commitdb0f3b52e3eb9665eb0d073c72fb0bec6e645108 (patch)
tree941b453385208b3c00e3abef819095ee6d521766 /views
parent13e042909448bfe09c740eb2935be9f007ceb7f4 (diff)
downloadchromium_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.cc31
-rw-r--r--views/controls/menu/menu_host_gtk.h6
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);
};