diff options
Diffstat (limited to 'chromium/ui/events/ozone/evdev/event_modifiers_evdev.cc')
-rw-r--r-- | chromium/ui/events/ozone/evdev/event_modifiers_evdev.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/chromium/ui/events/ozone/evdev/event_modifiers_evdev.cc b/chromium/ui/events/ozone/evdev/event_modifiers_evdev.cc new file mode 100644 index 00000000000..d867b5eef7d --- /dev/null +++ b/chromium/ui/events/ozone/evdev/event_modifiers_evdev.cc @@ -0,0 +1,79 @@ +// 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_COMMAND_DOWN, // EVDEV_MODIFIER_COMMAND + EF_ALTGR_DOWN, // EVDEV_MODIFIER_ALTGR +}; + +} // namespace + +EventModifiersEvdev::EventModifiersEvdev() + : modifier_flags_locked_(0), modifier_flags_(0) { + memset(modifiers_down_, 0, sizeof(modifiers_down_)); +} +EventModifiersEvdev::~EventModifiersEvdev() {} + +void EventModifiersEvdev::UpdateModifier(unsigned int modifier, bool down) { + CHECK_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) { + CHECK_LT(modifier, EVDEV_NUM_MODIFIERS); + + if (down) + modifier_flags_locked_ ^= kEventFlagFromModifiers[modifier]; + + // TODO(spang): Synchronize with the CapsLock LED. + + 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 |