void ListHookedKeyboard::setcapslock_timer_callback(OSObject* owner, IOTimerEventSource* sender) { ListHookedKeyboard& self = ListHookedKeyboard::instance(); if (Config::get_essential_config(BRIDGE_ESSENTIAL_CONFIG_INDEX_general_passthrough_capslock_led_status)) return; Flags flags = FlagStatus::globalFlagStatus().makeFlags(); for (Item* p = static_cast<Item*>(self.list_.safe_front()); p; p = static_cast<Item*>(p->getnext())) { if (!p->isReplaced()) continue; // Don't call setAlphaLock on devices which have non-Apple driver. if (p->getDeviceType() != DeviceType::APPLE_INTERNAL && p->getDeviceType() != DeviceType::APPLE_EXTERNAL) { continue; } IOHIKeyboard* kbd = OSDynamicCast(IOHIKeyboard, p->get()); if (!kbd) continue; { GlobalLock::ScopedUnlock lk; // We call setAlphaLock to match a state of CapsLock of the hardware with remapped CapsLock. if (flags.isOn(ModifierFlag::CAPSLOCK)) { if (!kbd->alphaLock()) { kbd->setAlphaLock(true); } } else { if (kbd->alphaLock()) { kbd->setAlphaLock(false); } } } } }