fix: harden Windows hotkey release handling

This commit is contained in:
baiqing committed 2026-04-30 19:26:31 +08:00
1 parent 6801f29e05
commit 9b2f65fe71
2 files changed
+27 -1

No files matched your search

+3 -1
View File
@@ -319,7 +319,9 @@ jobs:
name: 'OpenLess ${{ github.ref_name }}'
draft: false
prerelease: false
generate_release_notes: true
# Matrix jobs all upload assets to the same release. Generate notes once
# so macOS, Windows, and Linux jobs do not duplicate the release body.
generate_release_notes: ${{ matrix.platform == 'macos-latest' }}
files: |
openless-all/app/src-tauri/target/release/bundle/dmg/*.dmg
openless-all/app/src-tauri/target/release/bundle/macos/*.app.tar.gz
+24
View File
@@ -60,8 +60,14 @@ export function App({ isCapsule }: AppProps) {
useEffect(() => {
if (!isTauri || os !== 'win') return;
const pressedKeys = new Map<string, string>();
const forwardKey = (event: KeyboardEvent) => {
if (!isWindowHotkeyCandidate(event)) return;
if (event.type === 'keydown' && event.key !== 'Escape') {
pressedKeys.set(event.code, event.key);
} else if (event.type === 'keyup') {
pressedKeys.delete(event.code);
}
void handleWindowHotkeyEvent(
event.type as 'keydown' | 'keyup',
event.key,
@@ -69,11 +75,29 @@ export function App({ isCapsule }: AppProps) {
event.repeat,
).catch(error => console.warn('[window-hotkey] forward failed', error));
};
const releasePressedKeys = () => {
if (pressedKeys.size === 0) return;
const pending = Array.from(pressedKeys.entries());
pressedKeys.clear();
for (const [code, key] of pending) {
void handleWindowHotkeyEvent('keyup', key, code, false).catch(error =>
console.warn('[window-hotkey] release fallback failed', error),
);
}
};
const releaseOnHidden = () => {
if (document.visibilityState === 'hidden') releasePressedKeys();
};
window.addEventListener('keydown', forwardKey, true);
window.addEventListener('keyup', forwardKey, true);
window.addEventListener('blur', releasePressedKeys);
document.addEventListener('visibilitychange', releaseOnHidden);
return () => {
window.removeEventListener('keydown', forwardKey, true);
window.removeEventListener('keyup', forwardKey, true);
window.removeEventListener('blur', releasePressedKeys);
document.removeEventListener('visibilitychange', releaseOnHidden);
releasePressedKeys();
};
}, [os]);