Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Unified Diff: views/controls/menu/menu_controller.cc

Issue 8597010: Send fake event when event_type is set to exit menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: use xdisplay_ Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/controls/menu/menu_controller.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/controls/menu/menu_controller.cc
diff --git a/views/controls/menu/menu_controller.cc b/views/controls/menu/menu_controller.cc
index 84433b5e8bb358bb75b7f162f11371c93c3b512e..3269c62b2d4c2bf5308ee50107b9c63be64628be 100644
--- a/views/controls/menu/menu_controller.cc
+++ b/views/controls/menu/menu_controller.cc
@@ -24,11 +24,11 @@
#include "views/widget/root_view.h"
#include "views/widget/widget.h"
-#if defined(USE_AURA) && !defined(OS_WIN)
+#if defined(USE_AURA)
#include "ui/aura/desktop.h"
#endif
-#if defined(OS_LINUX)
+#if defined(TOOLKIT_USES_GTK)
#include "ui/base/keycodes/keyboard_code_conversion_gtk.h"
#endif
@@ -348,7 +348,7 @@ MenuItemView* MenuController::Run(Widget* parent,
*result_mouse_event_flags = result_mouse_event_flags_;
if (exit_type_ == EXIT_OUTERMOST) {
- exit_type_ = EXIT_NONE;
+ SetExitType(EXIT_NONE);
} else {
if (nested_menu && result) {
// We're nested and about to return a value. The caller might enter
@@ -359,7 +359,7 @@ MenuItemView* MenuController::Run(Widget* parent,
// Set exit_all_, which makes sure all nested loops exit immediately.
if (exit_type_ != EXIT_DESTROYED)
- exit_type_ = EXIT_ALL;
+ SetExitType(EXIT_ALL);
}
}
@@ -387,7 +387,7 @@ void MenuController::Cancel(ExitType type) {
}
MenuItemView* selected = state_.item;
- exit_type_ = type;
+ SetExitType(type);
SendMouseCaptureLostToActiveView();
@@ -426,7 +426,7 @@ void MenuController::OnMousePressed(SubmenuView* source,
// We're going to close and we own the mouse capture. We need to repost the
// mouse down, otherwise the window the user clicked on won't get the
// event.
-#if defined(OS_WIN)
+#if defined(OS_WIN) && !defined(USE_AURA)
RepostEvent(source, event);
// NOTE: not reposting on linux seems fine.
#endif
@@ -720,7 +720,7 @@ int MenuController::OnPerformDrop(SubmenuView* source,
// Set state such that we exit.
showing_ = false;
- exit_type_ = EXIT_ALL;
+ SetExitType(EXIT_ALL);
// If over an empty menu item, drop occurs on the parent.
if (drop_target->id() == MenuItemView::kEmptyMenuItemViewID)
@@ -1101,9 +1101,9 @@ void MenuController::Accept(MenuItemView* item, int mouse_event_flags) {
result_ = item;
if (item && !menu_stack_.empty() &&
!item->GetDelegate()->ShouldCloseAllMenusOnExecute(item->GetCommand())) {
- exit_type_ = EXIT_OUTERMOST;
+ SetExitType(EXIT_OUTERMOST);
} else {
- exit_type_ = EXIT_ALL;
+ SetExitType(EXIT_ALL);
}
result_mouse_event_flags_ = mouse_event_flags;
}
@@ -1782,12 +1782,7 @@ bool MenuController::SelectByChar(char16 character) {
return false;
}
-#if defined(OS_WIN)
-#if defined(USE_AURA)
-void MenuController::RepostEvent(SubmenuView* source,
- const MouseEvent& event) {
-}
-#else
+#if defined(OS_WIN) && !defined(USE_AURA)
void MenuController::RepostEvent(SubmenuView* source,
const MouseEvent& event) {
if (!state_.item) {
@@ -1854,7 +1849,6 @@ void MenuController::RepostEvent(SubmenuView* source,
}
}
}
-#endif // !defined(USE_AURA)
#endif // defined(OS_WIN)
void MenuController::SetDropMenuItem(
@@ -1961,4 +1955,17 @@ void MenuController::SendMouseCaptureLostToActiveView() {
active_view->OnMouseCaptureLost();
}
+void MenuController::SetExitType(ExitType type) {
+ exit_type_ = type;
+#if defined(USE_AURA)
+ // On aura, closing menu may not trigger next native event, which
+ // is necessary to exit from nested loop (See Dispatch methods).
+ // Send non-op event so that Dispatch method will always be called.
+ // crbug.com/104684.
+ if (exit_type_ == EXIT_ALL || exit_type_ == EXIT_DESTROYED)
+ aura::Desktop::GetInstance()->PostNativeEvent(ui::CreateNoopEvent());
+#endif
+}
+
+
} // namespace views
« no previous file with comments | « views/controls/menu/menu_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698