Commit 25e073fe authored by oshima@chromium.org's avatar oshima@chromium.org

More accelerator code leanup

* Remove null check
* Simplify NestedAcceleratorDelegate interface.

BUG=None
R=sky@chromium.org

Review URL: https://codereview.chromium.org/312483002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274560 0039d316-1c4b-4281-b951-d872f2087c98
parent f650ac24
...@@ -49,8 +49,7 @@ bool AcceleratorDelegate::ProcessAccelerator(const ui::KeyEvent& key_event, ...@@ -49,8 +49,7 @@ bool AcceleratorDelegate::ProcessAccelerator(const ui::KeyEvent& key_event,
// containing parent window will be checked for the property. // containing parent window will be checked for the property.
bool AcceleratorDelegate::CanConsumeSystemKeys(const ui::KeyEvent& event) { bool AcceleratorDelegate::CanConsumeSystemKeys(const ui::KeyEvent& event) {
aura::Window* target = static_cast<aura::Window*>(event.target()); aura::Window* target = static_cast<aura::Window*>(event.target());
if (!target) // Can be NULL in tests. DCHECK(target);
return false;
aura::Window* top_level = ::wm::GetToplevelWindow(target); aura::Window* top_level = ::wm::GetToplevelWindow(target);
return top_level && wm::GetWindowState(top_level)->can_consume_system_keys(); return top_level && wm::GetWindowState(top_level)->can_consume_system_keys();
} }
...@@ -61,8 +60,7 @@ bool AcceleratorDelegate::ShouldProcessAcceleratorNow( ...@@ -61,8 +60,7 @@ bool AcceleratorDelegate::ShouldProcessAcceleratorNow(
const ui::KeyEvent& event, const ui::KeyEvent& event,
const ui::Accelerator& accelerator) { const ui::Accelerator& accelerator) {
aura::Window* target = static_cast<aura::Window*>(event.target()); aura::Window* target = static_cast<aura::Window*>(event.target());
if (!target) DCHECK(target);
return true;
aura::Window::Windows root_windows = Shell::GetAllRootWindows(); aura::Window::Windows root_windows = Shell::GetAllRootWindows();
if (std::find(root_windows.begin(), root_windows.end(), target) != if (std::find(root_windows.begin(), root_windows.end(), target) !=
......
...@@ -89,15 +89,24 @@ TEST_F(AcceleratorFilterTest, TestCapsLockMask) { ...@@ -89,15 +89,24 @@ TEST_F(AcceleratorFilterTest, TestCapsLockMask) {
TEST_F(AcceleratorFilterTest, CanConsumeSystemKeys) { TEST_F(AcceleratorFilterTest, CanConsumeSystemKeys) {
::wm::AcceleratorFilter filter( ::wm::AcceleratorFilter filter(
scoped_ptr< ::wm::AcceleratorDelegate>(new AcceleratorDelegate).Pass()); scoped_ptr< ::wm::AcceleratorDelegate>(new AcceleratorDelegate).Pass());
aura::Window* root_window = Shell::GetPrimaryRootWindow();
// Normal keys are not consumed. // Normal keys are not consumed.
ui::KeyEvent press_a(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE, false); ui::KeyEvent press_a(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE, false);
{
ui::Event::DispatcherApi dispatch_helper(&press_a);
dispatch_helper.set_target(root_window);
}
filter.OnKeyEvent(&press_a); filter.OnKeyEvent(&press_a);
EXPECT_FALSE(press_a.stopped_propagation()); EXPECT_FALSE(press_a.stopped_propagation());
// System keys are directly consumed. // System keys are directly consumed.
ui::KeyEvent press_mute( ui::KeyEvent press_mute(
ui::ET_KEY_PRESSED, ui::VKEY_VOLUME_MUTE, ui::EF_NONE, false); ui::ET_KEY_PRESSED, ui::VKEY_VOLUME_MUTE, ui::EF_NONE, false);
{
ui::Event::DispatcherApi dispatch_helper(&press_mute);
dispatch_helper.set_target(root_window);
}
filter.OnKeyEvent(&press_mute); filter.OnKeyEvent(&press_mute);
EXPECT_TRUE(press_mute.stopped_propagation()); EXPECT_TRUE(press_mute.stopped_propagation());
......
...@@ -16,14 +16,14 @@ ...@@ -16,14 +16,14 @@
namespace ash { namespace ash {
namespace { namespace {
bool IsPossibleAcceleratorNotForMenu(const ui::KeyEvent& key_event) { bool IsPossibleAcceleratorNotForMenu(const ui::Accelerator& accelerator) {
// For shortcuts generated by Ctrl or Alt plus a letter, number or // For shortcuts generated by Ctrl or Alt plus a letter, number or
// the tab key, we want to exit the context menu first and then // the tab key, we want to exit the context menu first and then
// repost the event. That allows for the shortcut execution after // repost the event. That allows for the shortcut execution after
// the context menu has exited. // the context menu has exited.
if (key_event.type() == ui::ET_KEY_PRESSED && if (accelerator.type() == ui::ET_KEY_PRESSED &&
(key_event.flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN))) { (accelerator.modifiers() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN))) {
const ui::KeyboardCode key_code = key_event.key_code(); const ui::KeyboardCode key_code = accelerator.key_code();
if ((key_code >= ui::VKEY_A && key_code <= ui::VKEY_Z) || if ((key_code >= ui::VKEY_A && key_code <= ui::VKEY_Z) ||
(key_code >= ui::VKEY_0 && key_code <= ui::VKEY_9) || (key_code >= ui::VKEY_0 && key_code <= ui::VKEY_9) ||
(key_code == ui::VKEY_TAB)) { (key_code == ui::VKEY_TAB)) {
...@@ -33,17 +33,8 @@ bool IsPossibleAcceleratorNotForMenu(const ui::KeyEvent& key_event) { ...@@ -33,17 +33,8 @@ bool IsPossibleAcceleratorNotForMenu(const ui::KeyEvent& key_event) {
return false; return false;
} }
} // namespace bool ShouldProcessAcceleratorNow(const ui::Accelerator& accelerator) {
if (!IsPossibleAcceleratorNotForMenu(accelerator))
NestedAcceleratorDelegate::NestedAcceleratorDelegate() {
}
NestedAcceleratorDelegate::~NestedAcceleratorDelegate() {
}
bool NestedAcceleratorDelegate::ShouldProcessEventNow(
const ui::KeyEvent& key_event) {
if (!IsPossibleAcceleratorNotForMenu(key_event))
return true; return true;
if (views::MenuController* menu_controller = if (views::MenuController* menu_controller =
...@@ -54,22 +45,30 @@ bool NestedAcceleratorDelegate::ShouldProcessEventNow( ...@@ -54,22 +45,30 @@ bool NestedAcceleratorDelegate::ShouldProcessEventNow(
return true; return true;
} }
bool NestedAcceleratorDelegate::ProcessEvent(const ui::KeyEvent& key_event) { } // namespace
NestedAcceleratorDelegate::NestedAcceleratorDelegate() {
}
NestedAcceleratorDelegate::~NestedAcceleratorDelegate() {
}
NestedAcceleratorDelegate::Result NestedAcceleratorDelegate::ProcessAccelerator(
const ui::Accelerator& accelerator) {
if (!ShouldProcessAcceleratorNow(accelerator))
return RESULT_PROCESS_LATER;
ash::AcceleratorController* accelerator_controller = ash::AcceleratorController* accelerator_controller =
ash::Shell::GetInstance()->accelerator_controller(); ash::Shell::GetInstance()->accelerator_controller();
if (!accelerator_controller) if (!accelerator_controller)
return false; return RESULT_NOT_PROCESSED;
const int kModifierMask =
(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
ui::Accelerator accelerator(key_event.key_code(),
key_event.flags() & kModifierMask);
if (key_event.type() == ui::ET_KEY_RELEASED)
accelerator.set_type(ui::ET_KEY_RELEASED);
// Fill out context object so AcceleratorController will know what // Fill out context object so AcceleratorController will know what
// was the previous accelerator or if the current accelerator is repeated. // was the previous accelerator or if the current accelerator is repeated.
Shell::GetInstance()->accelerator_controller()->context()->UpdateContext( Shell::GetInstance()->accelerator_controller()->context()->UpdateContext(
accelerator); accelerator);
return accelerator_controller->Process(accelerator); return accelerator_controller->Process(accelerator) ? RESULT_PROCESSED
: RESULT_NOT_PROCESSED;
} }
} // namespace ash } // namespace ash
...@@ -16,8 +16,8 @@ class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate { ...@@ -16,8 +16,8 @@ class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate {
virtual ~NestedAcceleratorDelegate(); virtual ~NestedAcceleratorDelegate();
// wm::AcceleratorDispatcher::Delegate // wm::AcceleratorDispatcher::Delegate
virtual bool ShouldProcessEventNow(const ui::KeyEvent& key_event) OVERRIDE; virtual Result ProcessAccelerator(
virtual bool ProcessEvent(const ui::KeyEvent& key_event) OVERRIDE; const ui::Accelerator& accelerator) OVERRIDE;
private: private:
DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDelegate); DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDelegate);
......
...@@ -11,9 +11,6 @@ ...@@ -11,9 +11,6 @@
namespace wm { namespace wm {
namespace { namespace {
const int kModifierFlagMask =
(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
// Returns true if |key_code| is a key usually handled directly by the shell. // Returns true if |key_code| is a key usually handled directly by the shell.
bool IsSystemKey(ui::KeyboardCode key_code) { bool IsSystemKey(ui::KeyboardCode key_code) {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -52,14 +49,13 @@ AcceleratorFilter::~AcceleratorFilter() { ...@@ -52,14 +49,13 @@ AcceleratorFilter::~AcceleratorFilter() {
void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) { void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) {
const ui::EventType type = event->type(); const ui::EventType type = event->type();
DCHECK(event->target());
if ((type != ui::ET_KEY_PRESSED && type != ui::ET_KEY_RELEASED) || if ((type != ui::ET_KEY_PRESSED && type != ui::ET_KEY_RELEASED) ||
event->is_char()) { event->is_char() || !event->target()) {
return; return;
} }
ui::Accelerator accelerator(event->key_code(), ui::Accelerator accelerator = CreateAcceleratorFromKeyEvent(*event);
event->flags() & kModifierFlagMask);
accelerator.set_type(event->type());
delegate_->PreProcessAccelerator(accelerator); delegate_->PreProcessAccelerator(accelerator);
...@@ -71,4 +67,15 @@ void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) { ...@@ -71,4 +67,15 @@ void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) {
event->StopPropagation(); event->StopPropagation();
} }
ui::Accelerator CreateAcceleratorFromKeyEvent(const ui::KeyEvent& key_event) {
const int kModifierFlagMask =
(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
ui::Accelerator accelerator(key_event.key_code(),
key_event.flags() & kModifierFlagMask);
if (key_event.type() == ui::ET_KEY_RELEASED)
accelerator.set_type(ui::ET_KEY_RELEASED);
return accelerator;
}
} // namespace wm } // namespace wm
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
#include "ui/events/event_handler.h" #include "ui/events/event_handler.h"
#include "ui/wm/wm_export.h" #include "ui/wm/wm_export.h"
namespace ui {
class Accelerator;
}
namespace wm { namespace wm {
class AcceleratorDelegate; class AcceleratorDelegate;
...@@ -29,6 +33,8 @@ class WM_EXPORT AcceleratorFilter : public ui::EventHandler { ...@@ -29,6 +33,8 @@ class WM_EXPORT AcceleratorFilter : public ui::EventHandler {
DISALLOW_COPY_AND_ASSIGN(AcceleratorFilter); DISALLOW_COPY_AND_ASSIGN(AcceleratorFilter);
}; };
ui::Accelerator CreateAcceleratorFromKeyEvent(const ui::KeyEvent& key_event);
} // namespace wm } // namespace wm
#endif // UI_WM_CORE_ACCELERATOR_FILTER_H_ #endif // UI_WM_CORE_ACCELERATOR_FILTER_H_
...@@ -104,17 +104,10 @@ class MockNestedAcceleratorDelegate : public NestedAcceleratorDelegate { ...@@ -104,17 +104,10 @@ class MockNestedAcceleratorDelegate : public NestedAcceleratorDelegate {
virtual ~MockNestedAcceleratorDelegate() {} virtual ~MockNestedAcceleratorDelegate() {}
// NestedAcceleratorDelegate: // NestedAcceleratorDelegate:
virtual bool ShouldProcessEventNow(const ui::KeyEvent& key_event) OVERRIDE { virtual Result ProcessAccelerator(
return true; const ui::Accelerator& accelerator) OVERRIDE {
} return accelerator_manager_->Process(accelerator) ?
virtual bool ProcessEvent(const ui::KeyEvent& key_event) OVERRIDE { RESULT_PROCESSED : RESULT_NOT_PROCESSED;
const int kModifierMask =
(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
ui::Accelerator accelerator(key_event.key_code(),
key_event.flags() & kModifierMask);
if (key_event.type() == ui::ET_KEY_RELEASED)
accelerator.set_type(ui::ET_KEY_RELEASED);
return accelerator_manager_->Process(accelerator);
} }
void Register(const ui::Accelerator& accelerator, void Register(const ui::Accelerator& accelerator,
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#define UI_WM_CORE_NESTED_ACCELERATOR_DELEGATE_H_ #define UI_WM_CORE_NESTED_ACCELERATOR_DELEGATE_H_
namespace ui { namespace ui {
class KeyEvent; class Accelerator;
} }
namespace wm { namespace wm {
...@@ -15,15 +15,18 @@ namespace wm { ...@@ -15,15 +15,18 @@ namespace wm {
// handling. // handling.
class NestedAcceleratorDelegate { class NestedAcceleratorDelegate {
public: public:
virtual ~NestedAcceleratorDelegate() {} enum Result {
RESULT_PROCESSED,
RESULT_NOT_PROCESSED,
// The key event should be ignored now and instead be reposted so that
// next event loop.
RESULT_PROCESS_LATER,
};
// If the key event should be ignored now and instead be reposted so that next virtual ~NestedAcceleratorDelegate() {}
// event loop.
virtual bool ShouldProcessEventNow(const ui::KeyEvent& key_event) = 0;
// Attempts to process an accelerator for the key-event. // Attempts to process the |accelerator|.
// Returns whether an accelerator was triggered and processed. virtual Result ProcessAccelerator(const ui::Accelerator& accelerator) = 0;
virtual bool ProcessEvent(const ui::KeyEvent& key_event) = 0;
}; };
} // namespace wm } // namespace wm
......
...@@ -6,10 +6,12 @@ ...@@ -6,10 +6,12 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/events/event.h" #include "ui/events/event.h"
#include "ui/events/platform/platform_event_dispatcher.h" #include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/events/platform/platform_event_source.h" #include "ui/events/platform/platform_event_source.h"
#include "ui/events/platform/scoped_event_dispatcher.h" #include "ui/events/platform/scoped_event_dispatcher.h"
#include "ui/wm/core/accelerator_filter.h"
#include "ui/wm/core/nested_accelerator_delegate.h" #include "ui/wm/core/nested_accelerator_delegate.h"
#if defined(USE_X11) #if defined(USE_X11)
...@@ -65,17 +67,21 @@ class NestedAcceleratorDispatcherLinux : public NestedAcceleratorDispatcher, ...@@ -65,17 +67,21 @@ class NestedAcceleratorDispatcherLinux : public NestedAcceleratorDispatcher,
virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE { virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE {
if (IsKeyEvent(event)) { if (IsKeyEvent(event)) {
ui::KeyEvent key_event(event, false); ui::KeyEvent key_event(event, false);
if (!delegate_->ShouldProcessEventNow(key_event)) { ui::Accelerator accelerator = CreateAcceleratorFromKeyEvent(key_event);
switch (delegate_->ProcessAccelerator(accelerator)) {
case NestedAcceleratorDelegate::RESULT_PROCESS_LATER:
#if defined(USE_X11) #if defined(USE_X11)
XPutBackEvent(event->xany.display, event); XPutBackEvent(event->xany.display, event);
#else #else
NOTIMPLEMENTED(); NOTIMPLEMENTED();
#endif #endif
return ui::POST_DISPATCH_NONE; return ui::POST_DISPATCH_NONE;
case NestedAcceleratorDelegate::RESULT_PROCESSED:
return ui::POST_DISPATCH_NONE;
case NestedAcceleratorDelegate::RESULT_NOT_PROCESSED:
break;
} }
if (delegate_->ProcessEvent(key_event))
return ui::POST_DISPATCH_NONE;
} }
ui::PlatformEventDispatcher* prev = *restore_dispatcher_; ui::PlatformEventDispatcher* prev = *restore_dispatcher_;
......
...@@ -7,7 +7,9 @@ ...@@ -7,7 +7,9 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_pump_dispatcher.h" #include "base/message_loop/message_pump_dispatcher.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/events/event.h" #include "ui/events/event.h"
#include "ui/wm/core/accelerator_filter.h"
#include "ui/wm/core/nested_accelerator_delegate.h" #include "ui/wm/core/nested_accelerator_delegate.h"
using base::MessagePumpDispatcher; using base::MessagePumpDispatcher;
...@@ -41,11 +43,16 @@ class NestedAcceleratorDispatcherWin : public NestedAcceleratorDispatcher, ...@@ -41,11 +43,16 @@ class NestedAcceleratorDispatcherWin : public NestedAcceleratorDispatcher,
virtual uint32_t Dispatch(const MSG& event) OVERRIDE { virtual uint32_t Dispatch(const MSG& event) OVERRIDE {
if (IsKeyEvent(event)) { if (IsKeyEvent(event)) {
ui::KeyEvent key_event(event, false); ui::KeyEvent key_event(event, false);
if (!delegate_->ShouldProcessEventNow(key_event)) ui::Accelerator accelerator = CreateAcceleratorFromKeyEvent(key_event);
return POST_DISPATCH_QUIT_LOOP;
switch (delegate_->ProcessAccelerator(accelerator)) {
if (delegate_->ProcessEvent(key_event)) case NestedAcceleratorDelegate::RESULT_PROCESS_LATER:
return POST_DISPATCH_NONE; return POST_DISPATCH_QUIT_LOOP;
case NestedAcceleratorDelegate::RESULT_PROCESSED:
return POST_DISPATCH_NONE;
case NestedAcceleratorDelegate::RESULT_NOT_PROCESSED:
break;
}
} }
return nested_dispatcher_ ? nested_dispatcher_->Dispatch(event) return nested_dispatcher_ ? nested_dispatcher_->Dispatch(event)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment