parent
b3b2812d36
commit
c8bcc40c58
@ -0,0 +1,82 @@ |
||||
/* |
||||
* SPDX-License-Identifier: GPL-3.0 |
||||
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||
*/ |
||||
|
||||
import { ipcRenderer } from "electron"; |
||||
import type { Settings } from "shared/settings"; |
||||
import type { LiteralUnion } from "type-fest"; |
||||
|
||||
import { IpcEvents } from "../shared/IpcEvents"; |
||||
import { invoke, sendSync } from "./typedIpc"; |
||||
|
||||
type SpellCheckerResultCallback = (word: string, suggestions: string[]) => void; |
||||
|
||||
const spellCheckCallbacks = new Set<SpellCheckerResultCallback>(); |
||||
|
||||
ipcRenderer.on(IpcEvents.SPELLCHECK_RESULT, (_, w: string, s: string[]) => { |
||||
spellCheckCallbacks.forEach(cb => cb(w, s)); |
||||
}); |
||||
|
||||
export const VesktopNative = { |
||||
app: { |
||||
relaunch: () => invoke<void>(IpcEvents.RELAUNCH), |
||||
getVersion: () => sendSync<void>(IpcEvents.GET_VERSION), |
||||
setBadgeCount: (count: number) => invoke<void>(IpcEvents.SET_BADGE_COUNT, count), |
||||
supportsWindowsTransparency: () => sendSync<boolean>(IpcEvents.SUPPORTS_WINDOWS_TRANSPARENCY) |
||||
}, |
||||
autostart: { |
||||
isEnabled: () => sendSync<boolean>(IpcEvents.AUTOSTART_ENABLED), |
||||
enable: () => invoke<void>(IpcEvents.ENABLE_AUTOSTART), |
||||
disable: () => invoke<void>(IpcEvents.DISABLE_AUTOSTART) |
||||
}, |
||||
fileManager: { |
||||
showItemInFolder: (path: string) => invoke<void>(IpcEvents.SHOW_ITEM_IN_FOLDER, path), |
||||
selectVencordDir: () => invoke<LiteralUnion<"cancelled" | "invalid", string>>(IpcEvents.SELECT_VENCORD_DIR) |
||||
}, |
||||
settings: { |
||||
get: () => sendSync<Settings>(IpcEvents.GET_SETTINGS), |
||||
set: (settings: Settings, path?: string) => invoke<void>(IpcEvents.SET_SETTINGS, settings, path) |
||||
}, |
||||
spellcheck: { |
||||
setLanguages: (languages: readonly string[]) => invoke<void>(IpcEvents.SPELLCHECK_SET_LANGUAGES, languages), |
||||
onSpellcheckResult(cb: SpellCheckerResultCallback) { |
||||
spellCheckCallbacks.add(cb); |
||||
}, |
||||
offSpellcheckResult(cb: SpellCheckerResultCallback) { |
||||
spellCheckCallbacks.delete(cb); |
||||
}, |
||||
replaceMisspelling: (word: string) => invoke<void>(IpcEvents.SPELLCHECK_REPLACE_MISSPELLING, word), |
||||
addToDictionary: (word: string) => invoke<void>(IpcEvents.SPELLCHECK_ADD_TO_DICTIONARY, word) |
||||
}, |
||||
win: { |
||||
focus: () => invoke<void>(IpcEvents.FOCUS), |
||||
close: (key?: string) => invoke<void>(IpcEvents.CLOSE, key), |
||||
minimize: () => invoke<void>(IpcEvents.MINIMIZE), |
||||
maximize: () => invoke<void>(IpcEvents.MAXIMIZE) |
||||
}, |
||||
capturer: { |
||||
getLargeThumbnail: (id: string) => invoke<string>(IpcEvents.CAPTURER_GET_LARGE_THUMBNAIL, id) |
||||
}, |
||||
/** only available on Linux. */ |
||||
virtmic: { |
||||
list: () => |
||||
invoke< |
||||
{ ok: false; isGlibCxxOutdated: boolean } | { ok: true; targets: string[]; hasPipewirePulse: boolean } |
||||
>(IpcEvents.VIRT_MIC_LIST), |
||||
start: (targets: string[], workaround?: boolean) => invoke<void>(IpcEvents.VIRT_MIC_START, targets, workaround), |
||||
startSystem: (workaround?: boolean, onlyDefaultSpeakers?: boolean) => |
||||
invoke<void>(IpcEvents.VIRT_MIC_START_SYSTEM, workaround, onlyDefaultSpeakers), |
||||
stop: () => invoke<void>(IpcEvents.VIRT_MIC_STOP) |
||||
}, |
||||
arrpc: { |
||||
onActivity(cb: (data: string) => void) { |
||||
ipcRenderer.on(IpcEvents.ARRPC_ACTIVITY, (_, data: string) => cb(data)); |
||||
} |
||||
}, |
||||
clipboard: { |
||||
copyImage: (imageBuffer: Uint8Array, imageSrc: string) => |
||||
invoke<void>(IpcEvents.CLIPBOARD_COPY_IMAGE, imageBuffer, imageSrc) |
||||
} |
||||
}; |
@ -0,0 +1,44 @@ |
||||
/* |
||||
* SPDX-License-Identifier: GPL-3.0 |
||||
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||
*/ |
||||
|
||||
import { contextBridge, ipcRenderer, webFrame } from "electron"; |
||||
import { readFileSync, watch } from "fs"; |
||||
|
||||
import { IpcEvents } from "../shared/IpcEvents"; |
||||
import { VesktopNative } from "./VesktopNative"; |
||||
|
||||
contextBridge.exposeInMainWorld("VesktopNative", VesktopNative); |
||||
|
||||
require(ipcRenderer.sendSync(IpcEvents.GET_VENCORD_PRELOAD_FILE)); |
||||
|
||||
webFrame.executeJavaScript(ipcRenderer.sendSync(IpcEvents.GET_VENCORD_RENDERER_SCRIPT)); |
||||
webFrame.executeJavaScript(ipcRenderer.sendSync(IpcEvents.GET_RENDERER_SCRIPT)); |
||||
|
||||
// #region css
|
||||
const rendererCss = ipcRenderer.sendSync(IpcEvents.GET_RENDERER_CSS_FILE); |
||||
|
||||
const style = document.createElement("style"); |
||||
style.id = "vcd-css-core"; |
||||
style.textContent = readFileSync(rendererCss, "utf-8"); |
||||
|
||||
if (document.readyState === "complete") { |
||||
document.documentElement.appendChild(style); |
||||
} else { |
||||
document.addEventListener("DOMContentLoaded", () => document.documentElement.appendChild(style), { |
||||
once: true |
||||
}); |
||||
} |
||||
|
||||
if (IS_DEV) { |
||||
// persistent means keep process running if watcher is the only thing still running
|
||||
// which we obviously don't want
|
||||
watch(rendererCss, { persistent: false }, () => { |
||||
document.getElementById("vcd-css-core")!.textContent = readFileSync(rendererCss, "utf-8"); |
||||
}); |
||||
} |
||||
// #endregion
|
||||
|
||||
VesktopNative.spellcheck.setLanguages(window.navigator.languages); |
@ -0,0 +1,16 @@ |
||||
/* |
||||
* SPDX-License-Identifier: GPL-3.0 |
||||
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||
*/ |
||||
|
||||
import { ipcRenderer } from "electron"; |
||||
import { IpcEvents } from "shared/IpcEvents"; |
||||
|
||||
export function invoke<T = any>(event: IpcEvents, ...args: any[]) { |
||||
return ipcRenderer.invoke(event, ...args) as Promise<T>; |
||||
} |
||||
|
||||
export function sendSync<T = any>(event: IpcEvents, ...args: any[]) { |
||||
return ipcRenderer.sendSync(event, ...args) as T; |
||||
} |
Loading…
Reference in new issue