| // 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) { | 
 |   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]; | 
 |  | 
 |   // 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 |