Chromium Code Reviews| Index: ash/root_window_controller.cc |
| diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc |
| index d4e9d54f46839f0cdd8618e43dbd7a68b361a19d..0d939ffa14715b99c9f2753cd7275176832a9a33 100644 |
| --- a/ash/root_window_controller.cc |
| +++ b/ash/root_window_controller.cc |
| @@ -56,6 +56,7 @@ |
| #include "ash/wm/window_util.h" |
| #include "ash/wm/workspace_controller.h" |
| #include "base/command_line.h" |
| +#include "base/macros.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/time/time.h" |
| #include "ui/aura/client/aura_constants.h" |
| @@ -71,6 +72,7 @@ |
| #include "ui/display/screen.h" |
| #include "ui/keyboard/keyboard_controller.h" |
| #include "ui/keyboard/keyboard_util.h" |
| +#include "ui/views/controls/menu/menu_model_adapter.h" |
| #include "ui/views/controls/menu/menu_runner.h" |
| #include "ui/views/view_model.h" |
| #include "ui/views/view_model_utils.h" |
| @@ -589,27 +591,26 @@ void RootWindowController::ShowContextMenu(const gfx::Point& location_in_screen, |
| ui::MenuSourceType source_type) { |
| ShellDelegate* delegate = Shell::GetInstance()->delegate(); |
| DCHECK(delegate); |
| - std::unique_ptr<ui::MenuModel> menu_model( |
| - delegate->CreateContextMenu(shelf_->shelf(), nullptr)); |
| - if (!menu_model) |
| + menu_model_.reset(delegate->CreateContextMenu(shelf_->shelf(), nullptr)); |
| + if (!menu_model_) |
| return; |
| + menu_model_adapter_.reset(new views::MenuModelAdapter( |
| + menu_model_.get(), |
| + base::Bind(&RootWindowController::OnMenuClosed, base::Unretained(this)))); |
| + |
| // Background controller may not be set yet if user clicked on status are |
| // before initial animation completion. See crbug.com/222218 |
| if (!wallpaper_controller_.get()) |
| return; |
| - views::MenuRunner menu_runner(menu_model.get(), |
| - views::MenuRunner::CONTEXT_MENU); |
| - if (menu_runner.RunMenuAt(wallpaper_controller_->widget(), |
| - NULL, |
| - gfx::Rect(location_in_screen, gfx::Size()), |
| - views::MENU_ANCHOR_TOPLEFT, |
| - source_type) == views::MenuRunner::MENU_DELETED) { |
| - return; |
| - } |
| - |
| - Shell::GetInstance()->UpdateShelfVisibility(); |
| + menu_runner_.reset(new views::MenuRunner( |
| + menu_model_adapter_->CreateMenu(), |
| + views::MenuRunner::CONTEXT_MENU | views::MenuRunner::ASYNC)); |
| + ignore_result( |
| + menu_runner_->RunMenuAt(wallpaper_controller_->widget(), NULL, |
| + gfx::Rect(location_in_screen, gfx::Size()), |
| + views::MENU_ANCHOR_TOPLEFT, source_type)); |
| } |
| void RootWindowController::UpdateShelfVisibility() { |
| @@ -684,7 +685,10 @@ RootWindowController::RootWindowController(AshWindowTreeHost* ash_host) |
| docked_layout_manager_(NULL), |
| panel_layout_manager_(NULL), |
| touch_hud_debug_(NULL), |
| - touch_hud_projection_(NULL) { |
| + touch_hud_projection_(NULL), |
| + menu_model_(nullptr), |
|
sky
2016/05/16 15:44:41
nit: you don't need any of these in the initialize
jonross
2016/05/16 16:53:49
Done.
|
| + menu_model_adapter_(nullptr), |
| + menu_runner_(nullptr) { |
| aura::Window* root_window = GetRootWindow(); |
| GetRootWindowSettings(root_window)->controller = this; |
| @@ -1043,6 +1047,13 @@ void RootWindowController::DisableTouchHudProjection() { |
| touch_hud_projection_->Remove(); |
| } |
| +void RootWindowController::OnMenuClosed() { |
| + menu_runner_.reset(); |
| + menu_model_adapter_.reset(); |
| + menu_model_.reset(); |
| + Shell::GetInstance()->UpdateShelfVisibility(); |
| +} |
| + |
| void RootWindowController::OnLoginStateChanged(user::LoginStatus status) { |
| shelf_->shelf_layout_manager()->UpdateVisibilityState(); |
| } |