Add start with system option
This commit is contained in:
parent
887f11ab37
commit
f232defd1c
5 changed files with 76 additions and 5 deletions
42
src/main/autoStart.ts
Normal file
42
src/main/autoStart.ts
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0
|
||||||
|
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
|
||||||
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { app } from "electron";
|
||||||
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
||||||
|
import { join } from "path";
|
||||||
|
|
||||||
|
function makeAutoStartLinux() {
|
||||||
|
const dir = join(process.env.HOME!, ".config", "autostart");
|
||||||
|
const file = join(dir, "vencord.desktop");
|
||||||
|
|
||||||
|
return {
|
||||||
|
isEnabled: () => existsSync(file),
|
||||||
|
enable() {
|
||||||
|
const desktopFile = `
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Version=1.0
|
||||||
|
Name=Vencord
|
||||||
|
Comment=Vencord autostart script
|
||||||
|
Exec=${process.execPath}
|
||||||
|
Terminal=false
|
||||||
|
StartupNotify=false
|
||||||
|
`.trim();
|
||||||
|
|
||||||
|
mkdirSync(dir, { recursive: true });
|
||||||
|
writeFileSync(file, desktopFile);
|
||||||
|
},
|
||||||
|
disable: () => rmSync(file, { force: true })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const autoStartWindowsMac = {
|
||||||
|
isEnabled: () => app.getLoginItemSettings().openAtLogin,
|
||||||
|
enable: () => app.setLoginItemSettings({ openAtLogin: true }),
|
||||||
|
disable: () => app.setLoginItemSettings({ openAtLogin: false })
|
||||||
|
};
|
||||||
|
|
||||||
|
export const autoStart = process.platform === "linux" ? makeAutoStartLinux() : autoStartWindowsMac;
|
|
@ -11,6 +11,7 @@ import { join } from "path";
|
||||||
import { debounce } from "shared/utils/debounce";
|
import { debounce } from "shared/utils/debounce";
|
||||||
|
|
||||||
import { IpcEvents } from "../shared/IpcEvents";
|
import { IpcEvents } from "../shared/IpcEvents";
|
||||||
|
import { autoStart } from "./autoStart";
|
||||||
import { VENCORD_FILES_DIR, VENCORD_QUICKCSS_FILE } from "./constants";
|
import { VENCORD_FILES_DIR, VENCORD_QUICKCSS_FILE } from "./constants";
|
||||||
import { mainWin } from "./mainWindow";
|
import { mainWin } from "./mainWindow";
|
||||||
import { Settings } from "./settings";
|
import { Settings } from "./settings";
|
||||||
|
@ -39,6 +40,12 @@ ipcMain.on(IpcEvents.GET_VERSION, e => {
|
||||||
e.returnValue = app.getVersion();
|
e.returnValue = app.getVersion();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ipcMain.on(IpcEvents.AUTOSTART_ENABLED, e => {
|
||||||
|
e.returnValue = autoStart.isEnabled();
|
||||||
|
});
|
||||||
|
ipcMain.handle(IpcEvents.ENABLE_AUTOSTART, autoStart.enable);
|
||||||
|
ipcMain.handle(IpcEvents.DISABLE_AUTOSTART, autoStart.disable);
|
||||||
|
|
||||||
ipcMain.handle(IpcEvents.SET_SETTINGS, (_, settings: typeof Settings.store, path?: string) => {
|
ipcMain.handle(IpcEvents.SET_SETTINGS, (_, settings: typeof Settings.store, path?: string) => {
|
||||||
Settings.setData(settings, path);
|
Settings.setData(settings, path);
|
||||||
});
|
});
|
||||||
|
|
|
@ -15,6 +15,11 @@ export const VencordDesktopNative = {
|
||||||
relaunch: () => invoke<void>(IpcEvents.RELAUNCH),
|
relaunch: () => invoke<void>(IpcEvents.RELAUNCH),
|
||||||
getVersion: () => sendSync<void>(IpcEvents.GET_VERSION)
|
getVersion: () => sendSync<void>(IpcEvents.GET_VERSION)
|
||||||
},
|
},
|
||||||
|
autostart: {
|
||||||
|
isEnabled: () => sendSync<boolean>(IpcEvents.AUTOSTART_ENABLED),
|
||||||
|
enable: () => invoke<void>(IpcEvents.ENABLE_AUTOSTART),
|
||||||
|
disable: () => invoke<void>(IpcEvents.DISABLE_AUTOSTART)
|
||||||
|
},
|
||||||
fileManager: {
|
fileManager: {
|
||||||
showItemInFolder: (path: string) => invoke<void>(IpcEvents.SHOW_ITEM_IN_FOLDER, path),
|
showItemInFolder: (path: string) => invoke<void>(IpcEvents.SHOW_ITEM_IN_FOLDER, path),
|
||||||
selectVencordDir: () => invoke<LiteralUnion<"cancelled" | "invalid", string>>(IpcEvents.SELECT_VENCORD_DIR)
|
selectVencordDir: () => invoke<LiteralUnion<"cancelled" | "invalid", string>>(IpcEvents.SELECT_VENCORD_DIR)
|
||||||
|
|
|
@ -7,12 +7,15 @@
|
||||||
import "./settings.css";
|
import "./settings.css";
|
||||||
|
|
||||||
import { Margins } from "@vencord/types/utils";
|
import { Margins } from "@vencord/types/utils";
|
||||||
import { Button, Forms, Select, Switch, Text } from "@vencord/types/webpack/common";
|
import { Button, Forms, Select, Switch, Text, useState } from "@vencord/types/webpack/common";
|
||||||
import { useSettings } from "renderer/settings";
|
import { useSettings } from "renderer/settings";
|
||||||
|
|
||||||
export default function SettingsUi() {
|
export default function SettingsUi() {
|
||||||
const Settings = useSettings();
|
const Settings = useSettings();
|
||||||
|
|
||||||
|
const { autostart } = VencordDesktopNative;
|
||||||
|
const [autoStartEnabled, setAutoStartEnabled] = useState(autostart.isEnabled());
|
||||||
|
|
||||||
const switches: [keyof typeof Settings, string, string, boolean?, (() => boolean)?][] = [
|
const switches: [keyof typeof Settings, string, string, boolean?, (() => boolean)?][] = [
|
||||||
["tray", "Tray Icon", "Add a tray icon for Vencord Desktop", true],
|
["tray", "Tray Icon", "Add a tray icon for Vencord Desktop", true],
|
||||||
[
|
[
|
||||||
|
@ -58,6 +61,17 @@ export default function SettingsUi() {
|
||||||
|
|
||||||
<Forms.FormDivider className={Margins.top16 + " " + Margins.bottom16} />
|
<Forms.FormDivider className={Margins.top16 + " " + Margins.bottom16} />
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
value={autoStartEnabled}
|
||||||
|
onChange={async v => {
|
||||||
|
await autostart[v ? "enable" : "disable"]();
|
||||||
|
setAutoStartEnabled(v);
|
||||||
|
}}
|
||||||
|
note="Automatically start Vencord Desktop on computer start-up"
|
||||||
|
>
|
||||||
|
Start With System
|
||||||
|
</Switch>
|
||||||
|
|
||||||
{switches.map(([key, text, note, def, predicate]) => (
|
{switches.map(([key, text, note, def, predicate]) => (
|
||||||
<Switch
|
<Switch
|
||||||
value={(Settings[key as any] ?? def ?? false) && predicate?.() !== false}
|
value={(Settings[key as any] ?? def ?? false) && predicate?.() !== false}
|
||||||
|
|
|
@ -10,11 +10,12 @@ export const enum IpcEvents {
|
||||||
GET_RENDERER_SCRIPT = "VCD_GET_RENDERER_SCRIPT",
|
GET_RENDERER_SCRIPT = "VCD_GET_RENDERER_SCRIPT",
|
||||||
GET_RENDERER_CSS_FILE = "VCD_GET_RENDERER_CSS_FILE",
|
GET_RENDERER_CSS_FILE = "VCD_GET_RENDERER_CSS_FILE",
|
||||||
|
|
||||||
RELAUNCH = "VCD_RELAUNCH",
|
|
||||||
FOCUS = "VCD_FOCUS",
|
|
||||||
|
|
||||||
GET_VERSION = "VCD_GET_VERSION",
|
GET_VERSION = "VCD_GET_VERSION",
|
||||||
|
|
||||||
|
RELAUNCH = "VCD_RELAUNCH",
|
||||||
|
CLOSE = "VCD_CLOSE",
|
||||||
|
FOCUS = "VCD_FOCUS",
|
||||||
|
|
||||||
SHOW_ITEM_IN_FOLDER = "VCD_SHOW_ITEM_IN_FOLDER",
|
SHOW_ITEM_IN_FOLDER = "VCD_SHOW_ITEM_IN_FOLDER",
|
||||||
GET_SETTINGS = "VCD_GET_SETTINGS",
|
GET_SETTINGS = "VCD_GET_SETTINGS",
|
||||||
SET_SETTINGS = "VCD_SET_SETTINGS",
|
SET_SETTINGS = "VCD_SET_SETTINGS",
|
||||||
|
@ -27,5 +28,7 @@ export const enum IpcEvents {
|
||||||
|
|
||||||
SPELLCHECK_SET_LANGUAGES = "VCD_SPELLCHECK_SET_LANGUAGES",
|
SPELLCHECK_SET_LANGUAGES = "VCD_SPELLCHECK_SET_LANGUAGES",
|
||||||
|
|
||||||
CLOSE = "VCD_CLOSE"
|
AUTOSTART_ENABLED = "VCD_AUTOSTART_ENABLED",
|
||||||
|
ENABLE_AUTOSTART = "VCD_ENABLE_AUTOSTART",
|
||||||
|
DISABLE_AUTOSTART = "VCD_DISABLE_AUTOSTART"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue