event_modifiers.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. #include "ui/events/event_modifiers.h"
  5. #include "ui/events/event.h"
  6. namespace ui {
  7. namespace {
  8. static const int kEventFlagFromModifiers[] = {
  9. EF_NONE, // MODIFIER_NONE,
  10. EF_SHIFT_DOWN, // MODIFIER_SHIFT
  11. EF_CONTROL_DOWN, // MODIFIER_CONTROL
  12. EF_ALT_DOWN, // MODIFIER_ALT
  13. EF_COMMAND_DOWN, // MODIFIER_COMMAND
  14. EF_ALTGR_DOWN, // MODIFIER_ALTGR
  15. EF_MOD3_DOWN, // MODIFIER_MOD3
  16. EF_CAPS_LOCK_ON, // MODIFIER_CAPS_LOCK
  17. EF_LEFT_MOUSE_BUTTON, // MODIFIER_LEFT_MOUSE_BUTTON
  18. EF_MIDDLE_MOUSE_BUTTON, // MODIFIER_MIDDLE_MOUSE_BUTTON
  19. EF_RIGHT_MOUSE_BUTTON, // MODIFIER_RIGHT_MOUSE_BUTTON
  20. EF_BACK_MOUSE_BUTTON, // MODIFIER_BACK_MOUSE_BUTTON
  21. EF_FORWARD_MOUSE_BUTTON, // MODIFIER_FORWARD_MOUSE_BUTTON
  22. };
  23. } // namespace
  24. EventModifiers::EventModifiers() {
  25. memset(modifiers_down_, 0, sizeof(modifiers_down_));
  26. }
  27. EventModifiers::~EventModifiers() {}
  28. void EventModifiers::UpdateModifier(unsigned int modifier, bool down) {
  29. DCHECK_LT(modifier, static_cast<unsigned int>(MODIFIER_NUM_MODIFIERS));
  30. if (down) {
  31. modifiers_down_[modifier]++;
  32. } else {
  33. // Ignore spurious modifier "up" events. This might happen if the
  34. // button is down during startup.
  35. if (modifiers_down_[modifier])
  36. modifiers_down_[modifier]--;
  37. }
  38. UpdateFlags(modifier);
  39. }
  40. void EventModifiers::UpdateModifierLock(unsigned int modifier, bool down) {
  41. DCHECK_LT(modifier, static_cast<unsigned int>(MODIFIER_NUM_MODIFIERS));
  42. if (down)
  43. modifier_flags_locked_ ^= kEventFlagFromModifiers[modifier];
  44. UpdateFlags(modifier);
  45. }
  46. void EventModifiers::SetModifierLock(unsigned int modifier, bool locked) {
  47. DCHECK_LT(modifier, static_cast<unsigned int>(MODIFIER_NUM_MODIFIERS));
  48. if (locked)
  49. modifier_flags_locked_ |= kEventFlagFromModifiers[modifier];
  50. else
  51. modifier_flags_locked_ &= ~kEventFlagFromModifiers[modifier];
  52. UpdateFlags(modifier);
  53. }
  54. void EventModifiers::UpdateFlags(unsigned int modifier) {
  55. int mask = kEventFlagFromModifiers[modifier];
  56. bool down = modifiers_down_[modifier] != 0;
  57. bool locked = (modifier_flags_locked_ & mask) != 0;
  58. if (down != locked)
  59. modifier_flags_ |= mask;
  60. else
  61. modifier_flags_ &= ~mask;
  62. }
  63. int EventModifiers::GetModifierFlags() {
  64. return modifier_flags_;
  65. }
  66. void EventModifiers::ResetKeyboardModifiers() {
  67. static const int kKeyboardModifiers[] = {MODIFIER_SHIFT, MODIFIER_CONTROL,
  68. MODIFIER_ALT, MODIFIER_COMMAND,
  69. MODIFIER_ALTGR, MODIFIER_MOD3};
  70. for (const int modifier : kKeyboardModifiers) {
  71. modifiers_down_[modifier] = 0;
  72. UpdateFlags(modifier);
  73. }
  74. }
  75. // static
  76. int EventModifiers::GetEventFlagFromModifier(unsigned int modifier) {
  77. return kEventFlagFromModifiers[modifier];
  78. }
  79. // static
  80. int EventModifiers::GetModifierFromEventFlag(int flag) {
  81. switch (flag) {
  82. case EF_SHIFT_DOWN:
  83. return MODIFIER_SHIFT;
  84. case EF_CONTROL_DOWN:
  85. return MODIFIER_CONTROL;
  86. case EF_ALT_DOWN:
  87. return MODIFIER_ALT;
  88. case EF_COMMAND_DOWN:
  89. return MODIFIER_COMMAND;
  90. case EF_ALTGR_DOWN:
  91. return MODIFIER_ALTGR;
  92. case EF_MOD3_DOWN:
  93. return MODIFIER_MOD3;
  94. case EF_CAPS_LOCK_ON:
  95. return MODIFIER_CAPS_LOCK;
  96. case EF_LEFT_MOUSE_BUTTON:
  97. return MODIFIER_LEFT_MOUSE_BUTTON;
  98. case EF_MIDDLE_MOUSE_BUTTON:
  99. return MODIFIER_MIDDLE_MOUSE_BUTTON;
  100. case EF_RIGHT_MOUSE_BUTTON:
  101. return MODIFIER_RIGHT_MOUSE_BUTTON;
  102. case EF_BACK_MOUSE_BUTTON:
  103. return MODIFIER_BACK_MOUSE_BUTTON;
  104. case EF_FORWARD_MOUSE_BUTTON:
  105. return MODIFIER_FORWARD_MOUSE_BUTTON;
  106. default:
  107. return MODIFIER_NONE;
  108. }
  109. }
  110. } // namespace ui