Chromium Code Reviews| Index: ash/sticky_keys/sticky_keys_controller.cc |
| diff --git a/ash/sticky_keys/sticky_keys_controller.cc b/ash/sticky_keys/sticky_keys_controller.cc |
| index aad1ee487a8e6bba3ad2a9781b9763af1e90cd10..b059290045a81765f939ecacc5db8aebc1c026ab 100644 |
| --- a/ash/sticky_keys/sticky_keys_controller.cc |
| +++ b/ash/sticky_keys/sticky_keys_controller.cc |
| @@ -10,6 +10,7 @@ |
| #undef RootWindow |
| #endif |
| +#include "ash/sticky_keys/sticky_keys_overlay.h" |
| #include "base/basictypes.h" |
| #include "base/debug/stack_trace.h" |
| #include "ui/aura/root_window.h" |
| @@ -22,6 +23,20 @@ namespace ash { |
| namespace { |
| +ui::EventFlags EventFlagForModifier(StickyKeyModifier modifier) { |
| + switch (modifier) { |
| + case STICKY_KEY_SHIFT: |
| + return ui::EF_SHIFT_DOWN; |
| + case STICKY_KEY_ALT: |
| + return ui::EF_ALT_DOWN; |
| + case STICKY_KEY_CONTROL: |
| + return ui::EF_CONTROL_DOWN; |
| + case STICKY_KEY_SEARCH: |
| + return ui::EF_NONE; |
| + } |
| + return ui::EF_NONE; |
| +} |
| + |
| // Returns true if the type of mouse event should be modified by sticky keys. |
| bool ShouldModifyMouseEvent(ui::MouseEvent* event) { |
| ui::EventType type = event->type(); |
| @@ -89,16 +104,7 @@ void StickyKeysHandlerDelegateImpl::DispatchScrollEvent( |
| /////////////////////////////////////////////////////////////////////////////// |
| // StickyKeys |
| StickyKeysController::StickyKeysController() |
| - : enabled_(false), |
| - shift_sticky_key_( |
| - new StickyKeysHandler(ui::EF_SHIFT_DOWN, |
| - new StickyKeysHandlerDelegateImpl())), |
| - alt_sticky_key_( |
| - new StickyKeysHandler(ui::EF_ALT_DOWN, |
| - new StickyKeysHandlerDelegateImpl())), |
| - ctrl_sticky_key_( |
| - new StickyKeysHandler(ui::EF_CONTROL_DOWN, |
| - new StickyKeysHandlerDelegateImpl())) { |
| + : enabled_(false) { |
| } |
| StickyKeysController::~StickyKeysController() { |
| @@ -112,14 +118,18 @@ void StickyKeysController::Enable(bool enabled) { |
| // the handlers' states are reset. |
| if (enabled_) { |
| shift_sticky_key_.reset( |
| - new StickyKeysHandler(ui::EF_SHIFT_DOWN, |
| - new StickyKeysHandlerDelegateImpl())); |
| + new StickyKeysHandler(STICKY_KEY_SHIFT, |
| + new StickyKeysHandlerDelegateImpl())); |
| alt_sticky_key_.reset( |
| - new StickyKeysHandler(ui::EF_ALT_DOWN, |
| + new StickyKeysHandler(STICKY_KEY_ALT, |
| new StickyKeysHandlerDelegateImpl())); |
| ctrl_sticky_key_.reset( |
| - new StickyKeysHandler(ui::EF_CONTROL_DOWN, |
| + new StickyKeysHandler(STICKY_KEY_CONTROL, |
| new StickyKeysHandlerDelegateImpl())); |
| + |
| + overlay_.reset(new StickyKeysOverlay()); |
| + } else if (overlay_.get()) { |
| + overlay_->Show(false); |
| } |
| } |
| } |
| @@ -149,26 +159,52 @@ void StickyKeysController::OnKeyEvent(ui::KeyEvent* event) { |
| return; |
| } |
| - if (enabled_ && HandleKeyEvent(event)) |
| - event->StopPropagation(); |
| + if (enabled_) { |
| + if (HandleKeyEvent(event)) |
| + event->StopPropagation(); |
| + UpdateOverlay(); |
| + } |
| } |
| void StickyKeysController::OnMouseEvent(ui::MouseEvent* event) { |
| - if (enabled_ && HandleMouseEvent(event)) |
| - event->StopPropagation(); |
| + if (enabled_) { |
| + if (HandleMouseEvent(event)) |
| + event->StopPropagation(); |
| + UpdateOverlay(); |
| + } |
| } |
| void StickyKeysController::OnScrollEvent(ui::ScrollEvent* event) { |
| - if (enabled_ && HandleScrollEvent(event)) |
| - event->StopPropagation(); |
| + if (enabled_) { |
| + if (HandleScrollEvent(event)) |
| + event->StopPropagation(); |
| + UpdateOverlay(); |
| + } |
| +} |
| + |
| +void StickyKeysController::UpdateOverlay() { |
| + overlay_->SetModifierKeyState( |
| + STICKY_KEY_SHIFT, shift_sticky_key_->current_state()); |
| + overlay_->SetModifierKeyState( |
| + STICKY_KEY_CONTROL, ctrl_sticky_key_->current_state()); |
| + overlay_->SetModifierKeyState( |
|
James Cook
2014/01/14 00:59:03
You don't update for the SEARCH key?
Tim Song
2014/01/14 03:01:10
Support for the search key hasn't been implemented
|
| + STICKY_KEY_ALT, alt_sticky_key_->current_state()); |
| + |
| + bool key_in_use = |
| + shift_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
| + alt_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
| + ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED; |
| + |
| + overlay_->Show(enabled_ && key_in_use); |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| // StickyKeysHandler |
| -StickyKeysHandler::StickyKeysHandler(ui::EventFlags target_modifier_flag, |
| +StickyKeysHandler::StickyKeysHandler(StickyKeyModifier modifier, |
| StickyKeysHandlerDelegate* delegate) |
| - : modifier_flag_(target_modifier_flag), |
| - current_state_(DISABLED), |
| + : modifier_(modifier), |
| + modifier_flag_(EventFlagForModifier(modifier_)), |
| + current_state_(STICKY_KEY_STATE_DISABLED), |
| event_from_myself_(false), |
| preparing_to_enable_(false), |
| scroll_delta_(0), |
| @@ -188,11 +224,11 @@ bool StickyKeysHandler::HandleKeyEvent(ui::KeyEvent* event) { |
| if (event_from_myself_) |
| return false; // Do not handle self-generated key event. |
| switch (current_state_) { |
| - case DISABLED: |
| + case STICKY_KEY_STATE_DISABLED: |
| return HandleDisabledState(event); |
| - case ENABLED: |
| + case STICKY_KEY_STATE_ENABLED: |
| return HandleEnabledState(event); |
| - case LOCKED: |
| + case STICKY_KEY_STATE_LOCKED: |
| return HandleLockedState(event); |
| } |
| NOTREACHED(); |
| @@ -203,16 +239,18 @@ bool StickyKeysHandler::HandleMouseEvent(ui::MouseEvent* event) { |
| if (ShouldModifyMouseEvent(event)) |
| preparing_to_enable_ = false; |
| - if (event_from_myself_ || current_state_ == DISABLED |
| + if (event_from_myself_ || current_state_ == STICKY_KEY_STATE_DISABLED |
| || !ShouldModifyMouseEvent(event)) { |
| return false; |
| } |
| - DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); |
| + DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED || |
| + current_state_ == STICKY_KEY_STATE_LOCKED); |
| AppendModifier(event); |
| // Only disable on the mouse released event in normal, non-locked mode. |
| - if (current_state_ == ENABLED && event->type() != ui::ET_MOUSE_PRESSED) { |
| - current_state_ = DISABLED; |
| + if (current_state_ == STICKY_KEY_STATE_ENABLED && |
| + event->type() != ui::ET_MOUSE_PRESSED) { |
| + current_state_ = STICKY_KEY_STATE_DISABLED; |
| DispatchEventAndReleaseModifier(event); |
| return true; |
| } |
| @@ -222,14 +260,16 @@ bool StickyKeysHandler::HandleMouseEvent(ui::MouseEvent* event) { |
| bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) { |
| preparing_to_enable_ = false; |
| - if (event_from_myself_ || current_state_ == DISABLED) |
| + if (event_from_myself_ || current_state_ == STICKY_KEY_STATE_DISABLED) |
| return false; |
| - DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); |
| + DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED || |
| + current_state_ == STICKY_KEY_STATE_LOCKED); |
| // We detect a direction change if the current |scroll_delta_| is assigned |
| // and the offset of the current scroll event has the opposing sign. |
| bool direction_changed = false; |
| - if (current_state_ == ENABLED && event->type() == ui::ET_SCROLL) { |
| + if (current_state_ == STICKY_KEY_STATE_ENABLED && |
| + event->type() == ui::ET_SCROLL) { |
| int offset = event->y_offset(); |
| if (scroll_delta_) |
| direction_changed = offset * scroll_delta_ <= 0; |
| @@ -242,9 +282,9 @@ bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) { |
| // We want to modify all the scroll events in the scroll sequence, which ends |
| // with a fling start event. We also stop when the scroll sequence changes |
| // direction. |
| - if (current_state_ == ENABLED && |
| + if (current_state_ == STICKY_KEY_STATE_ENABLED && |
| (event->type() == ui::ET_SCROLL_FLING_START || direction_changed)) { |
| - current_state_ = DISABLED; |
| + current_state_ = STICKY_KEY_STATE_DISABLED; |
| scroll_delta_ = 0; |
| DispatchEventAndReleaseModifier(event); |
| return true; |
| @@ -259,15 +299,15 @@ StickyKeysHandler::KeyEventType |
| if (event->key_code() == ui::VKEY_SHIFT || |
| event->key_code() == ui::VKEY_LSHIFT || |
| event->key_code() == ui::VKEY_RSHIFT) { |
| - is_target_key = (modifier_flag_ == ui::EF_SHIFT_DOWN); |
| + is_target_key = (modifier_ == STICKY_KEY_SHIFT); |
| } else if (event->key_code() == ui::VKEY_CONTROL || |
| event->key_code() == ui::VKEY_LCONTROL || |
| event->key_code() == ui::VKEY_RCONTROL) { |
| - is_target_key = (modifier_flag_ == ui::EF_CONTROL_DOWN); |
| + is_target_key = (modifier_ == STICKY_KEY_CONTROL); |
| } else if (event->key_code() == ui::VKEY_MENU || |
| event->key_code() == ui::VKEY_LMENU || |
| event->key_code() == ui::VKEY_RMENU) { |
| - is_target_key = (modifier_flag_ == ui::EF_ALT_DOWN); |
| + is_target_key = (modifier_ == STICKY_KEY_ALT); |
| } else { |
| return event->type() == ui::ET_KEY_PRESSED ? |
| NORMAL_KEY_DOWN : NORMAL_KEY_UP; |
| @@ -287,7 +327,7 @@ bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) { |
| if (preparing_to_enable_) { |
| preparing_to_enable_ = false; |
| scroll_delta_ = 0; |
| - current_state_ = ENABLED; |
| + current_state_ = STICKY_KEY_STATE_ENABLED; |
| modifier_up_event_.reset(new ui::KeyEvent(*event)); |
| return true; |
| } |
| @@ -313,11 +353,11 @@ bool StickyKeysHandler::HandleEnabledState(ui::KeyEvent* event) { |
| case TARGET_MODIFIER_DOWN: |
| return true; |
| case TARGET_MODIFIER_UP: |
| - current_state_ = LOCKED; |
| + current_state_ = STICKY_KEY_STATE_LOCKED; |
| modifier_up_event_.reset(); |
| return true; |
| case NORMAL_KEY_DOWN: { |
| - current_state_ = DISABLED; |
| + current_state_ = STICKY_KEY_STATE_DISABLED; |
| AppendModifier(event); |
| DispatchEventAndReleaseModifier(event); |
| return true; |
| @@ -335,7 +375,7 @@ bool StickyKeysHandler::HandleLockedState(ui::KeyEvent* event) { |
| case TARGET_MODIFIER_DOWN: |
| return true; |
| case TARGET_MODIFIER_UP: |
| - current_state_ = DISABLED; |
| + current_state_ = STICKY_KEY_STATE_DISABLED; |
| return false; |
| case NORMAL_KEY_DOWN: |
| case NORMAL_KEY_UP: |
| @@ -382,16 +422,18 @@ void StickyKeysHandler::DispatchEventAndReleaseModifier(ui::Event* event) { |
| void StickyKeysHandler::AppendNativeEventMask(unsigned int* state) { |
| unsigned int& state_ref = *state; |
| - switch (modifier_flag_) { |
| - case ui::EF_CONTROL_DOWN: |
| + switch (modifier_) { |
| + case STICKY_KEY_CONTROL: |
| state_ref |= ControlMask; |
| break; |
| - case ui::EF_ALT_DOWN: |
| + case STICKY_KEY_ALT: |
| state_ref |= Mod1Mask; |
| break; |
| - case ui::EF_SHIFT_DOWN: |
| + case STICKY_KEY_SHIFT: |
| state_ref |= ShiftMask; |
| break; |
| + case STICKY_KEY_SEARCH: |
| + break; |
| default: |
| NOTREACHED(); |
| } |