summaryrefslogtreecommitdiffstats
path: root/views/controls/menu
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-09 02:51:13 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-09 02:51:13 +0000
commit5af7608ac5748ad12cd27cd0e3a60901e62ea02f (patch)
tree4789d6c29a7598b97430f15d87b827f7f0660bfc /views/controls/menu
parent02a6aada51c3f4da232b60f7152a3fe64fd37e0c (diff)
downloadchromium_src-5af7608ac5748ad12cd27cd0e3a60901e62ea02f.zip
chromium_src-5af7608ac5748ad12cd27cd0e3a60901e62ea02f.tar.gz
chromium_src-5af7608ac5748ad12cd27cd0e3a60901e62ea02f.tar.bz2
Do not send many requests to flimflam when network chagned.
Send sync request to flimflam only if new request didn't come in 50ms. Network menu was updating menu twice when opening. BUG=chromium-os:8435 TEST=manual: enable vlog (--vlog=1) and observe that chrome log reports one "UpdateNetworkStatus" when network changes (disable, enable ethernet etc) There may be two when wifi is enabled as different wifi source may be recognized at different timing. Review URL: http://codereview.chromium.org/4229005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65478 0039d316-1c4b-4281-b951-d872f2087c98
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);
};