| Index: ui/events/ozone/evdev/event_modifiers_evdev.cc
|
| diff --git a/ui/events/ozone/evdev/event_modifiers_evdev.cc b/ui/events/ozone/evdev/event_modifiers_evdev.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..72533c5c82ee715f33d540a51365c4623c1b8216
|
| --- /dev/null
|
| +++ b/ui/events/ozone/evdev/event_modifiers_evdev.cc
|
| @@ -0,0 +1,90 @@
|
| +// 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/event_modifiers_evdev.h"
|
| +
|
| +#include <linux/input.h>
|
| +
|
| +#include "ui/events/event.h"
|
| +
|
| +namespace ui {
|
| +
|
| +namespace {
|
| +
|
| +static const int kEventFlagFromModifiers[] = {
|
| + EF_NONE, // EVDEV_MODIFIER_NONE,
|
| + EF_CAPS_LOCK_DOWN, // EVDEV_MODIFIER_CAPS_LOCK
|
| + EF_SHIFT_DOWN, // EVDEV_MODIFIER_SHIFT
|
| + EF_CONTROL_DOWN, // EVDEV_MODIFIER_CONTROL
|
| + EF_ALT_DOWN, // EVDEV_MODIFIER_ALT
|
| + EF_LEFT_MOUSE_BUTTON, // EVDEV_MODIFIER_LEFT_MOUSE_BUTTON
|
| + EF_MIDDLE_MOUSE_BUTTON, // EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON
|
| + EF_RIGHT_MOUSE_BUTTON, // EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON
|
| + EF_BACK_MOUSE_BUTTON, // EVDEV_MODIFIER_BACK_MOUSE_BUTTON
|
| + EF_FORWARD_MOUSE_BUTTON, // EVDEV_MODIFIER_FORWARD_MOUSE_BUTTON
|
| + EF_COMMAND_DOWN, // EVDEV_MODIFIER_COMMAND
|
| + EF_ALTGR_DOWN, // EVDEV_MODIFIER_ALTGR
|
| + EF_MOD3_DOWN, // EVDEV_MODIFIER_MOD3
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +EventModifiersEvdev::EventModifiersEvdev() {
|
| + memset(modifiers_down_, 0, sizeof(modifiers_down_));
|
| +}
|
| +EventModifiersEvdev::~EventModifiersEvdev() {}
|
| +
|
| +void EventModifiersEvdev::UpdateModifier(unsigned int modifier, bool down) {
|
| + DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);
|
| +
|
| + if (down) {
|
| + modifiers_down_[modifier]++;
|
| + } else {
|
| + // Ignore spurious modifier "up" events. This might happen if the
|
| + // button is down during startup.
|
| + if (modifiers_down_[modifier])
|
| + modifiers_down_[modifier]--;
|
| + }
|
| +
|
| + UpdateFlags(modifier);
|
| +}
|
| +
|
| +void EventModifiersEvdev::UpdateModifierLock(unsigned int modifier, bool down) {
|
| + DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);
|
| +
|
| + if (down)
|
| + modifier_flags_locked_ ^= kEventFlagFromModifiers[modifier];
|
| +
|
| + UpdateFlags(modifier);
|
| +}
|
| +
|
| +void EventModifiersEvdev::SetModifierLock(unsigned int modifier, bool locked) {
|
| + DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);
|
| +
|
| + if (locked)
|
| + modifier_flags_locked_ |= kEventFlagFromModifiers[modifier];
|
| + else
|
| + modifier_flags_locked_ &= ~kEventFlagFromModifiers[modifier];
|
| +
|
| + UpdateFlags(modifier);
|
| +}
|
| +
|
| +void EventModifiersEvdev::UpdateFlags(unsigned int modifier) {
|
| + int mask = kEventFlagFromModifiers[modifier];
|
| + bool down = modifiers_down_[modifier];
|
| + bool locked = (modifier_flags_locked_ & mask);
|
| + if (down != locked)
|
| + modifier_flags_ |= mask;
|
| + else
|
| + modifier_flags_ &= ~mask;
|
| +}
|
| +
|
| +int EventModifiersEvdev::GetModifierFlags() { return modifier_flags_; }
|
| +
|
| +// static
|
| +int EventModifiersEvdev::GetEventFlagFromModifier(unsigned int modifier) {
|
| + return kEventFlagFromModifiers[modifier];
|
| +}
|
| +
|
| +} // namespace ui
|
|
|