mirror of
https://github.com/Vencord/Vesktop.git
synced 2025-02-24 06:05:09 +00:00
Add all available actions to globalshortcuts on startup
This commit is contained in:
parent
f79ee94301
commit
0114f8efa4
4 changed files with 84 additions and 5 deletions
|
@ -10,7 +10,7 @@ import { STATIC_DIR } from "shared/paths";
|
||||||
import type { Venbind as VenbindType } from "venbind";
|
import type { Venbind as VenbindType } from "venbind";
|
||||||
|
|
||||||
import { mainWin } from "./mainWindow";
|
import { mainWin } from "./mainWindow";
|
||||||
import { handle } from "./utils/ipcWrappers";
|
import { handle, handleSync } from "./utils/ipcWrappers";
|
||||||
|
|
||||||
let venbind: VenbindType | null = null;
|
let venbind: VenbindType | null = null;
|
||||||
export function obtainVenbind() {
|
export function obtainVenbind() {
|
||||||
|
@ -50,7 +50,7 @@ export function obtainVenbind() {
|
||||||
|
|
||||||
export function startVenbind() {
|
export function startVenbind() {
|
||||||
const venbind = obtainVenbind();
|
const venbind = obtainVenbind();
|
||||||
venbind?.startKeybinds(null, x => {
|
venbind?.startKeybinds(x => {
|
||||||
mainWin.webContents.executeJavaScript(`Vesktop.keybindCallbacks[${x}](false)`);
|
mainWin.webContents.executeJavaScript(`Vesktop.keybindCallbacks[${x}](false)`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -61,3 +61,17 @@ handle(IpcEvents.KEYBIND_REGISTER, (_, id: number, shortcut: string, options: an
|
||||||
handle(IpcEvents.KEYBIND_UNREGISTER, (_, id: number) => {
|
handle(IpcEvents.KEYBIND_UNREGISTER, (_, id: number) => {
|
||||||
obtainVenbind()?.unregisterKeybind(id);
|
obtainVenbind()?.unregisterKeybind(id);
|
||||||
});
|
});
|
||||||
|
handleSync(IpcEvents.KEYBIND_SHOULD_PREREGISTER, _ => {
|
||||||
|
if (
|
||||||
|
process.platform === "linux" &&
|
||||||
|
(process.env.XDG_SESSION_TYPE === "wayland" ||
|
||||||
|
!!process.env.WAYLAND_DISPLAY ||
|
||||||
|
!!process.env.VENBIND_USE_XDG_PORTAL)
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
handle(IpcEvents.KEYBIND_PREREGISTER, (_, actions: { id: number; name: string }[]) => {
|
||||||
|
obtainVenbind()?.preregisterKeybinds(actions);
|
||||||
|
});
|
||||||
|
|
|
@ -82,6 +82,8 @@ export const VesktopNative = {
|
||||||
keybind: {
|
keybind: {
|
||||||
register: (id: number, shortcut: string, options: any) =>
|
register: (id: number, shortcut: string, options: any) =>
|
||||||
invoke<void>(IpcEvents.KEYBIND_REGISTER, id, shortcut),
|
invoke<void>(IpcEvents.KEYBIND_REGISTER, id, shortcut),
|
||||||
unregister: (id: number) => invoke<void>(IpcEvents.KEYBIND_UNREGISTER, id)
|
unregister: (id: number) => invoke<void>(IpcEvents.KEYBIND_UNREGISTER, id),
|
||||||
|
shouldPreRegister: () => sendSync<boolean>(IpcEvents.KEYBIND_SHOULD_PREREGISTER),
|
||||||
|
preRegister: (actions: { id: number; name: string }[]) => invoke<void>(IpcEvents.KEYBIND_PREREGISTER, actions)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,7 +9,18 @@ import { keybindCallbacks } from "renderer";
|
||||||
|
|
||||||
import { addPatch } from "./shared";
|
import { addPatch } from "./shared";
|
||||||
const toShortcutString = findByCodeLazy('return"gamepad".');
|
const toShortcutString = findByCodeLazy('return"gamepad".');
|
||||||
|
const actionReadableNames: { [key: string]: string } = {
|
||||||
|
PUSH_TO_TALK: "Push To Talk",
|
||||||
|
PUSH_TO_TALK_PRIORITY: "Push To Talk (Priority)",
|
||||||
|
PUSH_TO_MUTE: "Push To Mute",
|
||||||
|
TOGGLE_MUTE: "Toggle Mute",
|
||||||
|
TOGGLE_DEAFEN: "Toggle Deafen",
|
||||||
|
TOGGLE_VOICE_MODE: "Toggle Voice Activity Mode",
|
||||||
|
TOGGLE_STREAMER_MODE: "Toggle Streamer Mode",
|
||||||
|
NAVIGATE_BACK: "Navigate Back",
|
||||||
|
NAVIGATE_FORWARD: "Navigate Forward",
|
||||||
|
DISCONNECT_FROM_VOICE_CHANNEL: "Disconnect From Voice Channel"
|
||||||
|
};
|
||||||
addPatch({
|
addPatch({
|
||||||
patches: [
|
patches: [
|
||||||
{
|
{
|
||||||
|
@ -45,17 +56,66 @@ addPatch({
|
||||||
// eslint-disable-next-line no-useless-escape
|
// eslint-disable-next-line no-useless-escape
|
||||||
match: /inputEventUnregister\((parseInt\(\i,10\))\);else/,
|
match: /inputEventUnregister\((parseInt\(\i,10\))\);else/,
|
||||||
replace: "$&{$self.unregisterKeybind($1);return;}"
|
replace: "$&{$self.unregisterKeybind($1);return;}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
match: /let{keybinds:(\i)}=\i;/,
|
||||||
|
replace: "$&$self.preRegisterKeybinds($1);"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
registerKeybind: function (id, shortcut, callback, options) {
|
registerKeybind: function (id, shortcut, callback, options) {
|
||||||
|
if (VesktopNative.keybind.shouldPreRegister()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
keybindCallbacks[id] = callback;
|
keybindCallbacks[id] = callback;
|
||||||
VesktopNative.keybind.register(id, toShortcutString(shortcut), options);
|
VesktopNative.keybind.register(id, toShortcutString(shortcut), options);
|
||||||
},
|
},
|
||||||
unregisterKeybind: function (id) {
|
unregisterKeybind: function (id) {
|
||||||
|
if (VesktopNative.keybind.shouldPreRegister()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
delete keybindCallbacks[id];
|
delete keybindCallbacks[id];
|
||||||
VesktopNative.keybind.unregister(id);
|
VesktopNative.keybind.unregister(id);
|
||||||
|
},
|
||||||
|
// only used for wayland/xdg-desktop-portal globalshortcuts
|
||||||
|
preRegisterKeybinds: function (allActions: {
|
||||||
|
[action: string]: {
|
||||||
|
onTrigger: Function;
|
||||||
|
};
|
||||||
|
}) {
|
||||||
|
let actions: { id: number; name: string }[] = [];
|
||||||
|
if (!VesktopNative.keybind.shouldPreRegister()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let id = 1;
|
||||||
|
Object.entries(allActions).forEach(([key, val]) => {
|
||||||
|
if (
|
||||||
|
[
|
||||||
|
"UNASSIGNED",
|
||||||
|
"SWITCH_TO_VOICE_CHANNEL",
|
||||||
|
"TOGGLE_OVERLAY",
|
||||||
|
"TOGGLE_OVERLAY_INPUT_LOCK",
|
||||||
|
"TOGGLE_PRIORITY_SPEAKER",
|
||||||
|
"OVERLAY_ACTIVATE_REGION_TEXT_WIDGET",
|
||||||
|
"TOGGLE_GO_LIVE_STREAMING", // ???
|
||||||
|
"SOUNDBOARD",
|
||||||
|
"SOUNDBOARD_HOLD",
|
||||||
|
"SAVE_CLIP"
|
||||||
|
// most of these aren't available to change through discord as far as i can tell
|
||||||
|
].includes(key)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// the second argument in onTrigger seems to hold some context in some specific actions
|
||||||
|
// as far as i can tell these are the only actions that use it: push to talk (except it doesn't seem to do anything there??)
|
||||||
|
// and switch to voice channel which requires a channel parameter which is provided through discord's ui
|
||||||
|
// except we can't really provide that with xdp so i'll just skip it for now
|
||||||
|
keybindCallbacks[id] = (keyState: boolean) => val.onTrigger(keyState, undefined);
|
||||||
|
actions.push({ id, name: actionReadableNames[key] });
|
||||||
|
id++;
|
||||||
|
});
|
||||||
|
VesktopNative.keybind.preRegister(actions);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -51,6 +51,9 @@ export const enum IpcEvents {
|
||||||
ARRPC_ACTIVITY = "VCD_ARRPC_ACTIVITY",
|
ARRPC_ACTIVITY = "VCD_ARRPC_ACTIVITY",
|
||||||
|
|
||||||
CLIPBOARD_COPY_IMAGE = "VCD_CLIPBOARD_COPY_IMAGE",
|
CLIPBOARD_COPY_IMAGE = "VCD_CLIPBOARD_COPY_IMAGE",
|
||||||
|
|
||||||
KEYBIND_REGISTER = "VCD_KEYBIND_REGISTER",
|
KEYBIND_REGISTER = "VCD_KEYBIND_REGISTER",
|
||||||
KEYBIND_UNREGISTER = "VCD_KEYBIND_UNREGISTER"
|
KEYBIND_UNREGISTER = "VCD_KEYBIND_UNREGISTER",
|
||||||
|
KEYBIND_SHOULD_PREREGISTER = "VCD_KEYBIND_SHOULD_PREREGISTER",
|
||||||
|
KEYBIND_PREREGISTER = "VCD_KEYBIND_PREREGISTER"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue