Example #1
0
Flags&
Flags::remove(ModifierFlag flag) {
  // We consider the following case.
  //   (ModifierFlag::SHIFT_L | ModifierFlag::SHIFT_R).remove(ModifierFlag::SHIFT_L).
  //
  // The value of SHIFT_L and SHIFT_R is below.
  //
  // ModifierFlag::SHIFT_L : 0x20002
  // ModifierFlag::SHIFT_R : 0x20004
  //
  // So, the correct value of above case is 0x20004 (SHIFT_R).
  //
  // If we remove bits simple way (value_ &= ~flags),
  // the result value becomes 0x00004. It's not right.
  //
  // Therefore, we save the old value, and restore the necessary bits from it.
  //
  Flags old = *this;

  // keep ModifierFlag::NUMPAD.
  value_ &= ~(flag.getRawBits());

  auto& pairs = KeyCodeModifierFlagPairs::getPairs();
  for (size_t i = 0; i < pairs.size(); ++i) {
    ModifierFlag f = pairs[i].getModifierFlag();
    if (f == flag) continue;
    if (!old.isOn(f)) continue;

    value_ |= f.getRawBits();
  }

  return *this;
}
Example #2
0
TEST(Flags, getModifierFlagByIndex) {
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(0);
    EXPECT_EQ(flag.get(), ModifierFlag::CAPSLOCK.get());
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(1);
    EXPECT_EQ(flag, ModifierFlag::SHIFT_L);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(2);
    EXPECT_EQ(flag, ModifierFlag::SHIFT_R);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(3);
    EXPECT_EQ(flag, ModifierFlag::CONTROL_L);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(4);
    EXPECT_EQ(flag, ModifierFlag::CONTROL_R);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(5);
    EXPECT_EQ(flag, ModifierFlag::OPTION_L);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(6);
    EXPECT_EQ(flag, ModifierFlag::OPTION_R);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(7);
    EXPECT_EQ(flag, ModifierFlag::COMMAND_L);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(8);
    EXPECT_EQ(flag, ModifierFlag::COMMAND_R);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(9);
    EXPECT_EQ(flag, ModifierFlag::CURSOR);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(10);
    EXPECT_EQ(flag, ModifierFlag::FN);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(11);
    EXPECT_EQ(flag, ModifierFlag::EXTRA1);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(12);
    EXPECT_EQ(flag, ModifierFlag::EXTRA2);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(13);
    EXPECT_EQ(flag, ModifierFlag::EXTRA3);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(14);
    EXPECT_EQ(flag, ModifierFlag::EXTRA4);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(15);
    EXPECT_EQ(flag, ModifierFlag::EXTRA5);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(16);
    EXPECT_EQ(flag, ModifierFlag::NONE);
  }
  {
    ModifierFlag flag = Flags::getModifierFlagByIndex(17);
    EXPECT_EQ(flag, ModifierFlag::NONE);
  }
}
Example #3
0
 bool isOn(ModifierFlag flag) const {
   return (value_ & flag.get()) == flag.get();
 }
Example #4
0
 inline Flags operator|(ModifierFlag lhs, ModifierFlag rhs) { return lhs.get() | rhs.get(); }
Example #5
0
 Flags(ModifierFlag v) : value_(v.get()) {}
