TEST(FlagStatus, subtract) { FlagStatus flagStatus1; FlagStatus flagStatus2; flagStatus1.increase(ModifierFlag::CONTROL_L); flagStatus1.increase(ModifierFlag::OPTION_L); flagStatus1.increase(ModifierFlag::SHIFT_L); flagStatus1.increase(ModifierFlag::SHIFT_L); flagStatus1.decrease(ModifierFlag::COMMAND_R); flagStatus2.increase(ModifierFlag::CONTROL_L); flagStatus2.increase(ModifierFlag::FN); Vector_ModifierFlag v; flagStatus1.subtract(flagStatus2, v); EXPECT_EQ(3, v.size()); EXPECT_EQ(ModifierFlag::OPTION_L, v[0]); EXPECT_EQ(ModifierFlag::SHIFT_L, v[1]); EXPECT_EQ(ModifierFlag::SHIFT_L, v[2]); flagStatus2.subtract(flagStatus1, v); EXPECT_EQ(2, v.size()); EXPECT_EQ(ModifierFlag::COMMAND_R, v[0]); EXPECT_EQ(ModifierFlag::FN, v[1]); }
bool FlagStatus::isOn(const Vector_ModifierFlag& modifierFlags) const { bool strict = false; for (size_t i = 0; i < modifierFlags.size(); ++i) { if (modifierFlags[i] == ModifierFlag::ZERO) continue; if (modifierFlags[i] == ModifierFlag::NONE) { strict = true; } else { if (! isOn(modifierFlags[i])) return false; } } // If modifierFlags contains ModifierFlag::NONE, // return false when unspecified modifierflag is pressed. if (strict) { for (size_t i = 0; i < item_.size(); ++i) { if (item_[i].sum(true) > 0 && ! modifierFlags.is_include(item_[i].flag_)) { return false; } } } return true; }
void DependingPressingPeriodKeyToKey::dokeyup(void) { switch (periodtype_) { case PeriodType::SHORT_PERIOD: { periodtype_ = PeriodType::NONE; keytokey_[KeyToKeyType::SHORT_PERIOD].call_remap_with_VK_PSEUDO_KEY(EventType::UP); break; } case PeriodType::LONG_PERIOD: { periodtype_ = PeriodType::NONE; keytokey_[KeyToKeyType::LONG_PERIOD].call_remap_with_VK_PSEUDO_KEY(EventType::UP); // ---------------------------------------- // handle PRESSING_TARGET_KEY_ONLY if (periodMS_.enabled(PeriodMS::Type::PRESSING_TARGET_KEY_ONLY)) { if (! eventWatcherTarget_.isAnyEventHappen() && ic_.getmillisec() < periodMS_.get(PeriodMS::Type::PRESSING_TARGET_KEY_ONLY)) { // ---------------------------------------- // Restore FlagStatus at key down. Vector_ModifierFlag added; Vector_ModifierFlag removed; FlagStatus::globalFlagStatus().subtract(flagStatusWhenKeyPressed_, added); flagStatusWhenKeyPressed_.subtract(FlagStatus::globalFlagStatus(), removed); for (size_t i = 0; i < added.size(); ++i) { FlagStatus::globalFlagStatus().decrease(added[i]); } for (size_t i = 0; i < removed.size(); ++i) { FlagStatus::globalFlagStatus().increase(removed[i]); } // ---------------------------------------- keytokey_[KeyToKeyType::PRESSING_TARGET_KEY_ONLY].call_remap_with_VK_PSEUDO_KEY(EventType::DOWN); keytokey_[KeyToKeyType::PRESSING_TARGET_KEY_ONLY].call_remap_with_VK_PSEUDO_KEY(EventType::UP); // ---------------------------------------- // Restore current FlagStatus. for (size_t i = 0; i < added.size(); ++i) { FlagStatus::globalFlagStatus().increase(added[i]); } for (size_t i = 0; i < removed.size(); ++i) { FlagStatus::globalFlagStatus().decrease(removed[i]); } } } break; } case PeriodType::LONG_LONG_PERIOD: { periodtype_ = PeriodType::NONE; keytokey_[KeyToKeyType::LONG_LONG_PERIOD].call_remap_with_VK_PSEUDO_KEY(EventType::UP); break; } case PeriodType::NONE: // do nothing break; } eventWatcherTarget_.unobserve(); }