#771 在 Caps Lock 下把空闲时的标点键直接交给宿主,但不改标点状态, 悬浮工具栏和语言栏仍显示中文标点;它还绕过了「始终中文」标点锁定, 用户也无法在 Caps Lock 下手动改回中文标点。 改为让 Caps Lock 参与「标点跟随中英文模式」的规则:开启时标点切到英文, 关闭时按当前中英文模式重算。标点锁定仍然优先,手动切换不经过这条规则, 因此 Caps Lock 下仍可用 Ctrl+. 或工具栏改回中文标点。按键路径和 Server 的 CapsLockChanged 广播都会触发同步,只在 Caps Lock 状态真正变化时重算, 重复上报不会冲掉手动切换。延迟按键队列的影子标点状态同步更新。
46 lines
1.7 KiB
C++
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;
|
|
}
|