summaryrefslogtreecommitdiffstats
path: root/views/controls/menu
diff options
context:
space:
mode:
Diffstat (limited to 'views/controls/menu')
-rw-r--r--views/controls/menu/native_menu_gtk.cc23
-rw-r--r--views/controls/menu/native_menu_gtk.h4
2 files changed, 25 insertions, 2 deletions
diff --git a/views/controls/menu/native_menu_gtk.cc b/views/controls/menu/native_menu_gtk.cc
index b648878..d570807 100644
--- a/views/controls/menu/native_menu_gtk.cc
+++ b/views/controls/menu/native_menu_gtk.cc
@@ -75,7 +75,8 @@ NativeMenuGtk::NativeMenuGtk(Menu2* menu)
activate_factory_(this),
host_menu_(menu),
menu_action_(MENU_ACTION_NONE),
- nested_dispatcher_(NULL) {
+ nested_dispatcher_(NULL),
+ ignore_button_release_(true) {
}
NativeMenuGtk::~NativeMenuGtk() {
@@ -98,6 +99,8 @@ void NativeMenuGtk::RunMenuAt(const gfx::Point& point, int alignment) {
activated_menu_ = NULL;
activated_index_ = -1;
menu_action_ = MENU_ACTION_NONE;
+ // ignore button release event unless mouse is pressed or moved.
+ ignore_button_release_ = true;
UpdateStates();
Position position = { point, static_cast<Menu2::Alignment>(alignment) };
@@ -239,6 +242,7 @@ bool NativeMenuGtk::Dispatch(GdkEvent* event) {
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
case GDK_3BUTTON_PRESS: {
+ ignore_button_release_ = true;
gpointer data = NULL;
gdk_window_get_user_data(((GdkEventAny*)event)->window, &data);
GtkWidget* widget = reinterpret_cast<GtkWidget*>(data);
@@ -258,6 +262,22 @@ bool NativeMenuGtk::Dispatch(GdkEvent* event) {
}
break;
}
+ case GDK_MOTION_NOTIFY: {
+ ignore_button_release_ = false;
+ break;
+ }
+ case GDK_BUTTON_RELEASE: {
+ if (ignore_button_release_) {
+ // Ignore if a release event happened without press event.
+ // Normally, release event is eaten by gtk when menu is opened
+ // in response to mouse press event. Since the renderer opens
+ // the context menu asyncrhonous after press event is handled,
+ // gtk sometimes does not eat it, which causes the menu to be
+ // closed.
+ return true;
+ }
+ break;
+ }
default:
break;
}
@@ -287,7 +307,6 @@ void NativeMenuGtk::OnMenuMoveCurrent(GtkWidget* menu_widget,
if (menu_item) {
submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item));
}
-
if (focus_direction == GTK_MENU_DIR_CHILD && submenu == NULL) {
GetAncestor()->menu_action_ = MENU_ACTION_NEXT;
gtk_menu_popdown(GTK_MENU(menu_widget));
diff --git a/views/controls/menu/native_menu_gtk.h b/views/controls/menu/native_menu_gtk.h
index 99d65cc..f15bc19 100644
--- a/views/controls/menu/native_menu_gtk.h
+++ b/views/controls/menu/native_menu_gtk.h
@@ -146,6 +146,10 @@ class NativeMenuGtk : public MenuWrapper,
// message loop is handled. see http://crosbug.com/7228 .
NestedDispatcherGtk* nested_dispatcher_;
+ // A flag used to detect a button release event without button press or move.
+ // see http://crosbug.com/8718.
+ bool ignore_button_release_;
+
DISALLOW_COPY_AND_ASSIGN(NativeMenuGtk);
};