100 lines
3.9 KiB
JavaScript
100 lines
3.9 KiB
JavaScript
import { appWindow } from "@tauri-apps/api/window";
|
|
import { register, unregisterAll, isRegistered } from "@tauri-apps/api/globalShortcut";
|
|
import { useEffect } from "react";
|
|
import { store } from "@store";
|
|
import { useHotkeys } from "@logics_configs";
|
|
import { useMainFunction } from "@logics_main";
|
|
|
|
// 修飾キーのパースを行う関数
|
|
const parseHotkey = (hotkeyString) => {
|
|
const keyMap = {
|
|
Ctrl: "Control",
|
|
Alt: "Alt",
|
|
Shift: "Shift",
|
|
Meta: "Super",
|
|
};
|
|
|
|
// 入力文字列を分解して対応するキーを再結合
|
|
return hotkeyString
|
|
.map((key) => keyMap[key] || key) // 修飾キーをマップし、その他はそのまま
|
|
.join("+");
|
|
};
|
|
|
|
export const GlobalHotKeyController = () => {
|
|
const { currentHotkeys } = useHotkeys();
|
|
|
|
const {
|
|
toggleTranslation,
|
|
toggleTranscriptionSend,
|
|
toggleTranscriptionReceive,
|
|
} = useMainFunction();
|
|
|
|
useEffect(() => {
|
|
const registerShortcuts = async () => {
|
|
try {
|
|
// 既存のショートカットをすべて解除
|
|
await unregisterAll();
|
|
|
|
const hotkeyEntries = Object.entries(currentHotkeys.data);
|
|
|
|
for (const [actionKey, hotkeyRaw] of hotkeyEntries) {
|
|
if (!hotkeyRaw) continue;
|
|
|
|
const shortcut = parseHotkey(hotkeyRaw);
|
|
const isAlreadyRegistered = await isRegistered(shortcut);
|
|
|
|
if (!isAlreadyRegistered) {
|
|
await register(shortcut, async () => {
|
|
console.log(`Shortcut for "${actionKey}" triggered.`);
|
|
|
|
switch (actionKey) {
|
|
case "toggle_vrct_visibility": {
|
|
const minimized = await appWindow.isMinimized();
|
|
if (minimized) {
|
|
appWindow.unminimize();
|
|
await appWindow.setFocus();
|
|
store.text_area_ref.current?.focus();
|
|
} else {
|
|
appWindow.minimize();
|
|
}
|
|
break;
|
|
}
|
|
case "toggle_translation": {
|
|
toggleTranslation();
|
|
break;
|
|
}
|
|
case "toggle_transcription_send": {
|
|
toggleTranscriptionSend();
|
|
break;
|
|
}
|
|
case "toggle_transcription_receive": {
|
|
toggleTranscriptionReceive();
|
|
break;
|
|
}
|
|
default: {
|
|
console.warn(`No handler defined for action: ${actionKey}`);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
console.log(`Registered global shortcut: ${shortcut} for action: ${actionKey}`);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("Failed to register global shortcuts:", error);
|
|
}
|
|
};
|
|
|
|
registerShortcuts();
|
|
|
|
// クリーンアップ関数でショートカットを解除
|
|
return () => {
|
|
unregisterAll().catch((error) => {
|
|
console.error("Failed to unregister shortcuts:", error);
|
|
});
|
|
};
|
|
}, [currentHotkeys.data]); // 監視対象を全体に変更
|
|
|
|
return null;
|
|
};
|