Files
VRCT/src-ui/app/_app_controllers/GlobalHotKeyController.jsx
2025-01-12 22:56:00 +09:00

74 lines
2.6 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";
// 修飾キーのパースを行う関数
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();
useEffect(() => {
const registerShortcuts = async () => {
const shortcut_raw = currentHotkeys.data.toggle_active_vrct;
console.log(shortcut_raw);
if (!shortcut_raw) {
console.warn("No hotkey defined.");
return;
}
const shortcut = parseHotkey(shortcut_raw);
try {
// 既存のショートカットをすべて解除
await unregisterAll();
// 新しいショートカットを登録
const isAlreadyRegistered = await isRegistered(shortcut);
if (!isAlreadyRegistered) {
await register(shortcut, async () => {
console.log(`Shortcut "${shortcut}" triggered, setting focus.`);
const minimized = await appWindow.isMinimized();
if (minimized === true) {
appWindow.unminimize();
await appWindow.setFocus();
store.text_area_ref.current?.focus();
} else {
appWindow.minimize();
}
});
console.log(`Registered global shortcut: ${shortcut}`);
}
} catch (error) {
console.error("Failed to register global shortcut:", error);
}
};
registerShortcuts();
// クリーンアップ関数でショートカットを解除
return () => {
unregisterAll().catch((error) => {
console.error("Failed to unregister shortcuts:", error);
});
};
}, [currentHotkeys.data.toggle_active_vrct]); // 監視対象を明確に指定
return null;
};