Index: ui/views/controls/menu/menu_controller.cc |
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc |
index ea854a2e2451d653f7d757aebc16fab91ed4ec52..1861724d21d6488bc51f379ac0ff14cacb753f35 100644 |
--- a/ui/views/controls/menu/menu_controller.cc |
+++ b/ui/views/controls/menu/menu_controller.cc |
@@ -21,6 +21,8 @@ |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/events/event_constants.h" |
#include "ui/events/event_utils.h" |
+#include "ui/events/platform/platform_event_source.h" |
+#include "ui/events/platform/scoped_event_dispatcher.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/native_widget_types.h" |
#include "ui/gfx/screen.h" |
@@ -30,7 +32,6 @@ |
#include "ui/views/controls/menu/menu_config.h" |
#include "ui/views/controls/menu/menu_controller_delegate.h" |
#include "ui/views/controls/menu/menu_host_root_view.h" |
-#include "ui/views/controls/menu/menu_message_pump_dispatcher.h" |
#include "ui/views/controls/menu/menu_scroll_view_container.h" |
#include "ui/views/controls/menu/submenu_view.h" |
#include "ui/views/drag_utils.h" |
@@ -49,7 +50,10 @@ |
#if defined(OS_WIN) |
#include "ui/base/win/internal_constants.h" |
+#include "ui/views/controls/menu/menu_message_pump_dispatcher_win.h" |
#include "ui/views/win/hwnd_util.h" |
+#else |
+#include "ui/views/controls/menu/menu_event_dispatcher_linux.h" |
#endif |
using base::Time; |
@@ -1171,6 +1175,7 @@ MenuController::~MenuController() { |
StopCancelAllTimer(); |
} |
+#if defined(OS_WIN) |
void MenuController::RunMessageLoop(bool nested_menu) { |
internal::MenuMessagePumpDispatcher nested_dispatcher(this); |
@@ -1189,6 +1194,32 @@ void MenuController::RunMessageLoop(bool nested_menu) { |
run_loop.Run(); |
} |
} |
+#else |
+void MenuController::RunMessageLoop(bool nested_menu) { |
+ internal::MenuEventDispatcher event_dispatcher(this); |
+ scoped_ptr<ui::ScopedEventDispatcher> old_dispatcher = |
+ nested_dispatcher_.Pass(); |
+ if (ui::PlatformEventSource::GetInstance()) { |
+ nested_dispatcher_ = |
+ ui::PlatformEventSource::GetInstance()->OverrideDispatcher( |
+ &event_dispatcher); |
+ } |
+ // |owner_| may be NULL. |
+ aura::Window* root = GetOwnerRootWindow(owner_); |
+ if (root) { |
+ scoped_ptr<ActivationChangeObserverImpl> observer; |
+ if (!nested_menu) |
+ observer.reset(new ActivationChangeObserverImpl(this, root)); |
+ aura::client::GetDispatcherClient(root)->RunWithDispatcher(NULL); |
+ } else { |
+ base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
+ base::MessageLoop::ScopedNestableTaskAllower allow(loop); |
+ base::RunLoop run_loop; |
+ run_loop.Run(); |
+ } |
+ nested_dispatcher_ = old_dispatcher.Pass(); |
+} |
+#endif |
MenuController::SendAcceleratorResultType |
MenuController::SendAcceleratorToHotTrackedView() { |
@@ -2303,6 +2334,8 @@ void MenuController::SetExitType(ExitType type) { |
} else { |
base::MessageLoop::current()->QuitNow(); |
} |
+ // Restore the previous dispatcher. |
+ nested_dispatcher_.reset(); |
} |
} |