Example #6
0
 bool operator==(ModifierFlag other) const { return value_ == other.get(); }
  void
  EventOutputQueue::FireModifiers::fire(Flags toFlags, KeyboardType keyboardType)
  {
    toFlags.stripNONE();
    toFlags.stripEXTRA();

    if (lastFlags_ == toFlags) return;

    // ------------------------------------------------------------
    // At first we handle KeyUp events and handle KeyDown events next.
    // We need to end KeyDown at Command+Space to Option_L+Shift_L.
    //
    // When Option_L+Shift_L has a meaning (switch input language at Windows),
    // it does not works well when the last is KeyUp of Command.

    // ------------------------------------------------------------
    // About ModifierFlag::CURSOR (UpdateEventFlags) handling:
    //
    // We need to treat ModifierFlag::CURSOR specially.
    //
    // When we activated "Control+Right to Option+Right" and pressed Control+Right,
    // the following events are happened.
    //
    // ----------------------+----------------------------------------------------------------------
    // (1) Press Control_L   | eventType:keyMod  code:0x3b name:Control_L flags:               misc:
    // (2) Press Right       | eventType:keyMod  code:0x3a name:Option_L  flags:Opt            misc:
    //                       | eventType:keyDown code:0x7c name:Right     flags:Opt NumPad Fn  misc:
    // (3) Release Right     | eventType:keyUp   code:0x7c name:Right     flags:Opt NumPad Fn  misc:
    // (4) Release Control_L | eventType:keyMod  code:0x3a name:Option_L  flags:               misc:
    // ----------------------+----------------------------------------------------------------------
    //
    // We need to treat "ModifierFlag::CURSOR Down" event after other modifiers.
    // We need to treat "ModifierFlag::CURSOR Up" event before other modifiers.
    // If not, unnecessary ModifierFlag::CURSOR is added on keyMod events.

    // ModifierFlag::CURSOR (Up)
    if (lastFlags_.isOn(ModifierFlag::CURSOR) && ! toFlags.isOn(ModifierFlag::CURSOR)) {
      lastFlags_.remove(ModifierFlag::CURSOR);

      Params_UpdateEventFlagsCallback::auto_ptr ptr(Params_UpdateEventFlagsCallback::alloc(lastFlags_));
      if (ptr) {
        EventOutputQueue::push(*ptr);
      }
    }

    // ------------------------------------------------------------
    // KeyUp
    for (int i = 0;; ++i) {
      ModifierFlag flag = FlagStatus::getFlag(i);
      if (flag == ModifierFlag::NONE) break;
      if (flag == ModifierFlag::CURSOR) continue;
      if (Flags(flag).isVirtualModifiersOn()) continue;

      if (! lastFlags_.isOn(flag)) continue;
      if (toFlags.isOn(flag)) continue;

      lastFlags_.remove(flag);

      Params_KeyboardEventCallBack::auto_ptr ptr(Params_KeyboardEventCallBack::alloc(EventType::MODIFY, lastFlags_, flag.getKeyCode(), keyboardType, false));
      if (! ptr) continue;
      EventOutputQueue::push(*ptr);
    }

    // KeyDown
    for (int i = 0;; ++i) {
      ModifierFlag flag = FlagStatus::getFlag(i);
      if (flag == ModifierFlag::NONE) break;
      if (flag == ModifierFlag::CURSOR) continue;
      if (Flags(flag).isVirtualModifiersOn()) continue;

      if (! toFlags.isOn(flag)) continue;
      if (lastFlags_.isOn(flag)) continue;

      lastFlags_.add(flag);

      Params_KeyboardEventCallBack::auto_ptr ptr(Params_KeyboardEventCallBack::alloc(EventType::MODIFY, lastFlags_, flag.getKeyCode(), keyboardType, false));
      if (! ptr) continue;
      EventOutputQueue::push(*ptr);
    }

    // ------------------------------------------------------------
    // ModifierFlag::CURSOR (Down)
    if (! lastFlags_.isOn(ModifierFlag::CURSOR) && toFlags.isOn(ModifierFlag::CURSOR)) {
      lastFlags_.add(ModifierFlag::CURSOR);

      Params_UpdateEventFlagsCallback::auto_ptr ptr(Params_UpdateEventFlagsCallback::alloc(lastFlags_));
      if (ptr) {
        EventOutputQueue::push(*ptr);
      }
    }

    lastFlags_ = toFlags;
  }
Example #8
0
Flags operator|(ModifierFlag lhs, ModifierFlag rhs) { return Flags(lhs.getRawBits() | rhs.getRawBits()); }
Example #9
0
void EventOutputQueue::FireModifiers::fire(AutogenId autogenId, PhysicalEventType physicalEventType, Flags toFlags, KeyboardType keyboardType) {
  if (lastFlags_ == toFlags) return;

  if (physicalEventType == PhysicalEventType::DOWN) {
    isIgnorePhysicalUpEvent_ = false;
  } else if (physicalEventType == PhysicalEventType::UP) {
    if (isIgnorePhysicalUpEvent_) {
      return;
    }
  }

  // ------------------------------------------------------------
  // At first we handle KeyUp events and handle KeyDown events next.
  // We need to end KeyDown at Command+Space to Option_L+Shift_L.
  //
  // When Option_L+Shift_L has a meaning (switch input language at Windows),
  // it does not works well when the last is KeyUp of Command.

  // ModifierFlag::NUMPAD handling.
  // (We need to remove ModifierFlag::NUMPAD at first in order to strip NUMPAD flag from normal modifier key events.)
  if (!toFlags.isOn(ModifierFlag::NUMPAD)) {
    lastFlags_.remove(ModifierFlag::NUMPAD);
  }

  // ------------------------------------------------------------
  // KeyUp
  for (size_t i = 0; i < FlagStatus::globalFlagStatus().itemSize(); ++i) {
    ModifierFlag flag = FlagStatus::globalFlagStatus().getFlag(i);

    // Skipping invalid flags
    if (flag.getKeyCode() == KeyCode::VK_NONE) continue;
    // Skipping virtual modifiers.
    if (flag.getRawBits() == 0) continue;

    // ----------------------------------------
    if (!lastFlags_.isOn(flag)) continue;
    if (toFlags.isOn(flag)) continue;

    lastFlags_.remove(flag);

    Params_KeyboardEventCallBack params(EventType::MODIFY, lastFlags_, flag.getKeyCode(), keyboardType, false);
    EventOutputQueue::push(params, autogenId);
  }

  // KeyDown
  for (size_t i = 0; i < FlagStatus::globalFlagStatus().itemSize(); ++i) {
    ModifierFlag flag = FlagStatus::globalFlagStatus().getFlag(i);

    // Skipping invalid flags
    if (flag.getKeyCode() == KeyCode::VK_NONE) continue;
    // Skipping virtual modifiers.
    if (flag.getRawBits() == 0) continue;

    // ----------------------------------------
    if (!toFlags.isOn(flag)) continue;
    if (lastFlags_.isOn(flag)) continue;

    lastFlags_.add(flag);

    Params_KeyboardEventCallBack params(EventType::MODIFY, lastFlags_, flag.getKeyCode(), keyboardType, false);
    EventOutputQueue::push(params, autogenId);
  }

  // ModifierFlag::NUMPAD handling.
  // (We need to add ModifierFlag::NUMPAD at last in order to strip NUMPAD flag from normal modifier key events.)
  if (toFlags.isOn(ModifierFlag::NUMPAD)) {
    lastFlags_.add(ModifierFlag::NUMPAD);
  }
}