mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-02 18:22:42 -08:00
feat(core): add Electron runtime, services, and app composition
This commit is contained in:
77
src/core/services/shortcut-fallback.ts
Normal file
77
src/core/services/shortcut-fallback.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import { globalShortcut } from 'electron';
|
||||
|
||||
export function isGlobalShortcutRegisteredSafe(accelerator: string): boolean {
|
||||
try {
|
||||
return globalShortcut.isRegistered(accelerator);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function shortcutMatchesInputForLocalFallback(
|
||||
input: Electron.Input,
|
||||
accelerator: string,
|
||||
allowWhenRegistered = false,
|
||||
): boolean {
|
||||
if (input.type !== 'keyDown' || input.isAutoRepeat) return false;
|
||||
if (!accelerator) return false;
|
||||
if (!allowWhenRegistered && isGlobalShortcutRegisteredSafe(accelerator)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const normalized = accelerator
|
||||
.replace(/\s+/g, '')
|
||||
.replace(/cmdorctrl/gi, 'CommandOrControl')
|
||||
.toLowerCase();
|
||||
const parts = normalized.split('+').filter(Boolean);
|
||||
if (parts.length === 0) return false;
|
||||
|
||||
const keyToken = parts[parts.length - 1]!;
|
||||
const modifierTokens = new Set(parts.slice(0, -1));
|
||||
const allowedModifiers = new Set(['shift', 'alt', 'meta', 'control', 'commandorcontrol']);
|
||||
for (const token of modifierTokens) {
|
||||
if (!allowedModifiers.has(token)) return false;
|
||||
}
|
||||
|
||||
const inputKey = (input.key || '').toLowerCase();
|
||||
if (keyToken.length === 1) {
|
||||
if (inputKey !== keyToken) return false;
|
||||
} else if (keyToken.startsWith('key') && keyToken.length === 4) {
|
||||
if (inputKey !== keyToken.slice(3)) return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
const expectedShift = modifierTokens.has('shift');
|
||||
const expectedAlt = modifierTokens.has('alt');
|
||||
const expectedMeta = modifierTokens.has('meta');
|
||||
const expectedControl = modifierTokens.has('control');
|
||||
const expectedCommandOrControl = modifierTokens.has('commandorcontrol');
|
||||
|
||||
if (Boolean(input.shift) !== expectedShift) return false;
|
||||
if (Boolean(input.alt) !== expectedAlt) return false;
|
||||
|
||||
if (expectedCommandOrControl) {
|
||||
const hasCmdOrCtrl =
|
||||
process.platform === 'darwin' ? Boolean(input.meta || input.control) : Boolean(input.control);
|
||||
if (!hasCmdOrCtrl) return false;
|
||||
} else {
|
||||
if (process.platform === 'darwin') {
|
||||
if (input.meta || input.control) return false;
|
||||
} else if (!expectedControl && input.control) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (expectedMeta && !input.meta) return false;
|
||||
if (!expectedMeta && modifierTokens.has('meta') === false && input.meta) {
|
||||
if (!expectedCommandOrControl) return false;
|
||||
}
|
||||
|
||||
if (expectedControl && !input.control) return false;
|
||||
if (!expectedControl && modifierTokens.has('control') === false && input.control) {
|
||||
if (!expectedCommandOrControl) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user