Files
msime-windows/windows/tests/caps_lock_punctuation_policy.cpp
fanlusky 37550e6cc0 fix(windows): Caps Lock 开启时切换为英文标点模式
#771 在 Caps Lock 下把空闲时的标点键直接交给宿主,但不改标点状态,
悬浮工具栏和语言栏仍显示中文标点;它还绕过了「始终中文」标点锁定,
用户也无法在 Caps Lock 下手动改回中文标点。

改为让 Caps Lock 参与「标点跟随中英文模式」的规则:开启时标点切到英文,
关闭时按当前中英文模式重算。标点锁定仍然优先,手动切换不经过这条规则,
因此 Caps Lock 下仍可用 Ctrl+. 或工具栏改回中文标点。按键路径和 Server
的 CapsLockChanged 广播都会触发同步,只在 Caps Lock 状态真正变化时重算,
重复上报不会冲掉手动切换。延迟按键队列的影子标点状态同步更新。
2026-10-11 00:46:52 +08:00

46 lines
1.7 KiB
C++

#include "Key/CapsLockPunctuationPolicy.h"
#include <cstdio>
int main()
{
int failures = 0;
// Bits are IME open, Caps Lock. Only Chinese mode without Caps Lock follows into
// Chinese punctuation; Caps Lock makes the followed punctuation English.
constexpr bool expectedFollowed[4] = {false, false, true, false};
for (unsigned state = 0; state < 4; ++state)
{
const bool imeOpen = (state & 2) != 0;
const bool capsLock = (state & 1) != 0;
const bool actual = FollowedPunctuationOpen(imeOpen, capsLock);
if (actual != expectedFollowed[state])
{
std::fprintf(stderr, "FAIL followed ime=%d caps=%d: expected=%d actual=%d\n", imeOpen, capsLock,
expectedFollowed[state], actual);
++failures;
}
}
// Bits are known, last applied, Caps Lock. The first report always syncs; afterwards
// only a changed Caps Lock state does, so a repeated report keeps a manual toggle.
constexpr bool expectedResync[8] = {true, true, true, true, false, true, true, false};
for (unsigned state = 0; state < 8; ++state)
{
const bool known = (state & 4) != 0;
const bool lastApplied = (state & 2) != 0;
const bool capsLock = (state & 1) != 0;
const bool actual = ShouldResyncPunctuationForCapsLock(known, lastApplied, capsLock);
if (actual != expectedResync[state])
{
std::fprintf(stderr, "FAIL resync known=%d last=%d caps=%d: expected=%d actual=%d\n", known, lastApplied,
capsLock, expectedResync[state], actual);
++failures;
}
}
if (failures != 0)
return 1;
std::puts("PASS: Caps Lock punctuation follow and resync policy");
return 0;
}