Skip to content

Commit

Permalink
Add support for mod3 to sticky keys
Browse files Browse the repository at this point in the history
mod3 is the short name for ISO Level 5 shift, which is used by CA multilingual and German Neo2 keyboard layouts to allow support for a 4th shift state in addition to normal, shift, and AltGr.

BUG=335368

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262895 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
zork@chromium.org committed Apr 10, 2014
1 parent bf3cd10 commit 25de8a1
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 5 deletions.
3 changes: 3 additions & 0 deletions ash/ash_strings.grd
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,9 @@ Press Shift + Alt to switch.
<message name="IDS_ASH_ALTGR_KEY" desc="Name of [AltGr] key name. Shouldn't be translated in many languages actually. This name should be lower case.">
altgr
</message>
<message name="IDS_ASH_MOD3_KEY" desc="Name of ISOLevel5 (mod3) key name. Shouldn't be translated in many languages actually. This name should be lower case.">
mod3
</message>
<message name="IDS_ASH_SEARCH_KEY" desc="Name of [Search] key name. Shouldn't be translated in many languages actually. This name should be lower case.">
search
</message>
Expand Down
27 changes: 22 additions & 5 deletions ash/sticky_keys/sticky_keys_controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,13 @@ void StickyKeysController::Enable(bool enabled) {
ctrl_sticky_key_.reset(
new StickyKeysHandler(ui::EF_CONTROL_DOWN,
new StickyKeysHandlerDelegateImpl()));
mod3_sticky_key_.reset(
new StickyKeysHandler(ui::EF_MOD3_DOWN,
new StickyKeysHandlerDelegateImpl()));

overlay_.reset(new StickyKeysOverlay());
overlay_->SetModifierVisible(ui::EF_ALTGR_DOWN, altgr_enabled_);
overlay_->SetModifierVisible(ui::EF_MOD3_DOWN, mod3_enabled_);
} else if (overlay_) {
overlay_->Show(false);
}
Expand All @@ -145,29 +149,34 @@ void StickyKeysController::SetModifiersEnabled(bool mod3_enabled,
bool altgr_enabled) {
mod3_enabled_ = mod3_enabled;
altgr_enabled_ = altgr_enabled;
if (overlay_)
if (overlay_) {
overlay_->SetModifierVisible(ui::EF_ALTGR_DOWN, altgr_enabled_);
overlay_->SetModifierVisible(ui::EF_MOD3_DOWN, mod3_enabled_);
}
}

bool StickyKeysController::HandleKeyEvent(ui::KeyEvent* event) {
return shift_sticky_key_->HandleKeyEvent(event) ||
alt_sticky_key_->HandleKeyEvent(event) ||
altgr_sticky_key_->HandleKeyEvent(event) ||
ctrl_sticky_key_->HandleKeyEvent(event);
ctrl_sticky_key_->HandleKeyEvent(event) ||
mod3_sticky_key_->HandleKeyEvent(event);
}

bool StickyKeysController::HandleMouseEvent(ui::MouseEvent* event) {
return shift_sticky_key_->HandleMouseEvent(event) ||
alt_sticky_key_->HandleMouseEvent(event) ||
altgr_sticky_key_->HandleMouseEvent(event) ||
ctrl_sticky_key_->HandleMouseEvent(event);
ctrl_sticky_key_->HandleMouseEvent(event) ||
mod3_sticky_key_->HandleMouseEvent(event);
}

bool StickyKeysController::HandleScrollEvent(ui::ScrollEvent* event) {
return shift_sticky_key_->HandleScrollEvent(event) ||
alt_sticky_key_->HandleScrollEvent(event) ||
altgr_sticky_key_->HandleScrollEvent(event) ||
ctrl_sticky_key_->HandleScrollEvent(event);
ctrl_sticky_key_->HandleScrollEvent(event) ||
mod3_sticky_key_->HandleScrollEvent(event);
}

