Add Push To Talk binds

This commit is contained in:
Vendicated
2026-05-10 15:07:46 +02:00
parent 02f1e71e58
commit 797c02bdd0
3 changed files with 75 additions and 40 deletions
+1 -7
View File
@@ -6,7 +6,6 @@
import { app } from "electron"; import { app } from "electron";
import { basename } from "path"; import { basename } from "path";
import { ShortcutAction } from "renderer/globalShortcuts/ShortcutSettings";
import { stripIndent } from "shared/utils/text"; import { stripIndent } from "shared/utils/text";
import { parseArgs, ParseArgsOptionDescriptor } from "util"; import { parseArgs, ParseArgsOptionDescriptor } from "util";
@@ -48,12 +47,7 @@ const options = {
type: "string", type: "string",
description: description:
"Run a predefined shortcut action (for custom key binds). Vesktop has to be open for this to have any effect", "Run a predefined shortcut action (for custom key binds). Vesktop has to be open for this to have any effect",
options: [ argumentName: "action"
"toggleMute",
"toggleDeafen",
"toggleStreamerMode",
"disconnectFromVoiceChannel"
] satisfies Array<ShortcutAction>
} }
} satisfies Record<string, Option>; } satisfies Record<string, Option>;
@@ -30,9 +30,17 @@ const cl = classNameFactory("vcd-shortcuts-");
const ShortcutActions = { const ShortcutActions = {
unassigned: "Unassigned", unassigned: "Unassigned",
mute: "Mute",
unmute: "Unmute",
toggleMute: "Toggle Mute", toggleMute: "Toggle Mute",
toggleDeafen: "Toggle Deafen", toggleDeafen: "Toggle Deafen",
toggleStreamerMode: "Toggle Streamer Mode", toggleStreamerMode: "Toggle Streamer Mode",
pushToTalkNormalToggle: "Push-to-Talk (Normal) Toggle",
pushToTalkNormalStart: "Push-to-Talk (Normal) Start",
pushToTalkNormalStop: "Push-to-Talk (Normal) Stop",
pushToTalkPriorityToggle: "Push-to-Talk (Priority) Toggle",
pushToTalkPriorityStart: "Push-to-Talk (Priority) Start",
pushToTalkPriorityStop: "Push-to-Talk (Priority) Stop",
disconnectFromVoiceChannel: "Disconnect from VC" disconnectFromVoiceChannel: "Disconnect from VC"
} as const; } as const;
@@ -173,7 +181,7 @@ export function KeyBindSettings() {
export function openKeybindsModal() { export function openKeybindsModal() {
openModal(props => ( openModal(props => (
<ModalRoot {...props} size={ModalSize.MEDIUM}> <ModalRoot {...props} size={ModalSize.LARGE}>
<ModalHeader> <ModalHeader>
<BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}> <BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}>
Keybinds Keybinds
+65 -32
View File
@@ -5,51 +5,84 @@
*/ */
import { Logger } from "@vencord/types/utils"; import { Logger } from "@vencord/types/utils";
import { findByPropsLazy } from "@vencord/types/webpack"; import { waitFor } from "@vencord/types/webpack";
import { FluxDispatcher, StreamerModeStore } from "@vencord/types/webpack/common"; import { FluxDispatcher } from "@vencord/types/webpack/common";
import { ShortcutAction } from "./ShortcutSettings"; import { ShortcutAction } from "./ShortcutSettings";
const logger = new Logger("VesktopKeyBindHandler"); const logger = new Logger("VesktopKeyBindHandler");
const { selectVoiceChannel } = findByPropsLazy("selectVoiceChannel"); interface KeyBindAction {
onTrigger(...args: any[]): void;
isPressed?: boolean;
}
let KeyBindActions: Record<string, KeyBindAction>;
waitFor(["dispatch", "subscribe"], FluxDispatcher => {
FluxDispatcher.subscribe("KEYBINDS_REGISTER_GLOBAL_KEYBIND_ACTIONS", event => {
KeyBindActions = event.keybinds;
});
});
export function handleKeyBind(keyBind: ShortcutAction) { export function handleKeyBind(keyBind: ShortcutAction) {
logger.debug(`Handling key bind action: ${keyBind}`); logger.debug(`Handling key bind action: ${keyBind}`);
if (!KeyBindActions) {
logger.error("Failed to retrieve KeyBindActions, cannot handle key bind");
return;
}
switch (keyBind) { switch (keyBind) {
case "toggleMute":
FluxDispatcher.dispatch({
type: "AUDIO_TOGGLE_SELF_MUTE",
context: "default",
syncRemote: true,
playSoundEffect: true
});
break;
case "toggleDeafen":
FluxDispatcher.dispatch({
type: "AUDIO_TOGGLE_SELF_DEAF",
context: "default",
syncRemote: true
});
break;
case "toggleStreamerMode":
FluxDispatcher.dispatch({
type: "STREAMER_MODE_UPDATE",
key: "enabled",
value: !StreamerModeStore.enabled
});
break;
case "disconnectFromVoiceChannel":
selectVoiceChannel(null);
break;
case "unassigned": case "unassigned":
break; break;
case "mute":
case "unmute":
FluxDispatcher.dispatch({
type: "AUDIO_SET_SELF_MUTE",
context: "default",
syncRemote: true,
playSoundEffect: true,
mute: keyBind === "mute"
});
break;
case "toggleMute":
KeyBindActions.TOGGLE_MUTE.onTrigger();
break;
case "toggleDeafen":
KeyBindActions.TOGGLE_DEAFEN.onTrigger();
break;
case "toggleStreamerMode":
KeyBindActions.TOGGLE_STREAMER_MODE.onTrigger();
break;
case "disconnectFromVoiceChannel":
KeyBindActions.DISCONNECT_FROM_VOICE_CHANNEL.onTrigger();
break;
case "pushToTalkNormalStart":
case "pushToTalkNormalStop":
case "pushToTalkNormalToggle": {
const isPressed = keyBind.includes("Toggle")
? !KeyBindActions.PUSH_TO_TALK.isPressed
: keyBind.includes("Start");
KeyBindActions.PUSH_TO_TALK.onTrigger(isPressed, "default");
break;
}
case "pushToTalkPriorityStart":
case "pushToTalkPriorityStop":
case "pushToTalkPriorityToggle": {
const isPressed = keyBind.includes("Toggle")
? !KeyBindActions.PUSH_TO_TALK_PRIORITY.isPressed
: keyBind.includes("Start");
KeyBindActions.PUSH_TO_TALK_PRIORITY.onTrigger(isPressed, "default");
break;
}
default: default:
logger.warn(`Unknown key bind action: ${keyBind}`); logger.warn(`Unknown key bind action: ${keyBind}`);
} }