Commit 3f9d5619 authored by David Reveman's avatar David Reveman Committed by Commit Bot

exo: Fix tracking of modifier flags.

Modifier flags needs same treatment as pressed keys. Move modifier flag
tracking to Seat class.

Bug: 788731
Tbr: yoshiki@chromium.org
Test: exo_unittests --gtest_filter=KeyboardTest.OnKeyboardEnter
Change-Id: Ife2fae2d622dfff3617830ba232d0267fdbc9b35
Reviewed-on: https://chromium-review.googlesource.com/805359Reviewed-by: default avatarDavid Reveman <reveman@chromium.org>
Commit-Queue: David Reveman <reveman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#521257}
parent 82049ea7
......@@ -25,6 +25,14 @@ namespace {
// Delay until a key state change expected to be acknowledged is expired.
const int kExpirationDelayForPendingKeyAcksMs = 1000;
// These modifiers reflect what clients are supposed to be aware of.
// I.e. EF_SCROLL_LOCK_ON is missing because clients are not supposed
// to be aware scroll lock.
const int kModifierMask = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN |
ui::EF_ALTGR_DOWN | ui::EF_MOD3_DOWN |
ui::EF_NUM_LOCK_ON | ui::EF_CAPS_LOCK_ON;
// The accelerator keys reserved to be processed by chrome.
const struct {
ui::KeyboardCode keycode;
......@@ -198,13 +206,6 @@ void Keyboard::AckKeyboardKey(uint32_t serial, bool handled) {
// ui::EventHandler overrides:
void Keyboard::OnKeyEvent(ui::KeyEvent* event) {
// These modifiers reflect what clients are supposed to be aware of.
// I.e. EF_SCROLL_LOCK_ON is missing because clients are not supposed
// to be aware scroll lock.
const int kModifierMask = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN |
ui::EF_ALTGR_DOWN | ui::EF_MOD3_DOWN |
ui::EF_NUM_LOCK_ON | ui::EF_CAPS_LOCK_ON;
int modifier_flags = event->flags() & kModifierMask;
if (modifier_flags != modifier_flags_) {
modifier_flags_ = modifier_flags;
......@@ -313,6 +314,7 @@ void Keyboard::SetFocus(Surface* surface) {
pending_key_acks_.clear();
}
if (surface) {
modifier_flags_ = seat_->modifier_flags() & kModifierMask;
delegate_->OnKeyboardModifiers(modifier_flags_);
delegate_->OnKeyboardEnter(surface, seat_->pressed_keys());
focus_ = surface;
......
......@@ -80,7 +80,7 @@ TEST_F(KeyboardTest, OnKeyboardEnter) {
// Pressing key before Keyboard instance is created and surface has
// received focus.
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
generator.PressKey(ui::VKEY_A, 0);
generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN);
aura::client::FocusClient* focus_client =
aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
......@@ -94,7 +94,7 @@ TEST_F(KeyboardTest, OnKeyboardEnter) {
EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
EXPECT_CALL(delegate, OnKeyboardModifiers(0));
EXPECT_CALL(delegate, OnKeyboardModifiers(ui::EF_SHIFT_DOWN));
EXPECT_CALL(delegate, OnKeyboardEnter(
surface.get(),
base::flat_set<ui::DomCode>({ui::DomCode::US_A})));
......
......@@ -117,6 +117,7 @@ void Seat::OnKeyEvent(ui::KeyEvent* event) {
NOTREACHED();
break;
}
modifier_flags_ = event->flags();
}
////////////////////////////////////////////////////////////////////////////////
......
......@@ -46,6 +46,9 @@ class Seat : public aura::client::FocusChangeObserver,
return pressed_keys_;
}
// Returns current set of modifier flags.
int modifier_flags() const { return modifier_flags_; }
// Sets clipboard data from |source|.
void SetSelection(DataSource* source);
......@@ -70,6 +73,7 @@ class Seat : public aura::client::FocusChangeObserver,
base::ObserverList<SeatObserver> observers_;
base::flat_set<ui::DomCode> pressed_keys_;
int modifier_flags_ = 0;
// Data source being used as a clipboard content.
std::unique_ptr<ScopedDataSource> selection_source_;
......
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