Commit 97f2fd7b authored by spang's avatar spang Committed by Commit bot

ozone: evdev: Factor keyboard into KeyboardEvdev

This object is responsible for combining all attached keyboards into one
logical keyboard, applying modifiers & implementing key repeat. Key
repeat is not done yet.

We need this so we can also dispatch keypresses from gestures devices
(e.g. Logitech K400).

BUG=412996
TEST=events_unittests, link_freon

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

Cr-Commit-Position: refs/heads/master@{#300270}
parent 1dd69d41
...@@ -48,6 +48,7 @@ struct OpenInputDeviceParams { ...@@ -48,6 +48,7 @@ struct OpenInputDeviceParams {
// State shared between devices. Must not be dereferenced on worker thread. // State shared between devices. Must not be dereferenced on worker thread.
EventModifiersEvdev* modifiers; EventModifiersEvdev* modifiers;
KeyboardEvdev* keyboard;
CursorDelegateEvdev* cursor; CursorDelegateEvdev* cursor;
}; };
...@@ -86,8 +87,8 @@ scoped_ptr<EventConverterEvdev> CreateConverter( ...@@ -86,8 +87,8 @@ scoped_ptr<EventConverterEvdev> CreateConverter(
fd, params.path, params.id, devinfo, params.dispatch_callback)); fd, params.path, params.id, devinfo, params.dispatch_callback));
// Everything else: use KeyEventConverterEvdev. // Everything else: use KeyEventConverterEvdev.
return make_scoped_ptr<EventConverterEvdev>(new KeyEventConverterEvdev( return make_scoped_ptr<EventConverterEvdev>(
fd, params.path, params.id, params.modifiers, params.dispatch_callback)); new KeyEventConverterEvdev(fd, params.path, params.id, params.keyboard));
} }
// Open an input device. Opening may put the calling thread to sleep, and // Open an input device. Opening may put the calling thread to sleep, and
...@@ -146,10 +147,11 @@ EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor, ...@@ -146,10 +147,11 @@ EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor,
DeviceManager* device_manager) DeviceManager* device_manager)
: last_device_id_(0), : last_device_id_(0),
device_manager_(device_manager), device_manager_(device_manager),
cursor_(cursor),
dispatch_callback_( dispatch_callback_(
base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent), base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent),
base::Unretained(this))), base::Unretained(this))),
keyboard_(&modifiers_, dispatch_callback_),
cursor_(cursor),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
DCHECK(device_manager_); DCHECK(device_manager_);
} }
...@@ -193,6 +195,7 @@ void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) { ...@@ -193,6 +195,7 @@ void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) {
params->path = event.path(); params->path = event.path();
params->dispatch_callback = dispatch_callback_; params->dispatch_callback = dispatch_callback_;
params->modifiers = &modifiers_; params->modifiers = &modifiers_;
params->keyboard = &keyboard_;
params->cursor = cursor_; params->cursor = cursor_;
OpenInputDeviceReplyCallback reply_callback = OpenInputDeviceReplyCallback reply_callback =
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "ui/events/ozone/evdev/event_converter_evdev.h" #include "ui/events/ozone/evdev/event_converter_evdev.h"
#include "ui/events/ozone/evdev/event_modifiers_evdev.h" #include "ui/events/ozone/evdev/event_modifiers_evdev.h"
#include "ui/events/ozone/evdev/events_ozone_evdev_export.h" #include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
#include "ui/events/ozone/evdev/keyboard_evdev.h"
#include "ui/events/platform/platform_event_source.h" #include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/native_widget_types.h"
...@@ -70,15 +71,18 @@ class EVENTS_OZONE_EVDEV_EXPORT EventFactoryEvdev : public DeviceEventObserver, ...@@ -70,15 +71,18 @@ class EVENTS_OZONE_EVDEV_EXPORT EventFactoryEvdev : public DeviceEventObserver,
// Task runner for event dispatch. // Task runner for event dispatch.
scoped_refptr<base::TaskRunner> ui_task_runner_; scoped_refptr<base::TaskRunner> ui_task_runner_;
// Dispatch callback for events.
EventDispatchCallback dispatch_callback_;
// Modifier key state (shift, ctrl, etc). // Modifier key state (shift, ctrl, etc).
EventModifiersEvdev modifiers_; EventModifiersEvdev modifiers_;
// Keyboard state.
KeyboardEvdev keyboard_;
// Cursor movement. // Cursor movement.
CursorDelegateEvdev* cursor_; CursorDelegateEvdev* cursor_;
// Dispatch callback for events.
EventDispatchCallback dispatch_callback_;
// Support weak pointers for attach & detach callbacks. // Support weak pointers for attach & detach callbacks.
base::WeakPtrFactory<EventFactoryEvdev> weak_ptr_factory_; base::WeakPtrFactory<EventFactoryEvdev> weak_ptr_factory_;
......
...@@ -17,188 +17,13 @@ namespace ui { ...@@ -17,188 +17,13 @@ namespace ui {
namespace { namespace {
const int kXkbKeycodeOffset = 8;
ui::KeyboardCode KeyboardCodeFromButton(unsigned int code) {
static const ui::KeyboardCode kLinuxBaseKeyMap[] = {
ui::VKEY_UNKNOWN, // KEY_RESERVED
ui::VKEY_ESCAPE, // KEY_ESC
ui::VKEY_1, // KEY_1
ui::VKEY_2, // KEY_2
ui::VKEY_3, // KEY_3
ui::VKEY_4, // KEY_4
ui::VKEY_5, // KEY_5
ui::VKEY_6, // KEY_6
ui::VKEY_7, // KEY_7
ui::VKEY_8, // KEY_8
ui::VKEY_9, // KEY_9
ui::VKEY_0, // KEY_0
ui::VKEY_OEM_MINUS, // KEY_MINUS
ui::VKEY_OEM_PLUS, // KEY_EQUAL
ui::VKEY_BACK, // KEY_BACKSPACE
ui::VKEY_TAB, // KEY_TAB
ui::VKEY_Q, // KEY_Q
ui::VKEY_W, // KEY_W
ui::VKEY_E, // KEY_E
ui::VKEY_R, // KEY_R
ui::VKEY_T, // KEY_T
ui::VKEY_Y, // KEY_Y
ui::VKEY_U, // KEY_U
ui::VKEY_I, // KEY_I
ui::VKEY_O, // KEY_O
ui::VKEY_P, // KEY_P
ui::VKEY_OEM_4, // KEY_LEFTBRACE
ui::VKEY_OEM_6, // KEY_RIGHTBRACE
ui::VKEY_RETURN, // KEY_ENTER
ui::VKEY_CONTROL, // KEY_LEFTCTRL
ui::VKEY_A, // KEY_A
ui::VKEY_S, // KEY_S
ui::VKEY_D, // KEY_D
ui::VKEY_F, // KEY_F
ui::VKEY_G, // KEY_G
ui::VKEY_H, // KEY_H
ui::VKEY_J, // KEY_J
ui::VKEY_K, // KEY_K
ui::VKEY_L, // KEY_L
ui::VKEY_OEM_1, // KEY_SEMICOLON
ui::VKEY_OEM_7, // KEY_APOSTROPHE
ui::VKEY_OEM_3, // KEY_GRAVE
ui::VKEY_SHIFT, // KEY_LEFTSHIFT
ui::VKEY_OEM_5, // KEY_BACKSLASH
ui::VKEY_Z, // KEY_Z
ui::VKEY_X, // KEY_X
ui::VKEY_C, // KEY_C
ui::VKEY_V, // KEY_V
ui::VKEY_B, // KEY_B
ui::VKEY_N, // KEY_N
ui::VKEY_M, // KEY_M
ui::VKEY_OEM_COMMA, // KEY_COMMA
ui::VKEY_OEM_PERIOD, // KEY_DOT
ui::VKEY_OEM_2, // KEY_SLASH
ui::VKEY_SHIFT, // KEY_RIGHTSHIFT
ui::VKEY_MULTIPLY, // KEY_KPASTERISK
ui::VKEY_MENU, // KEY_LEFTALT
ui::VKEY_SPACE, // KEY_SPACE
ui::VKEY_CAPITAL, // KEY_CAPSLOCK
ui::VKEY_F1, // KEY_F1
ui::VKEY_F2, // KEY_F2
ui::VKEY_F3, // KEY_F3
ui::VKEY_F4, // KEY_F4
ui::VKEY_F5, // KEY_F5
ui::VKEY_F6, // KEY_F6
ui::VKEY_F7, // KEY_F7
ui::VKEY_F8, // KEY_F8
ui::VKEY_F9, // KEY_F9
ui::VKEY_F10, // KEY_F10
ui::VKEY_NUMLOCK, // KEY_NUMLOCK
ui::VKEY_SCROLL, // KEY_SCROLLLOCK
ui::VKEY_NUMPAD7, // KEY_KP7
ui::VKEY_NUMPAD8, // KEY_KP8
ui::VKEY_NUMPAD9, // KEY_KP9
ui::VKEY_SUBTRACT, // KEY_KPMINUS
ui::VKEY_NUMPAD4, // KEY_KP4
ui::VKEY_NUMPAD5, // KEY_KP5
ui::VKEY_NUMPAD6, // KEY_KP6
ui::VKEY_ADD, // KEY_KPPLUS
ui::VKEY_NUMPAD1, // KEY_KP1
ui::VKEY_NUMPAD2, // KEY_KP2
ui::VKEY_NUMPAD3, // KEY_KP3
ui::VKEY_NUMPAD0, // KEY_KP0
ui::VKEY_DECIMAL, // KEY_KPDOT
ui::VKEY_UNKNOWN, // (unassigned)
ui::VKEY_DBE_DBCSCHAR, // KEY_ZENKAKUHANKAKU
ui::VKEY_OEM_102, // KEY_102ND
ui::VKEY_F11, // KEY_F11
ui::VKEY_F12, // KEY_F12
ui::VKEY_UNKNOWN, // KEY_RO
ui::VKEY_UNKNOWN, // KEY_KATAKANA
ui::VKEY_UNKNOWN, // KEY_HIRAGANA
ui::VKEY_CONVERT, // KEY_HENKAN
ui::VKEY_UNKNOWN, // KEY_KATAKANAHIRAGANA
ui::VKEY_NONCONVERT, // KEY_MUHENKAN
ui::VKEY_UNKNOWN, // KEY_KPJPCOMMA
ui::VKEY_RETURN, // KEY_KPENTER
ui::VKEY_CONTROL, // KEY_RIGHTCTRL
ui::VKEY_DIVIDE, // KEY_KPSLASH
ui::VKEY_PRINT, // KEY_SYSRQ
ui::VKEY_MENU, // KEY_RIGHTALT
ui::VKEY_RETURN, // KEY_LINEFEED
ui::VKEY_HOME, // KEY_HOME
ui::VKEY_UP, // KEY_UP
ui::VKEY_PRIOR, // KEY_PAGEUP
ui::VKEY_LEFT, // KEY_LEFT
ui::VKEY_RIGHT, // KEY_RIGHT
ui::VKEY_END, // KEY_END
ui::VKEY_DOWN, // KEY_DOWN
ui::VKEY_NEXT, // KEY_PAGEDOWN
ui::VKEY_INSERT, // KEY_INSERT
ui::VKEY_DELETE, // KEY_DELETE
ui::VKEY_UNKNOWN, // KEY_MACRO
ui::VKEY_VOLUME_MUTE, // KEY_MUTE
ui::VKEY_VOLUME_DOWN, // KEY_VOLUMEDOWN
ui::VKEY_VOLUME_UP, // KEY_VOLUMEUP
ui::VKEY_POWER, // KEY_POWER
ui::VKEY_OEM_PLUS, // KEY_KPEQUAL
ui::VKEY_UNKNOWN, // KEY_KPPLUSMINUS
ui::VKEY_PAUSE, // KEY_PAUSE
ui::VKEY_MEDIA_LAUNCH_APP1, // KEY_SCALE
ui::VKEY_DECIMAL, // KEY_KPCOMMA
ui::VKEY_HANGUL, // KEY_HANGEUL
ui::VKEY_HANJA, // KEY_HANJA
ui::VKEY_UNKNOWN, // KEY_YEN
ui::VKEY_LWIN, // KEY_LEFTMETA
ui::VKEY_RWIN, // KEY_RIGHTMETA
ui::VKEY_APPS, // KEY_COMPOSE
};
if (code < arraysize(kLinuxBaseKeyMap))
return kLinuxBaseKeyMap[code];
LOG(ERROR) << "Unknown key code: " << code;
return ui::VKEY_UNKNOWN;
}
int ModifierFromButton(unsigned int code) {
switch (code) {
case KEY_CAPSLOCK:
return EVDEV_MODIFIER_CAPS_LOCK;
case KEY_LEFTSHIFT:
case KEY_RIGHTSHIFT:
return EVDEV_MODIFIER_SHIFT;
case KEY_LEFTCTRL:
case KEY_RIGHTCTRL:
return EVDEV_MODIFIER_CONTROL;
case KEY_LEFTALT:
case KEY_RIGHTALT:
return EVDEV_MODIFIER_ALT;
case BTN_LEFT:
return EVDEV_MODIFIER_LEFT_MOUSE_BUTTON;
case BTN_MIDDLE:
return EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON;
case BTN_RIGHT:
return EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON;
case KEY_LEFTMETA:
case KEY_RIGHTMETA:
return EVDEV_MODIFIER_COMMAND;
default:
return EVDEV_MODIFIER_NONE;
}
}
bool IsLockButton(unsigned int code) { return code == KEY_CAPSLOCK; }
} // namespace } // namespace
KeyEventConverterEvdev::KeyEventConverterEvdev( KeyEventConverterEvdev::KeyEventConverterEvdev(int fd,
int fd, base::FilePath path,
base::FilePath path, int id,
int id, KeyboardEvdev* keyboard)
EventModifiersEvdev* modifiers, : EventConverterEvdev(fd, path, id), keyboard_(keyboard) {
const EventDispatchCallback& callback)
: EventConverterEvdev(fd, path, id),
callback_(callback),
modifiers_(modifiers) {
// TODO(spang): Initialize modifiers using EVIOCGKEY.
} }
KeyEventConverterEvdev::~KeyEventConverterEvdev() { KeyEventConverterEvdev::~KeyEventConverterEvdev() {
...@@ -227,37 +52,11 @@ void KeyEventConverterEvdev::ProcessEvents(const input_event* inputs, ...@@ -227,37 +52,11 @@ void KeyEventConverterEvdev::ProcessEvents(const input_event* inputs,
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
const input_event& input = inputs[i]; const input_event& input = inputs[i];
if (input.type == EV_KEY) { if (input.type == EV_KEY) {
ConvertKeyEvent(input.code, input.value); keyboard_->OnKeyChange(input.code, input.value != 0);
} else if (input.type == EV_SYN) { } else if (input.type == EV_SYN) {
// TODO(sadrul): Handle this case appropriately. // TODO(sadrul): Handle this case appropriately.
} }
} }
} }
void KeyEventConverterEvdev::ConvertKeyEvent(int key, int value) {
int down = (value != 0);
int repeat = (value == 2);
int modifier = ModifierFromButton(key);
ui::KeyboardCode code = KeyboardCodeFromButton(key);
if (!repeat && (modifier != EVDEV_MODIFIER_NONE)) {
if (IsLockButton(key)) {
// Locking modifier keys: CapsLock.
modifiers_->UpdateModifierLock(modifier, down);
} else {
// Regular modifier keys: Shift, Ctrl, Alt, etc.
modifiers_->UpdateModifier(modifier, down);
}
}
int flags = modifiers_->GetModifierFlags();
KeyEvent key_event(
down ? ET_KEY_PRESSED : ET_KEY_RELEASED,
code,
KeycodeConverter::NativeKeycodeToCode(key + kXkbKeycodeOffset),
flags);
callback_.Run(&key_event);
}
} // namespace ui } // namespace ui
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "ui/events/ozone/evdev/event_converter_evdev.h" #include "ui/events/ozone/evdev/event_converter_evdev.h"
#include "ui/events/ozone/evdev/event_modifiers_evdev.h" #include "ui/events/ozone/evdev/event_modifiers_evdev.h"
#include "ui/events/ozone/evdev/events_ozone_evdev_export.h" #include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
#include "ui/events/ozone/evdev/keyboard_evdev.h"
struct input_event; struct input_event;
...@@ -22,8 +23,7 @@ class EVENTS_OZONE_EVDEV_EXPORT KeyEventConverterEvdev ...@@ -22,8 +23,7 @@ class EVENTS_OZONE_EVDEV_EXPORT KeyEventConverterEvdev
KeyEventConverterEvdev(int fd, KeyEventConverterEvdev(int fd,
base::FilePath path, base::FilePath path,
int id, int id,
EventModifiersEvdev* modifiers, KeyboardEvdev* keyboard);
const EventDispatchCallback& dispatch);
virtual ~KeyEventConverterEvdev(); virtual ~KeyEventConverterEvdev();
// EventConverterEvdev: // EventConverterEvdev:
...@@ -32,16 +32,11 @@ class EVENTS_OZONE_EVDEV_EXPORT KeyEventConverterEvdev ...@@ -32,16 +32,11 @@ class EVENTS_OZONE_EVDEV_EXPORT KeyEventConverterEvdev
void ProcessEvents(const struct input_event* inputs, int count); void ProcessEvents(const struct input_event* inputs, int count);
private: private:
// Callback for dispatching events.
EventDispatchCallback callback_;
// Shared modifier state.
EventModifiersEvdev* modifiers_;
// Controller for watching the input fd. // Controller for watching the input fd.
base::MessagePumpLibevent::FileDescriptorWatcher controller_; base::MessagePumpLibevent::FileDescriptorWatcher controller_;
void ConvertKeyEvent(int key, int value); // Shared keyboard state.
KeyboardEvdev* keyboard_;
DISALLOW_COPY_AND_ASSIGN(KeyEventConverterEvdev); DISALLOW_COPY_AND_ASSIGN(KeyEventConverterEvdev);
}; };
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "ui/events/event.h" #include "ui/events/event.h"
#include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/ozone/evdev/key_event_converter_evdev.h" #include "ui/events/ozone/evdev/key_event_converter_evdev.h"
#include "ui/events/ozone/evdev/keyboard_evdev.h"
namespace ui { namespace ui {
...@@ -19,36 +20,19 @@ const char kTestDevicePath[] = "/dev/input/test-device"; ...@@ -19,36 +20,19 @@ const char kTestDevicePath[] = "/dev/input/test-device";
class MockKeyEventConverterEvdev : public KeyEventConverterEvdev { class MockKeyEventConverterEvdev : public KeyEventConverterEvdev {
public: public:
MockKeyEventConverterEvdev(int fd, EventModifiersEvdev* modifiers) MockKeyEventConverterEvdev(int fd, KeyboardEvdev* keyboard)
: KeyEventConverterEvdev( : KeyEventConverterEvdev(fd,
fd, base::FilePath(kTestDevicePath),
base::FilePath(kTestDevicePath), 1,
1, keyboard) {
modifiers,
base::Bind(&MockKeyEventConverterEvdev::DispatchEventForTest,
base::Unretained(this))) {
Start(); Start();
} }
virtual ~MockKeyEventConverterEvdev() {}; virtual ~MockKeyEventConverterEvdev() {};
unsigned size() { return dispatched_events_.size(); }
KeyEvent* event(unsigned index) {
DCHECK_GT(dispatched_events_.size(), index);
return dispatched_events_[index];
}
void DispatchEventForTest(Event* event);
private: private:
ScopedVector<KeyEvent> dispatched_events_;
DISALLOW_COPY_AND_ASSIGN(MockKeyEventConverterEvdev); DISALLOW_COPY_AND_ASSIGN(MockKeyEventConverterEvdev);
}; };
void MockKeyEventConverterEvdev::DispatchEventForTest(Event* event) {
dispatched_events_.push_back(new KeyEvent(*static_cast<KeyEvent*>(event)));
}
} // namespace ui } // namespace ui
// Test fixture. // Test fixture.
...@@ -66,24 +50,44 @@ class KeyEventConverterEvdevTest : public testing::Test { ...@@ -66,24 +50,44 @@ class KeyEventConverterEvdevTest : public testing::Test {
events_in_ = evdev_io[0]; events_in_ = evdev_io[0];
events_out_ = evdev_io[1]; events_out_ = evdev_io[1];
modifiers_ = new ui::EventModifiersEvdev(); modifiers_.reset(new ui::EventModifiersEvdev());
device_ = new ui::MockKeyEventConverterEvdev(events_in_, modifiers_); keyboard_.reset(new ui::KeyboardEvdev(
modifiers_.get(),
base::Bind(&KeyEventConverterEvdevTest::DispatchEventForTest,
base::Unretained(this))));
device_.reset(
new ui::MockKeyEventConverterEvdev(events_in_, keyboard_.get()));
} }
virtual void TearDown() override { virtual void TearDown() override {
delete device_; device_.reset();
delete modifiers_; keyboard_.reset();
modifiers_.reset();
close(events_in_); close(events_in_);
close(events_out_); close(events_out_);
} }
ui::MockKeyEventConverterEvdev* device() { return device_; } ui::MockKeyEventConverterEvdev* device() { return device_.get(); }
ui::EventModifiersEvdev* modifiers() { return modifiers_; } ui::EventModifiersEvdev* modifiers() { return modifiers_.get(); }
unsigned size() { return dispatched_events_.size(); }
ui::KeyEvent* dispatched_event(unsigned index) {
DCHECK_GT(dispatched_events_.size(), index);
return dispatched_events_[index];
}
private: private:
void DispatchEventForTest(ui::Event* event) {
dispatched_events_.push_back(
new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event)));
}
base::MessageLoopForUI ui_loop_; base::MessageLoopForUI ui_loop_;
ui::EventModifiersEvdev* modifiers_; scoped_ptr<ui::EventModifiersEvdev> modifiers_;
ui::MockKeyEventConverterEvdev* device_; scoped_ptr<ui::KeyboardEvdev> keyboard_;
scoped_ptr<ui::MockKeyEventConverterEvdev> device_;
ScopedVector<ui::KeyEvent> dispatched_events_;
int events_out_; int events_out_;
int events_in_; int events_in_;
...@@ -105,16 +109,16 @@ TEST_F(KeyEventConverterEvdevTest, KeyPress) { ...@@ -105,16 +109,16 @@ TEST_F(KeyEventConverterEvdevTest, KeyPress) {
}; };
dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
EXPECT_EQ(2u, dev->size()); EXPECT_EQ(2u, size());
ui::KeyEvent* event; ui::KeyEvent* event;
event = dev->event(0); event = dispatched_event(0);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_BACK, event->key_code()); EXPECT_EQ(ui::VKEY_BACK, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
event = dev->event(1); event = dispatched_event(1);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_BACK, event->key_code()); EXPECT_EQ(ui::VKEY_BACK, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
...@@ -142,26 +146,26 @@ TEST_F(KeyEventConverterEvdevTest, KeyRepeat) { ...@@ -142,26 +146,26 @@ TEST_F(KeyEventConverterEvdevTest, KeyRepeat) {
}; };
dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
EXPECT_EQ(4u, dev->size()); EXPECT_EQ(4u, size());
ui::KeyEvent* event; ui::KeyEvent* event;
event = dev->event(0); event = dispatched_event(0);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_BACK, event->key_code()); EXPECT_EQ(ui::VKEY_BACK, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
event = dev->event(1); event = dispatched_event(1);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_BACK, event->key_code()); EXPECT_EQ(ui::VKEY_BACK, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
event = dev->event(2); event = dispatched_event(2);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_BACK, event->key_code()); EXPECT_EQ(ui::VKEY_BACK, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
event = dev->event(3); event = dispatched_event(3);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_BACK, event->key_code()); EXPECT_EQ(ui::VKEY_BACK, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
...@@ -170,7 +174,7 @@ TEST_F(KeyEventConverterEvdevTest, KeyRepeat) { ...@@ -170,7 +174,7 @@ TEST_F(KeyEventConverterEvdevTest, KeyRepeat) {
TEST_F(KeyEventConverterEvdevTest, NoEvents) { TEST_F(KeyEventConverterEvdevTest, NoEvents) {
ui::MockKeyEventConverterEvdev* dev = device(); ui::MockKeyEventConverterEvdev* dev = device();
dev->ProcessEvents(NULL, 0); dev->ProcessEvents(NULL, 0);
EXPECT_EQ(0u, dev->size()); EXPECT_EQ(0u, size());
} }
TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) { TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) {
...@@ -195,26 +199,26 @@ TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) { ...@@ -195,26 +199,26 @@ TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) {
}; };
dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
EXPECT_EQ(4u, dev->size()); EXPECT_EQ(4u, size());
ui::KeyEvent* event; ui::KeyEvent* event;
event = dev->event(0); event = dispatched_event(0);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_SHIFT, event->key_code()); EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
event = dev->event(1); event = dispatched_event(1);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_A, event->key_code()); EXPECT_EQ(ui::VKEY_A, event->key_code());
EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
event = dev->event(2); event = dispatched_event(2);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_A, event->key_code()); EXPECT_EQ(ui::VKEY_A, event->key_code());
EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
event = dev->event(3); event = dispatched_event(3);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_SHIFT, event->key_code()); EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
...@@ -250,36 +254,36 @@ TEST_F(KeyEventConverterEvdevTest, KeyWithDuplicateModifier) { ...@@ -250,36 +254,36 @@ TEST_F(KeyEventConverterEvdevTest, KeyWithDuplicateModifier) {
}; };
dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
EXPECT_EQ(6u, dev->size()); EXPECT_EQ(6u, size());
ui::KeyEvent* event; ui::KeyEvent* event;
event = dev->event(0); event = dispatched_event(0);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
event = dev->event(1); event = dispatched_event(1);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
event = dev->event(2); event = dispatched_event(2);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_Z, event->key_code()); EXPECT_EQ(ui::VKEY_Z, event->key_code());
EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
event = dev->event(3); event = dispatched_event(3);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_Z, event->key_code()); EXPECT_EQ(ui::VKEY_Z, event->key_code());
EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
event = dev->event(4); event = dispatched_event(4);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
event = dev->event(5); event = dispatched_event(5);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
...@@ -315,36 +319,36 @@ TEST_F(KeyEventConverterEvdevTest, KeyWithLock) { ...@@ -315,36 +319,36 @@ TEST_F(KeyEventConverterEvdevTest, KeyWithLock) {
}; };
dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
EXPECT_EQ(6u, dev->size()); EXPECT_EQ(6u, size());
ui::KeyEvent* event; ui::KeyEvent* event;
event = dev->event(0); event = dispatched_event(0);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
event = dev->event(1); event = dispatched_event(1);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
event = dev->event(2); event = dispatched_event(2);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_Q, event->key_code()); EXPECT_EQ(ui::VKEY_Q, event->key_code());
EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
event = dev->event(3); event = dispatched_event(3);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_Q, event->key_code()); EXPECT_EQ(ui::VKEY_Q, event->key_code());
EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
event = dev->event(4); event = dispatched_event(4);
EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
event = dev->event(5); event = dispatched_event(5);
EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
EXPECT_EQ(0, event->flags()); EXPECT_EQ(0, event->flags());
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/events/ozone/evdev/keyboard_evdev.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/dom4/keycode_converter.h"
#include "ui/events/ozone/evdev/event_modifiers_evdev.h"
namespace ui {
namespace {
const int kXkbKeycodeOffset = 8;
ui::KeyboardCode KeyboardCodeFromEvdevKey(unsigned int code) {
static const ui::KeyboardCode kLinuxBaseKeyMap[] = {
ui::VKEY_UNKNOWN, // KEY_RESERVED
ui::VKEY_ESCAPE, // KEY_ESC
ui::VKEY_1, // KEY_1
ui::VKEY_2, // KEY_2
ui::VKEY_3, // KEY_3
ui::VKEY_4, // KEY_4
ui::VKEY_5, // KEY_5
ui::VKEY_6, // KEY_6
ui::VKEY_7, // KEY_7
ui::VKEY_8, // KEY_8
ui::VKEY_9, // KEY_9
ui::VKEY_0, // KEY_0
ui::VKEY_OEM_MINUS, // KEY_MINUS
ui::VKEY_OEM_PLUS, // KEY_EQUAL
ui::VKEY_BACK, // KEY_BACKSPACE
ui::VKEY_TAB, // KEY_TAB
ui::VKEY_Q, // KEY_Q
ui::VKEY_W, // KEY_W
ui::VKEY_E, // KEY_E
ui::VKEY_R, // KEY_R
ui::VKEY_T, // KEY_T
ui::VKEY_Y, // KEY_Y
ui::VKEY_U, // KEY_U
ui::VKEY_I, // KEY_I
ui::VKEY_O, // KEY_O
ui::VKEY_P, // KEY_P
ui::VKEY_OEM_4, // KEY_LEFTBRACE
ui::VKEY_OEM_6, // KEY_RIGHTBRACE
ui::VKEY_RETURN, // KEY_ENTER
ui::VKEY_CONTROL, // KEY_LEFTCTRL
ui::VKEY_A, // KEY_A
ui::VKEY_S, // KEY_S
ui::VKEY_D, // KEY_D
ui::VKEY_F, // KEY_F
ui::VKEY_G, // KEY_G
ui::VKEY_H, // KEY_H
ui::VKEY_J, // KEY_J
ui::VKEY_K, // KEY_K
ui::VKEY_L, // KEY_L
ui::VKEY_OEM_1, // KEY_SEMICOLON
ui::VKEY_OEM_7, // KEY_APOSTROPHE
ui::VKEY_OEM_3, // KEY_GRAVE
ui::VKEY_SHIFT, // KEY_LEFTSHIFT
ui::VKEY_OEM_5, // KEY_BACKSLASH
ui::VKEY_Z, // KEY_Z
ui::VKEY_X, // KEY_X
ui::VKEY_C, // KEY_C
ui::VKEY_V, // KEY_V
ui::VKEY_B, // KEY_B
ui::VKEY_N, // KEY_N
ui::VKEY_M, // KEY_M
ui::VKEY_OEM_COMMA, // KEY_COMMA
ui::VKEY_OEM_PERIOD, // KEY_DOT
ui::VKEY_OEM_2, // KEY_SLASH
ui::VKEY_SHIFT, // KEY_RIGHTSHIFT
ui::VKEY_MULTIPLY, // KEY_KPASTERISK
ui::VKEY_MENU, // KEY_LEFTALT
ui::VKEY_SPACE, // KEY_SPACE
ui::VKEY_CAPITAL, // KEY_CAPSLOCK
ui::VKEY_F1, // KEY_F1
ui::VKEY_F2, // KEY_F2
ui::VKEY_F3, // KEY_F3
ui::VKEY_F4, // KEY_F4
ui::VKEY_F5, // KEY_F5
ui::VKEY_F6, // KEY_F6
ui::VKEY_F7, // KEY_F7
ui::VKEY_F8, // KEY_F8
ui::VKEY_F9, // KEY_F9
ui::VKEY_F10, // KEY_F10
ui::VKEY_NUMLOCK, // KEY_NUMLOCK
ui::VKEY_SCROLL, // KEY_SCROLLLOCK
ui::VKEY_NUMPAD7, // KEY_KP7
ui::VKEY_NUMPAD8, // KEY_KP8
ui::VKEY_NUMPAD9, // KEY_KP9
ui::VKEY_SUBTRACT, // KEY_KPMINUS
ui::VKEY_NUMPAD4, // KEY_KP4
ui::VKEY_NUMPAD5, // KEY_KP5
ui::VKEY_NUMPAD6, // KEY_KP6
ui::VKEY_ADD, // KEY_KPPLUS
ui::VKEY_NUMPAD1, // KEY_KP1
ui::VKEY_NUMPAD2, // KEY_KP2
ui::VKEY_NUMPAD3, // KEY_KP3
ui::VKEY_NUMPAD0, // KEY_KP0
ui::VKEY_DECIMAL, // KEY_KPDOT
ui::VKEY_UNKNOWN, // (unassigned)
ui::VKEY_DBE_DBCSCHAR, // KEY_ZENKAKUHANKAKU
ui::VKEY_OEM_102, // KEY_102ND
ui::VKEY_F11, // KEY_F11
ui::VKEY_F12, // KEY_F12
ui::VKEY_UNKNOWN, // KEY_RO
ui::VKEY_UNKNOWN, // KEY_KATAKANA
ui::VKEY_UNKNOWN, // KEY_HIRAGANA
ui::VKEY_CONVERT, // KEY_HENKAN
ui::VKEY_UNKNOWN, // KEY_KATAKANAHIRAGANA
ui::VKEY_NONCONVERT, // KEY_MUHENKAN
ui::VKEY_UNKNOWN, // KEY_KPJPCOMMA
ui::VKEY_RETURN, // KEY_KPENTER
ui::VKEY_CONTROL, // KEY_RIGHTCTRL
ui::VKEY_DIVIDE, // KEY_KPSLASH
ui::VKEY_PRINT, // KEY_SYSRQ
ui::VKEY_MENU, // KEY_RIGHTALT
ui::VKEY_RETURN, // KEY_LINEFEED
ui::VKEY_HOME, // KEY_HOME
ui::VKEY_UP, // KEY_UP
ui::VKEY_PRIOR, // KEY_PAGEUP
ui::VKEY_LEFT, // KEY_LEFT
ui::VKEY_RIGHT, // KEY_RIGHT
ui::VKEY_END, // KEY_END
ui::VKEY_DOWN, // KEY_DOWN
ui::VKEY_NEXT, // KEY_PAGEDOWN
ui::VKEY_INSERT, // KEY_INSERT
ui::VKEY_DELETE, // KEY_DELETE
ui::VKEY_UNKNOWN, // KEY_MACRO
ui::VKEY_VOLUME_MUTE, // KEY_MUTE
ui::VKEY_VOLUME_DOWN, // KEY_VOLUMEDOWN
ui::VKEY_VOLUME_UP, // KEY_VOLUMEUP
ui::VKEY_POWER, // KEY_POWER
ui::VKEY_OEM_PLUS, // KEY_KPEQUAL
ui::VKEY_UNKNOWN, // KEY_KPPLUSMINUS
ui::VKEY_PAUSE, // KEY_PAUSE
ui::VKEY_MEDIA_LAUNCH_APP1, // KEY_SCALE
ui::VKEY_DECIMAL, // KEY_KPCOMMA
ui::VKEY_HANGUL, // KEY_HANGEUL
ui::VKEY_HANJA, // KEY_HANJA
ui::VKEY_UNKNOWN, // KEY_YEN
ui::VKEY_LWIN, // KEY_LEFTMETA
ui::VKEY_RWIN, // KEY_RIGHTMETA
ui::VKEY_APPS, // KEY_COMPOSE
};
if (code < arraysize(kLinuxBaseKeyMap))
return kLinuxBaseKeyMap[code];
LOG(ERROR) << "Unknown key code: " << code;
return ui::VKEY_UNKNOWN;
}
int ModifierFromEvdevKey(unsigned int code) {
switch (code) {
case KEY_CAPSLOCK:
return EVDEV_MODIFIER_CAPS_LOCK;
case KEY_LEFTSHIFT:
case KEY_RIGHTSHIFT:
return EVDEV_MODIFIER_SHIFT;
case KEY_LEFTCTRL:
case KEY_RIGHTCTRL:
return EVDEV_MODIFIER_CONTROL;
case KEY_LEFTALT:
case KEY_RIGHTALT:
return EVDEV_MODIFIER_ALT;
case BTN_LEFT:
return EVDEV_MODIFIER_LEFT_MOUSE_BUTTON;
case BTN_MIDDLE:
return EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON;
case BTN_RIGHT:
return EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON;
case KEY_LEFTMETA:
case KEY_RIGHTMETA:
return EVDEV_MODIFIER_COMMAND;
default:
return EVDEV_MODIFIER_NONE;
}
}
bool IsModifierLockKeyFromEvdevKey(unsigned int code) {
return code == KEY_CAPSLOCK;
}
} // namespace
KeyboardEvdev::KeyboardEvdev(EventModifiersEvdev* modifiers,
const EventDispatchCallback& callback)
: callback_(callback), modifiers_(modifiers) {
}
KeyboardEvdev::~KeyboardEvdev() {
}
void KeyboardEvdev::OnKeyChange(unsigned int key, bool down) {
if (key > KEY_MAX)
return;
if (down != key_state_.test(key)) {
// State transition: !(down) -> (down)
if (down)
key_state_.set(key);
else
key_state_.reset(key);
UpdateModifier(key, down);
}
DispatchKey(key, down);
}
void KeyboardEvdev::UpdateModifier(unsigned int key, bool down) {
int modifier = ModifierFromEvdevKey(key);
int locking = IsModifierLockKeyFromEvdevKey(key);
if (modifier == EVDEV_MODIFIER_NONE)
return;
if (locking)
modifiers_->UpdateModifierLock(modifier, down);
else
modifiers_->UpdateModifier(modifier, down);
}
void KeyboardEvdev::DispatchKey(unsigned int key, bool down) {
ui::KeyboardCode code = KeyboardCodeFromEvdevKey(key);
int flags = modifiers_->GetModifierFlags();
KeyEvent key_event(
down ? ET_KEY_PRESSED : ET_KEY_RELEASED,
code,
KeycodeConverter::NativeKeycodeToCode(key + kXkbKeycodeOffset),
flags);
callback_.Run(&key_event);
}
} // namespace ui
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_EVENTS_OZONE_EVDEV_KEYBOARD_EVDEV_H_
#define UI_EVENTS_OZONE_EVDEV_KEYBOARD_EVDEV_H_
#include <bitset>
#include <linux/input.h>
#include "ui/events/ozone/evdev/event_device_util.h"
#include "ui/events/ozone/evdev/event_dispatch_callback.h"
#include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
namespace ui {
class EventModifiersEvdev;
// Keyboard for evdev.
//
// This object is responsible for combining all attached keyboards into
// one logical keyboard, applying modifiers & implementing key repeat.
//
// It also currently also applies the layout (hardcoded as US).
//
// TODO(spang): Implement key repeat & turn off kernel repeat.
class EVENTS_OZONE_EVDEV_EXPORT KeyboardEvdev {
public:
KeyboardEvdev(EventModifiersEvdev* modifiers,
const EventDispatchCallback& callback);
~KeyboardEvdev();
// Handlers for raw key presses & releases.
void OnKeyChange(unsigned int code, bool down);
private:
void UpdateModifier(unsigned int key, bool down);
void DispatchKey(unsigned int key, bool down);
// Aggregated key state. There is only one bit of state per key; we do not
// attempt to count presses of the same key on multiple keyboards.
//
// A key is down iff the most recent event pertaining to that key was a key
// down event rather than a key up event. Therefore, a particular key position
// can be considered released even if it is being depresssed on one or more
// keyboards.
std::bitset<KEY_CNT> key_state_;
// Callback for dispatching events.
EventDispatchCallback callback_;
// Shared modifier state.
EventModifiersEvdev* modifiers_;
DISALLOW_COPY_AND_ASSIGN(KeyboardEvdev);
};
} // namespace ui
#endif // UI_EVENTS_OZONE_EVDEV_KEYBOARD_EVDEV_H_
...@@ -73,6 +73,8 @@ ...@@ -73,6 +73,8 @@
'evdev/events_ozone_evdev_export.h', 'evdev/events_ozone_evdev_export.h',
'evdev/key_event_converter_evdev.cc', 'evdev/key_event_converter_evdev.cc',
'evdev/key_event_converter_evdev.h', 'evdev/key_event_converter_evdev.h',
'evdev/keyboard_evdev.cc',
'evdev/keyboard_evdev.h',
'evdev/touch_event_converter_evdev.cc', 'evdev/touch_event_converter_evdev.cc',
'evdev/touch_event_converter_evdev.h', 'evdev/touch_event_converter_evdev.h',
], ],
......
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