Index: ash/mus/window_manager.cc |
diff --git a/ash/mus/window_manager.cc b/ash/mus/window_manager.cc |
index 3ab6ea52b2d2cd7f27322188ff18ace019e9e82b..b9640f6f340eb0d8296e68a2cfd84e709f5556f1 100644 |
--- a/ash/mus/window_manager.cc |
+++ b/ash/mus/window_manager.cc |
@@ -9,6 +9,8 @@ |
#include <utility> |
#include "ash/common/shell_window_ids.h" |
+#include "ash/mus/accelerators/accelerator_handler.h" |
+#include "ash/mus/accelerators/accelerator_ids.h" |
#include "ash/mus/bridge/wm_lookup_mus.h" |
#include "ash/mus/bridge/wm_shell_mus.h" |
#include "ash/mus/bridge/wm_window_mus.h" |
@@ -36,8 +38,6 @@ |
namespace ash { |
namespace mus { |
-const uint32_t kWindowSwitchAccelerator = 1; |
- |
void AssertTrue(bool success) { |
DCHECK(success); |
} |
@@ -79,8 +79,6 @@ void WindowManager::Init(::ui::WindowTreeClient* window_tree_client) { |
shadow_controller_.reset(new ShadowController(window_tree_client)); |
- AddAccelerators(); |
- |
// The insets are roughly what is needed by CustomFrameView. The expectation |
// is at some point we'll write our own NonClientFrameView and get the insets |
// from it. |
@@ -127,6 +125,26 @@ std::set<RootWindowController*> WindowManager::GetRootWindowControllers() { |
return result; |
} |
+bool WindowManager::GetNextAcceleratorNamespaceId(uint16_t* id) { |
+ if (accelerator_handlers_.size() == std::numeric_limits<uint16_t>::max()) |
+ return false; |
+ while (accelerator_handlers_.count(next_accelerator_namespace_id_) > 0) |
+ ++next_accelerator_namespace_id_; |
+ *id = next_accelerator_namespace_id_; |
+ ++next_accelerator_namespace_id_; |
+ return true; |
+} |
+ |
+void WindowManager::AddAcceleratorHandler(uint16_t id_namespace, |
+ AcceleratorHandler* handler) { |
+ DCHECK_EQ(0u, accelerator_handlers_.count(id_namespace)); |
+ accelerator_handlers_[id_namespace] = handler; |
+} |
+ |
+void WindowManager::RemoveAcceleratorHandler(uint16_t id_namespace) { |
+ accelerator_handlers_.erase(id_namespace); |
+} |
+ |
void WindowManager::AddObserver(WindowManagerObserver* observer) { |
observers_.AddObserver(observer); |
} |
@@ -135,16 +153,6 @@ void WindowManager::RemoveObserver(WindowManagerObserver* observer) { |
observers_.RemoveObserver(observer); |
} |
-void WindowManager::AddAccelerators() { |
- // TODO(sky): this is broke for multi-display case. Need to fix mus to |
- // deal correctly. |
- window_manager_client_->AddAccelerator( |
- kWindowSwitchAccelerator, |
- ::ui::CreateKeyMatcher(ui::mojom::KeyboardCode::TAB, |
- ui::mojom::kEventFlagControlDown), |
- base::Bind(&AssertTrue)); |
-} |
- |
RootWindowController* WindowManager::CreateRootWindowController( |
::ui::Window* window, |
const display::Display& display) { |
@@ -288,17 +296,11 @@ void WindowManager::OnWmCancelMoveLoop(::ui::Window* window) { |
ui::mojom::EventResult WindowManager::OnAccelerator(uint32_t id, |
const ui::Event& event) { |
- switch (id) { |
- case kWindowSwitchAccelerator: |
- window_manager_client()->ActivateNextWindow(); |
- break; |
- default: |
- FOR_EACH_OBSERVER(WindowManagerObserver, observers_, |
- OnAccelerator(id, event)); |
- break; |
- } |
+ auto iter = accelerator_handlers_.find(GetAcceleratorNamespaceId(id)); |
+ if (iter == accelerator_handlers_.end()) |
+ return ui::mojom::EventResult::HANDLED; |
- return ui::mojom::EventResult::HANDLED; |
+ return iter->second->OnAccelerator(id, event); |
} |
} // namespace mus |