[Update/TMP] Hotkey Alt+Y will active VRCT when VRChat is the active window.
This commit is contained in:
@@ -4,10 +4,9 @@ import {
|
||||
useWindow,
|
||||
} from "@logics_common";
|
||||
|
||||
// import React from "react";
|
||||
|
||||
import {
|
||||
KeyEventController,
|
||||
GlobalHotKeyController,
|
||||
StartPythonController,
|
||||
UiLanguageController,
|
||||
ConfigPageCloseTriggerController,
|
||||
@@ -34,6 +33,7 @@ export const App = () => {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<KeyEventController />
|
||||
<GlobalHotKeyController />
|
||||
<StartPythonController />
|
||||
<UiLanguageController />
|
||||
<ConfigPageCloseTriggerController />
|
||||
|
||||
43
src-ui/app/_app_controllers/GlobalHotKeyController.jsx
Normal file
43
src-ui/app/_app_controllers/GlobalHotKeyController.jsx
Normal file
@@ -0,0 +1,43 @@
|
||||
import { appWindow } from "@tauri-apps/api/window";
|
||||
import { register, unregisterAll, isRegistered } from "@tauri-apps/api/globalShortcut";
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
import { useEffect, useRef } from "react";
|
||||
import { store } from "@store";
|
||||
|
||||
export const GlobalHotKeyController = () => {
|
||||
const is_initialized = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (is_initialized.current) return;
|
||||
|
||||
const registerShortcuts = async () => {
|
||||
const shortcut = "Alt+Y";
|
||||
const is_already_registered = await isRegistered(shortcut);
|
||||
|
||||
if (is_already_registered) return;
|
||||
await register(shortcut, async () => {
|
||||
const activeWindowTitle = await invoke("get_active_window_title");
|
||||
|
||||
if (activeWindowTitle.includes("VRChat")) {
|
||||
console.log("Shortcut triggered, setFocus");
|
||||
appWindow.unminimize();
|
||||
await appWindow.setFocus();
|
||||
store.text_area_ref.current?.focus();
|
||||
} else {
|
||||
console.log("Active window is not VRChat.");
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
registerShortcuts();
|
||||
is_initialized.current = true;
|
||||
|
||||
return () => {
|
||||
unregisterAll().catch((error) => {
|
||||
console.error("Failed to unregister shortcuts:", error);
|
||||
});
|
||||
};
|
||||
}, []);
|
||||
|
||||
return null;
|
||||
};
|
||||
@@ -2,24 +2,27 @@ import { useEffect } from "react";
|
||||
|
||||
export const KeyEventController = () => {
|
||||
useEffect(() => {
|
||||
const handleKeydown = (event) => {
|
||||
if (event.key === "F5" || (event.ctrlKey && event.key === "r") ||
|
||||
(event.metaKey && event.key === "r")) {
|
||||
const handleKeydown = (event) => {
|
||||
if (
|
||||
event.key === "F5" ||
|
||||
(event.ctrlKey && event.key === "r") ||
|
||||
(event.metaKey && event.key === "r")
|
||||
) {
|
||||
event.preventDefault();
|
||||
}
|
||||
};
|
||||
|
||||
const handleContextmenu = (event) => {
|
||||
event.preventDefault();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const handleContextmenu = (event) => {
|
||||
event.preventDefault();
|
||||
};
|
||||
document.addEventListener("keydown", handleKeydown);
|
||||
document.addEventListener("contextmenu", handleContextmenu);
|
||||
|
||||
document.addEventListener("keydown", handleKeydown);
|
||||
document.addEventListener("contextmenu", handleContextmenu);
|
||||
|
||||
return () => {
|
||||
document.removeEventListener("keydown", handleKeydown);
|
||||
document.removeEventListener("contextmenu", handleContextmenu);
|
||||
};
|
||||
return () => {
|
||||
document.removeEventListener("keydown", handleKeydown);
|
||||
document.removeEventListener("contextmenu", handleContextmenu);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return null;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
export { KeyEventController } from "./KeyEventController";
|
||||
export { GlobalHotKeyController } from "./GlobalHotKeyController";
|
||||
export { StartPythonController } from "./StartPythonController";
|
||||
export { UiLanguageController } from "./UiLanguageController";
|
||||
export { ConfigPageCloseTriggerController } from "./ConfigPageCloseTriggerController";
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { useState, useEffect, useLayoutEffect, useRef } from "react";
|
||||
import styles from "./MessageInputBox.module.scss";
|
||||
import SendMessageSvg from "@images/send_message.svg?react";
|
||||
import { useMessage } from "@logics_common";
|
||||
import { useSendMessageButtonType, useEnableAutoClearMessageInputBox } from "@logics_configs";
|
||||
import { useMessageLogScroll } from "@logics_main";
|
||||
import { store } from "@store";
|
||||
import { appWindow } from "@tauri-apps/api/window";
|
||||
|
||||
export const MessageInputBox = () => {
|
||||
const [message_history, setMessageHistory] = useState([]);
|
||||
@@ -22,6 +24,12 @@ export const MessageInputBox = () => {
|
||||
|
||||
const { scrollToBottom } = useMessageLogScroll();
|
||||
|
||||
const log_box_ref = useRef(null);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
store.text_area_ref = log_box_ref;
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (currentMessageLogs.data) {
|
||||
const sentMessages = currentMessageLogs.data
|
||||
@@ -33,6 +41,7 @@ export const MessageInputBox = () => {
|
||||
|
||||
const onSubmitFunction = (e) => {
|
||||
e.preventDefault();
|
||||
appWindow.minimize();
|
||||
|
||||
if (!currentMessageInputValue.data.trim()) return updateMessageInputValue("");
|
||||
|
||||
@@ -90,6 +99,7 @@ export const MessageInputBox = () => {
|
||||
<div className={styles.container}>
|
||||
<div className={styles.message_box_wrapper}>
|
||||
<textarea
|
||||
ref={log_box_ref}
|
||||
className={styles.message_box_input_area}
|
||||
onChange={onChangeFunction}
|
||||
onBlur={stopTyping}
|
||||
|
||||
@@ -18,6 +18,7 @@ export const store = {
|
||||
config_page: null,
|
||||
setting_box_scroll_container: null,
|
||||
log_box_ref: null,
|
||||
text_area_ref: null,
|
||||
is_applied_init_message_box_height: false,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user