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

Unified Diff: athena/input/accelerator_manager_impl.cc

Issue 332443005: Enable accelerators on web activity window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months 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
Index: athena/input/accelerator_manager_impl.cc
diff --git a/athena/input/accelerator_manager_impl.cc b/athena/input/accelerator_manager_impl.cc
index a76c19b22d6d16371f9f715ede073d0562dec041..ccd83bd18560a460e1457f55a8e27abd858fc7bd 100644
--- a/athena/input/accelerator_manager_impl.cc
+++ b/athena/input/accelerator_manager_impl.cc
@@ -22,6 +22,18 @@
namespace athena {
+// This wrapper interface provides a common interface that handles global
+// accelerators as well as local accelerators.
+class AcceleratorManagerImpl::AcceleratorWrapper {
+ public:
+ virtual ~AcceleratorWrapper() {}
+ virtual void Register(const ui::Accelerator& accelerator,
+ ui::AcceleratorTarget* target) = 0;
+ virtual bool Process(const ui::Accelerator& accelerator) = 0;
+ virtual ui::AcceleratorTarget* GetCurrentTarget(
+ const ui::Accelerator& accelertor) const = 0;
+};
+
namespace {
// Accelerators inside nested message loop are handled by
@@ -63,7 +75,7 @@ class AcceleratorDelegate : public wm::AcceleratorDelegate {
KeyType key_type) OVERRIDE {
aura::Window* target = static_cast<aura::Window*>(event.target());
if (!target->IsRootWindow() &&
- !accelerator_manager_->IsReserved(accelerator)) {
+ !accelerator_manager_->IsRegistered(accelerator, AF_RESERVED)) {
// TODO(oshima): do the same when the active window is in fullscreen.
return false;
}
@@ -86,7 +98,7 @@ class FocusManagerDelegate : public views::FocusManagerDelegate {
virtual ui::AcceleratorTarget* GetCurrentTargetForAccelerator(
const ui::Accelerator& accelerator) const OVERRIDE {
- return accelerator_manager_->IsRegistered(accelerator)
+ return accelerator_manager_->IsRegistered(accelerator, AF_NONE)
? accelerator_manager_
: NULL;
}
@@ -121,6 +133,62 @@ class FocusManagerFactory : public views::FocusManagerFactory {
DISALLOW_COPY_AND_ASSIGN(FocusManagerFactory);
};
+class UIAcceleratorManagerWrapper
+ : public AcceleratorManagerImpl::AcceleratorWrapper {
+ public:
+ UIAcceleratorManagerWrapper()
+ : ui_accelerator_manager_(new ui::AcceleratorManager) {}
+ virtual ~UIAcceleratorManagerWrapper() {}
+
+ virtual void Register(const ui::Accelerator& accelerator,
+ ui::AcceleratorTarget* target) OVERRIDE {
+ return ui_accelerator_manager_->Register(
+ accelerator, ui::AcceleratorManager::kNormalPriority, target);
+ }
+
+ virtual bool Process(const ui::Accelerator& accelerator) OVERRIDE {
+ return ui_accelerator_manager_->Process(accelerator);
+ }
+
+ virtual ui::AcceleratorTarget* GetCurrentTarget(
+ const ui::Accelerator& accelerator) const OVERRIDE {
+ return ui_accelerator_manager_->GetCurrentTarget(accelerator);
+ }
+
+ private:
+ scoped_ptr<ui::AcceleratorManager> ui_accelerator_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(UIAcceleratorManagerWrapper);
+};
+
+class FocusManagerWrapper : public AcceleratorManagerImpl::AcceleratorWrapper {
+ public:
+ explicit FocusManagerWrapper(views::FocusManager* focus_manager)
+ : focus_manager_(focus_manager) {}
+ virtual ~FocusManagerWrapper() {}
+
+ virtual void Register(const ui::Accelerator& accelerator,
+ ui::AcceleratorTarget* target) OVERRIDE {
+ return focus_manager_->RegisterAccelerator(
+ accelerator, ui::AcceleratorManager::kNormalPriority, target);
+ }
+
+ virtual bool Process(const ui::Accelerator& accelerator) OVERRIDE {
+ NOTREACHED();
+ return true;
+ }
+
+ virtual ui::AcceleratorTarget* GetCurrentTarget(
+ const ui::Accelerator& accelerator) const OVERRIDE {
+ return focus_manager_->GetCurrentTargetForAccelerator(accelerator);
+ }
+
+ private:
+ views::FocusManager* focus_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(FocusManagerWrapper);
+};
+
} // namespace
class AcceleratorManagerImpl::InternalData {
@@ -130,7 +198,7 @@ class AcceleratorManagerImpl::InternalData {
bool IsNonAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; }
bool IsDebug() const { return flags_ & AF_DEBUG; }
- bool IsReserved() const { return flags_ & AF_RESERVED; }
+ int flags() const { return flags_; }
bool IsCommandEnabled() const {
return handler_->IsCommandEnabled(command_id_);
@@ -148,8 +216,15 @@ class AcceleratorManagerImpl::InternalData {
// This class is copyable by design.
};
-AcceleratorManagerImpl::AcceleratorManagerImpl()
- : accelerator_manager_(new ui::AcceleratorManager),
+// static
+AcceleratorManagerImpl*
+AcceleratorManagerImpl::CreateGlobalAcceleratorManager() {
+ return new AcceleratorManagerImpl(new UIAcceleratorManagerWrapper());
+}
+
+AcceleratorManagerImpl::AcceleratorManagerImpl(
+ AcceleratorWrapper* accelerator_wrapper)
+ : accelerator_wrapper_(accelerator_wrapper),
debug_accelerators_enabled_(switches::IsDebugAcceleratorsEnabled()) {
}
@@ -181,22 +256,18 @@ void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) {
nested_accelerator_controller_.get());
}
-bool AcceleratorManagerImpl::IsRegistered(
- const ui::Accelerator& accelerator) const {
- return accelerator_manager_->GetCurrentTarget(accelerator) != NULL;
+bool AcceleratorManagerImpl::Process(const ui::Accelerator& accelerator) {
+ return accelerator_wrapper_->Process(accelerator);
}
-bool AcceleratorManagerImpl::IsReserved(
- const ui::Accelerator& accelerator) const {
+bool AcceleratorManagerImpl::IsRegistered(const ui::Accelerator& accelerator,
+ int flags) const {
std::map<ui::Accelerator, InternalData>::const_iterator iter =
accelerators_.find(accelerator);
if (iter == accelerators_.end())
return false;
- return iter->second.IsReserved();
-}
-
-bool AcceleratorManagerImpl::Process(const ui::Accelerator& accelerator) {
- return accelerator_manager_->Process(accelerator);
+ DCHECK(accelerator_wrapper_->GetCurrentTarget(accelerator));
+ return flags == AF_NONE || iter->second.flags() & flags;
}
void AcceleratorManagerImpl::RegisterAccelerators(
@@ -238,8 +309,7 @@ void AcceleratorManagerImpl::RegisterAccelerator(
accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS
? ui::ET_KEY_PRESSED
: ui::ET_KEY_RELEASED);
- accelerator_manager_->Register(
- accelerator, ui::AcceleratorManager::kNormalPriority, this);
+ accelerator_wrapper_->Register(accelerator, this);
accelerators_.insert(
std::make_pair(accelerator,
InternalData(accelerator_data.command_id,
@@ -252,4 +322,11 @@ AcceleratorManager* AcceleratorManager::Get() {
return InputManager::Get()->GetAcceleratorManager();
}
+// static
+scoped_ptr<AcceleratorManager> AcceleratorManager::CreateForFocusManager(
+ views::FocusManager* focus_manager) {
+ return scoped_ptr<AcceleratorManager>(
+ new AcceleratorManagerImpl(new FocusManagerWrapper(focus_manager)));
+}
+
} // namespace athena

Powered by Google App Engine
This is Rietveld 408576698