Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / events / ozone / evdev / event_modifiers_evdev.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/events/ozone/evdev/event_modifiers_evdev.h"
6
7 #include <linux/input.h>
8
9 #include "ui/events/event.h"
10
11 namespace ui {
12
13 namespace {
14
15 static const int kEventFlagFromModifiers[] = {
16     EF_NONE,                 // EVDEV_MODIFIER_NONE,
17     EF_CAPS_LOCK_DOWN,       // EVDEV_MODIFIER_CAPS_LOCK
18     EF_SHIFT_DOWN,           // EVDEV_MODIFIER_SHIFT
19     EF_CONTROL_DOWN,         // EVDEV_MODIFIER_CONTROL
20     EF_ALT_DOWN,             // EVDEV_MODIFIER_ALT
21     EF_LEFT_MOUSE_BUTTON,    // EVDEV_MODIFIER_LEFT_MOUSE_BUTTON
22     EF_MIDDLE_MOUSE_BUTTON,  // EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON
23     EF_RIGHT_MOUSE_BUTTON,   // EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON
24     EF_COMMAND_DOWN,         // EVDEV_MODIFIER_COMMAND
25     EF_ALTGR_DOWN,           // EVDEV_MODIFIER_ALTGR
26 };
27
28 }  // namespace
29
30 EventModifiersEvdev::EventModifiersEvdev()
31     : modifier_flags_locked_(0), modifier_flags_(0) {
32   memset(modifiers_down_, 0, sizeof(modifiers_down_));
33 }
34 EventModifiersEvdev::~EventModifiersEvdev() {}
35
36 void EventModifiersEvdev::UpdateModifier(unsigned int modifier, bool down) {
37   DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);
38
39   if (down) {
40     modifiers_down_[modifier]++;
41   } else {
42     // Ignore spurious modifier "up" events. This might happen if the
43     // button is down during startup.
44     if (modifiers_down_[modifier])
45       modifiers_down_[modifier]--;
46   }
47
48   UpdateFlags(modifier);
49 }
50
51 void EventModifiersEvdev::UpdateModifierLock(unsigned int modifier, bool down) {
52   DCHECK_LT(modifier, EVDEV_NUM_MODIFIERS);
53
54   if (down)
55     modifier_flags_locked_ ^= kEventFlagFromModifiers[modifier];
56
57   // TODO(spang): Synchronize with the CapsLock LED.
58
59   UpdateFlags(modifier);
60 }
61
62 void EventModifiersEvdev::UpdateFlags(unsigned int modifier) {
63   int mask = kEventFlagFromModifiers[modifier];
64   bool down = modifiers_down_[modifier];
65   bool locked = (modifier_flags_locked_ & mask);
66   if (down != locked)
67     modifier_flags_ |= mask;
68   else
69     modifier_flags_ &= ~mask;
70 }
71
72 int EventModifiersEvdev::GetModifierFlags() { return modifier_flags_; }
73
74 // static
75 int EventModifiersEvdev::GetEventFlagFromModifier(unsigned int modifier) {
76   return kEventFlagFromModifiers[modifier];
77 }
78
79 }  // namespace ui