void StickyKeysController::OnKeyEvent(ui::KeyEvent* event) {
Expand Down Expand Up @@ -209,12 +218,15 @@ void StickyKeysController::UpdateOverlay() {
ui::EF_ALT_DOWN, alt_sticky_key_->current_state());
overlay_->SetModifierKeyState(
ui::EF_ALTGR_DOWN, altgr_sticky_key_->current_state());
overlay_->SetModifierKeyState(
ui::EF_MOD3_DOWN, mod3_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 ||
altgr_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED;
ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
mod3_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED;

overlay_->Show(enabled_ && key_in_use);
}
Expand Down Expand Up @@ -334,6 +346,8 @@ StickyKeysHandler::KeyEventType
is_target_key = (modifier_flag_ == ui::EF_ALT_DOWN);
} else if (event->key_code() == ui::VKEY_ALTGR) {
is_target_key = (modifier_flag_ == ui::EF_ALTGR_DOWN);
} else if (event->key_code() == ui::VKEY_OEM_8) {
is_target_key = (modifier_flag_ == ui::EF_MOD3_DOWN);
} else {
return event->type() == ui::ET_KEY_PRESSED ?
NORMAL_KEY_DOWN : NORMAL_KEY_UP;
Expand Down Expand Up @@ -462,6 +476,9 @@ void StickyKeysHandler::AppendNativeEventMask(unsigned int* state) {
case ui::EF_SHIFT_DOWN:
state_ref |= ShiftMask;
break;
case ui::EF_MOD3_DOWN:
state_ref |= Mod3Mask;
break;
default:
NOTREACHED();
}
Expand Down
1 change: 1 addition & 0 deletions ash/sticky_keys/sticky_keys_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ class ASH_EXPORT StickyKeysController : public ui::EventHandler {
scoped_ptr<StickyKeysHandler> alt_sticky_key_;
scoped_ptr<StickyKeysHandler> altgr_sticky_key_;
scoped_ptr<StickyKeysHandler> ctrl_sticky_key_;
scoped_ptr<StickyKeysHandler> mod3_sticky_key_;

scoped_ptr<StickyKeysOverlay> overlay_;

Expand Down
13 changes: 13 additions & 0 deletions ash/sticky_keys/sticky_keys_overlay.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class StickyKeysOverlayView : public views::WidgetDelegateView {
StickyKeyState GetKeyState(ui::EventFlags modifier);

void SetModifierVisible(ui::EventFlags modifier, bool visible);
bool GetModifierVisible(ui::EventFlags modifier);

private:
void AddKeyLabel(ui::EventFlags modifier, const std::string& key_label);
Expand Down Expand Up @@ -165,6 +166,8 @@ StickyKeysOverlayView::StickyKeysOverlayView() {
l10n_util::GetStringUTF8(IDS_ASH_SHIFT_KEY));
AddKeyLabel(ui::EF_ALTGR_DOWN,
l10n_util::GetStringUTF8(IDS_ASH_ALTGR_KEY));
AddKeyLabel(ui::EF_MOD3_DOWN,
l10n_util::GetStringUTF8(IDS_ASH_MOD3_KEY));
}

StickyKeysOverlayView::~StickyKeysOverlayView() {}
Expand Down Expand Up @@ -200,6 +203,12 @@ void StickyKeysOverlayView::SetModifierVisible(ui::EventFlags modifier,
it->second->SetVisible(visible);
}

bool StickyKeysOverlayView::GetModifierVisible(ui::EventFlags modifier) {
ModifierLabelMap::iterator it = modifier_label_map_.find(modifier);
DCHECK(it != modifier_label_map_.end());
return it->second->visible();
}

void StickyKeysOverlayView::AddKeyLabel(ui::EventFlags modifier,
const std::string& key_label) {
StickyKeyOverlayLabel* label = new StickyKeyOverlayLabel(key_label);
Expand Down Expand Up @@ -271,6 +280,10 @@ void StickyKeysOverlay::SetModifierVisible(ui::EventFlags modifier,
widget_size_ = overlay_view_->GetPreferredSize();
}

bool StickyKeysOverlay::GetModifierVisible(ui::EventFlags modifier) {
return overlay_view_->GetModifierVisible(modifier);
}

void StickyKeysOverlay::SetModifierKeyState(ui::EventFlags modifier,
StickyKeyState state) {
overlay_view_->SetKeyState(modifier, state);
Expand Down
2 changes: 2 additions & 0 deletions ash/sticky_keys/sticky_keys_overlay.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class ASH_EXPORT StickyKeysOverlay : public ui::LayerAnimationObserver {

void SetModifierVisible(ui::EventFlags modifier, bool visible);

bool GetModifierVisible(ui::EventFlags modifier);

// Updates the overlay with the current state of a sticky key modifier.
void SetModifierKeyState(ui::EventFlags modifier,
StickyKeyState state);
Expand Down
32 changes: 32 additions & 0 deletions ash/sticky_keys/sticky_keys_overlay_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -203,4 +203,36 @@ TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
}

TEST_F(StickyKeysOverlayTest, ModifierVisibility) {
// All but AltGr and Mod3 should initially be visible.
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));

// Turn all modifiers on.
controller_->SetModifiersEnabled(true, true);
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));

// Turn off Mod3.
controller_->SetModifiersEnabled(false, true);
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));

// Turn off AltGr.
controller_->SetModifiersEnabled(true, false);
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));

// Turn off AltGr and Mod3.
controller_->SetModifiersEnabled(false, false);
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
}

} // namespace ash
1 change: 1 addition & 0 deletions ui/events/event_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ enum EventFlags {
EF_EXTENDED = 1 << 8, // Windows extended key (see WM_KEYDOWN doc)
EF_IS_SYNTHESIZED = 1 << 9,
EF_ALTGR_DOWN = 1 << 10,
EF_MOD3_DOWN = 1 << 11,
};

// Flags specific to mouse events
Expand Down

0 comments on commit 25de8a1

Please sign in to comment.