Compare commits

..

No commits in common. "3ed5fca353fd148a95a9e16c65e3152b6d9663c8" and "e9a95d4c751d24cf0d8f68267b2e92de0b9e1e24" have entirely different histories.

24 changed files with 903 additions and 914 deletions

View file

@ -52,8 +52,8 @@
"settings-csp-desc": "Legcord CSP ist unser System, der das Laden von benutzerdefinierten Inhalten in die Discord-App verwaltet. Dinge wie Client-Mods und Designs hängen davon ab. Deaktivieren Sie es, wenn Sie Mods und benutzerdefinierte Stile entfernen möchten.",
"settings-mintoTray": "Im Hintergrund arbeiten",
"settings-mintoTray-desc": "Wenn diese Option deaktiviert ist, wird Legcord wie jedes andere Fenster geschlossen, wenn es geschlossen wird. Andernfalls bleibt es in Ihrer Taskleiste für später gespeichert.",
"settings-startMinimized": "Startfenster",
"settings-startMinimized-desc": "Legt fest, wie Legcord beim Start erscheint. Tray-Modus blendet das Fenster vollständig aus (Tray-Symbol muss aktiviert sein).",
"settings-startMinimized": "Minimiert starten",
"settings-startMinimized-desc": "Legcord startet im Hintergrund und bleibt Ihnen nicht im Weg.",
"settings-useSystemCssEditor": "System-CSS-Editor verwenden",
"settings-useSystemCssEditor-desc": "Verwenden Sie den System-CSS-Editor, um CSS zu bearbeiten.",
"settings-MultiInstance": "Mehrfachinstanz",
@ -243,8 +243,5 @@
"settings-csp-vanilla": "Vanilla",
"settings-firstTimeCrash": "Wir richten Dinge für sie ein!",
"settings-automaticClientUpdates": "Automatische client updates",
"settings-automaticClientUpdates-desc": "Deaktiviert automatische Legcord Updates",
"settings-startMinimized-off": "Normal",
"settings-startMinimized-minimized": "Minimiert in die Taskleiste",
"settings-startMinimized-tray": "Im Tray versteckt"
"settings-automaticClientUpdates-desc": "Deaktiviert automatische Legcord Updates"
}

View file

@ -57,11 +57,8 @@
"settings-openCustomIconDialog": "Set desktop icon",
"settings-mintoTray": "Work in background",
"settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax in your system tray for later.",
"settings-startMinimized": "Startup window",
"settings-startMinimized-desc": "Choose how Legcord appears when it launches. Tray mode hides the window completely (needs a tray icon enabled).",
"settings-startMinimized-off": "Normal",
"settings-startMinimized-minimized": "Minimized to taskbar",
"settings-startMinimized-tray": "Hidden in tray",
"settings-startMinimized": "Start minimized",
"settings-startMinimized-desc": "Legcord starts in background and remains out of your way.",
"settings-csp": "Content Security Policy",
"settings-csp-desc": "Set the strictness of Legcord's Content Security Policy. Strict CSP provides better security but may cause compatibility issues with some client mods/themes/plugins.",
"settings-csp-strict": "Strict",

View file

@ -52,8 +52,8 @@
"settings-csp-desc": "Legcord CSP es nuestro sistema que gestiona la carga de contenido personalizado en la aplicación Discord. Elementos como los mods y los temas del cliente dependen de él. Desactívalo si quieres deshacerte de los mods y los estilos personalizados.",
"settings-mintoTray": "Trabajar en segundo plano",
"settings-mintoTray-desc": "Cuando está desactivado, Legcord se cerrará como cualquier otra ventana al cerrarlo; de lo contrario, permanecerá en la bandeja del sistema para su uso posterior.",
"settings-startMinimized": "Ventana al iniciar",
"settings-startMinimized-desc": "Elige cómo aparece Legcord al iniciar. El modo bandeja oculta la ventana por completo (hace falta el icono de bandeja).",
"settings-startMinimized": "Iniciar minimizado",
"settings-startMinimized-desc": "Legcord se inicia en segundo plano y no interfiere en tu trabajo.",
"settings-useSystemCssEditor": "Utilizar el editor CSS del sistema",
"settings-useSystemCssEditor-desc": "Utilice el editor CSS del sistema para editar CSS.",
"settings-MultiInstance": "Múltiples instancias",
@ -304,8 +304,5 @@
"games-application": "Aplicación",
"settings-vaapi": "VAAPI",
"settings-vaapi-desc": "Utiliza VAAPI (aceleración por hardware) para la decodificación de vídeo en Linux. Esto reduce considerablemente el uso de la CPU durante el uso compartido de pantalla, pero puede causar problemas en algunos sistemas. Desactívalo si experimentas bloqueos o pantallas en negro durante el uso compartido de pantalla.",
"settings-material": "Material de Ventana",
"settings-startMinimized-off": "Normal",
"settings-startMinimized-minimized": "Minimizada en la barra de tareas",
"settings-startMinimized-tray": "Oculta en la bandeja"
"settings-material": "Material de Ventana"
}

View file

@ -36,7 +36,7 @@
"settings-audio-loopback": "Loopback",
"settings-audio-loopbackWithMute": "Loopback avec sourdine",
"settings-openCustomIconDialog": "Définir une icône de bureau",
"settings-startMinimized-desc": "Choisit comment Legcord apparaît au lancement. Le mode tray masque complètement la fenêtre (icône de tray requise).",
"settings-startMinimized-desc": "Legcord démarre en arrière-plan sans vous déranger.",
"settings-useSystemCssEditor": "Utiliser l'éditeur CSS du système",
"settings-useSystemCssEditor-desc": "Utiliser l'éditeur CSS du système pour modifier le CSS.",
"settings-MultiInstance": "Multi-instances",
@ -109,7 +109,7 @@
"settings-csp-desc": "Legcord CSP est notre système qui gère le chargement du contenu personnalisé dans l'application Discord. Des éléments tels que les mods et les thèmes en dépendent. Désactivez-le si vous souhaitez vous débarrasser des mods et des styles personnalisés.",
"settings-mintoTray": "Actif en arrière-plan",
"settings-mintoTray-desc": "Si désactivé, Legcord se fermera comme n'importe quelle autre fenêtre, sinon il restera actif dans la barre d'état pour plus tard.",
"settings-startMinimized": "Fenêtre au démarrage",
"settings-startMinimized": "Démarrer en mode minimisé",
"settings-noBundleUpdates": "Pas de mises à jour",
"settings-noBundleUpdates-desc": "Désactive les mises à jour automatique des mods.",
"settings-mobileMode-desc": "Si vous êtes sur un appareil doté d'un écran tactile cette fonctionnalité est faite pour vous! Elle active le mode mobile caché de Discord conçu pour les téléphones et tablettes. La seule fonction majeure manquante est le tchat vocal. Idéal pour les utilisateurs de PinePhone ou équivalents.",
@ -344,8 +344,5 @@
"supportBanner-title": "Soutenir le projet",
"supportBanner-subtitle": "Aidez-nous à continuer le développement de Legcord. Votre soutien permet de maintenir le projet en vie et nous permet de proposer plus de fonctionnalités.",
"supportBanner-donate": "Faire un don",
"keybind-enabled": "Activé",
"settings-startMinimized-off": "Normale",
"settings-startMinimized-minimized": "Réduite dans la barre des tâches",
"settings-startMinimized-tray": "Masquée dans le tray"
"keybind-enabled": "Activé"
}

View file

@ -51,8 +51,8 @@
"settings-csp-desc": "Állítsd be a Legcord tartalombiztonsági szabályzatának szigorúságát. A szigorú CSP jobb biztonságot nyújt, de kompatibilitási problémákat okozhat egyes kliens modokkal/témákkal/bővítményekkel.",
"settings-mintoTray": "Futás a háttérben",
"settings-mintoTray-desc": "Ha le van tiltva, a Legcord a többi ablakhoz hasonlóan bezáródik, különben csak a tálcára csukódik le.",
"settings-startMinimized": "Induló ablak",
"settings-startMinimized-desc": "Meghatározza, hogyan jelenik meg a Legcord indításkor. A tálca mód teljesen elrejti az ablakot (tálcaikon szükséges).",
"settings-startMinimized": "Kisablakos indítás",
"settings-startMinimized-desc": "A Legcord a háttérben indul el, és nem zavar.",
"settings-useSystemCssEditor": "Használja a rendszer CSS-szerkesztőjét",
"settings-useSystemCssEditor-desc": "A CSS szerkesztéséhez használja a rendszer CSS-szerkesztőjét.",
"settings-MultiInstance": "Több példány",
@ -351,8 +351,5 @@
"settings-csp-none": "Egyik sem",
"keybind-openSettings": "Beállítások megnyitása",
"settings-firstTimeCrash": "Mindent előkészítünk számodra!",
"settings-firstTimeCrash-desc": "Az első indításkor a beállítások még nem érhetők el. Kérjük, használd az alábbi gombot az újraindításhoz, és a beállítások az újraindítás után már elérhetőek lesznek.",
"settings-startMinimized-off": "Normál",
"settings-startMinimized-minimized": "Kis méretű a tálcán",
"settings-startMinimized-tray": "Elrejtve a rendszertálcán"
"settings-firstTimeCrash-desc": "Az első indításkor a beállítások még nem érhetők el. Kérjük, használd az alábbi gombot az újraindításhoz, és a beállítások az újraindítás után már elérhetőek lesznek."
}

View file

@ -52,8 +52,8 @@
"settings-csp-desc": "Atur tingkat keketatan Kebijakan Keamanan Konten Legcord. CSP ketat memberikan keamanan lebih baik tetapi dapat menyebabkan masalah kompatibilitas dengan beberapa mod/tema/plugin klien.",
"settings-mintoTray": "Bekerja di latar belakang",
"settings-mintoTray-desc": "Ketika dinonaktifkan, Legcord akan ditutup seperti jendela lainnya saat ditutup, sedangkan jika tidak, ia akan tetap berada di area sistem tray Anda untuk digunakan nanti.",
"settings-startMinimized": "Jendela saat mulai",
"settings-startMinimized-desc": "Pilih bagaimana Legcord muncul saat diluncurkan. Mode tray menyembunyikan jendela sepenuhnya (ikon tray harus diaktifkan).",
"settings-startMinimized": "Mulai dalam mode minimized",
"settings-startMinimized-desc": "Legcord berjalan di latar belakang dan tidak mengganggu Anda.",
"settings-useSystemCssEditor": "Gunakan editor CSS sistem",
"settings-useSystemCssEditor-desc": "Gunakan editor CSS sistem untuk mengedit CSS.",
"settings-MultiInstance": "Multi Instans",
@ -348,8 +348,5 @@
"backup-restoreDoneBody": "Data Anda telah dipulihkan. Mulai ulang Legcord agar semua perubahan berlaku.",
"supportBanner-title": "Dukung Proyek",
"supportBanner-subtitle": "Bantu kami terus mengembangkan Legcord. Dukungan Anda menjaga proyek tetap hidup dan memungkinkan kami menghadirkan lebih banyak fitur.",
"supportBanner-donate": "Donasi",
"settings-startMinimized-off": "Normal",
"settings-startMinimized-minimized": "Diminimalkan ke bilah tugas",
"settings-startMinimized-tray": "Tersembunyi di tray"
"supportBanner-donate": "Donasi"
}

View file

@ -100,8 +100,8 @@
"settings-csp-desc": "\"Legcord CSP\" é o nosso sistema que cuida do carregamento de conteúdo customizado dentro do cliente do DIscord. Coisas como modificações e temas dependem desse sistema. Desabilite se quiser se livrar de modificações e estilos customizados.",
"settings-mintoTray": "Funcionar em segundo plano",
"settings-mintoTray-desc": "Quando desabilitado, Legcord será fechado como qualquer outra janela, do contrário, ele funcionará em segundo plano e ficará na bandeja do sistema disponível a qualquer momento.",
"settings-startMinimized": "Janela ao iniciar",
"settings-startMinimized-desc": "Escolha como o Legcord aparece ao iniciar. O modo bandeja oculta a janela por completo (é preciso o ícone da bandeja).",
"settings-startMinimized": "Abrir minimizado",
"settings-startMinimized-desc": "Legcord inicia em segundo plano e fica fora do seu caminho.",
"settings-useSystemCssEditor": "Usar editor de estilo (CSS) do sistema",
"settings-useSystemCssEditor-desc": "Usar editor de estilo padrão do sistema para editar CSS.",
"settings-MultiInstance": "Múltiplas instâncias",
@ -250,8 +250,5 @@
"setup-trayEnableDesc": "Mostrar o Legcord na bandeja do sistema",
"setup-trayDisableTitle": "Desabilitar ícone de bandeja",
"setup-trayDisableDesc": "Não mostrar o Legcord na bandeja do sistema",
"setup-finishTitle": "Você está pronto!",
"settings-startMinimized-off": "Normal",
"settings-startMinimized-minimized": "Minimizado na barra de tarefas",
"settings-startMinimized-tray": "Oculto na bandeja"
"setup-finishTitle": "Você está pronto!"
}

View file

@ -135,8 +135,8 @@
"settings-openCustomIconDialog": "Definir ícone de desktop",
"settings-mintoTray": "Funcionar em segundo plano",
"settings-mintoTray-desc": "Quando desativado, Legcord será fechado como qualquer outra janela, do contrário, ele funcionará em segundo plano e ficará na bandeja do sistema disponível a qualquer momento.",
"settings-startMinimized": "Janela ao iniciar",
"settings-startMinimized-desc": "Escolha como o Legcord aparece ao iniciar. O modo tabuleiro oculta a janela por completo (é preciso o ícone do tabuleiro).",
"settings-startMinimized": "Abrir minimizado",
"settings-startMinimized-desc": "Legcord inicia em segundo plano e fica fora do seu caminho.",
"settings-csp-none": "Nenhum",
"settings-useSystemCssEditor": "Usar editor de estilo (CSS) do sistema",
"settings-useSystemCssEditor-desc": "Usar editor de estilo padrão do sistema para editar CSS.",
@ -351,8 +351,5 @@
"backup-restoreDoneTitle": "Restauração completa",
"backup-restoreDoneBody": "Os seus dados foram restaurados. Reinicie o Legcord para que todas as mudanças tomem efeito.",
"supportBanner-title": "Suportar o Projeto",
"supportBanner-subtitle": "Ajude-nos a continuar a desenvolver o Legcord. O seu suporte mantém o projeto vivo e permite-nos introduzir mais funcionalidades.",
"settings-startMinimized-off": "Normal",
"settings-startMinimized-minimized": "Minimizado na barra de tarefas",
"settings-startMinimized-tray": "Oculto no tabuleiro"
"supportBanner-subtitle": "Ajude-nos a continuar a desenvolver o Legcord. O seu suporte mantém o projeto vivo e permite-nos introduzir mais funcionalidades."
}

View file

@ -52,8 +52,8 @@
"settings-openCustomIconDialog": "Выберите иконку рабочего стола",
"settings-mintoTray": "Работа в фоне",
"settings-mintoTray-desc": "При выключенной настройке, закрытие окна будет полностью закрывать Legcord, а при включённой, Legcord просто пойдёт отдыхать в ваш системный трей.",
"settings-startMinimized": "Окно при запуске",
"settings-startMinimized-desc": "Как Legcord появляется при запуске. Режим трея полностью скрывает окно (нужна иконка в трее).",
"settings-startMinimized": "Запуск в свёрнутом виде",
"settings-startMinimized-desc": "Legcord всегда будет запускаться в фоне, чтобы не мешать вам.",
"settings-csp": "Политика Защиты Данных (CSP)",
"settings-csp-desc": "Установите строгость защиты данных в Legcord. Строгий режим CSP безопаснее, но может быть несовместим с некоторыми модами/темами/плагинами.",
"settings-csp-strict": "Строгий",
@ -221,8 +221,5 @@
"settings-trayIcon-black-plug": "Чёрный Штекер",
"settings-trayIcon-black-plug-alt": "Чёрный Штекер (Альт.)",
"settings-category-behaviour": "Поведение",
"menu-quit": "Выход",
"settings-startMinimized-off": "Обычный",
"settings-startMinimized-minimized": "Свёрнуто в панель задач",
"settings-startMinimized-tray": "Скрыто в трее"
"menu-quit": "Выход"
}

View file

@ -52,8 +52,8 @@
"settings-csp-desc": "Legcord CSP це наша система, яка керує завантаженням користувацького контенту в додаток Discord. Від неї залежать такі речі, як клієнтські моди та теми. Вимкніть, якщо хочете позбутися модів та користувацьких стилів.",
"settings-mintoTray": "Робота у фоновому режимі",
"settings-mintoTray-desc": "Якщо вимкнено, Legcord закриється, як і будь-яке інше вікно, якщо його закрити, інакше він залишиться в системному треї на потім.",
"settings-startMinimized": "Вікно при запуску",
"settings-startMinimized-desc": "Як Legcord з’являється під час запуску. Режим трея повністю ховає вікно (потрібна іконка в треї).",
"settings-startMinimized": "Почати згорнутий",
"settings-startMinimized-desc": "Легкорд починається на задньому плані та залишається поза вашими перешкодами.",
"settings-useSystemCssEditor": "Використовуйте системний редактор CSS",
"settings-useSystemCssEditor-desc": "Використовуйте системний редактор CSS для редагування CSS.",
"settings-MultiInstance": "Багато екземплярів",
@ -142,8 +142,5 @@
"settings-windowsLegacyScanning": "Сканування застарілих версій Windows",
"settings-windowsLegacyScanning-desc": "Використовує застарілий метод для процесів сканування у Windows (до версії 1.1.6). Може покращити сумісність у деяких системах, але менш ефективний.",
"settings-scanInterval": "Інтервал сканування (мс)",
"settings-scanInterval-desc": "Встановлює частоту (у мілісекундах) сканування процесу. Нижчі значення можуть покращити швидкість виявлення, але можуть збільшити використання процесора.",
"settings-startMinimized-off": "Звичайний",
"settings-startMinimized-minimized": "Згорнуто на панель завдань",
"settings-startMinimized-tray": "Сховано в треї"
"settings-scanInterval-desc": "Встановлює частоту (у мілісекундах) сканування процесу. Нижчі значення можуть покращити швидкість виявлення, але можуть збільшити використання процесора."
}

View file

@ -1,9 +1,9 @@
{
"$schema": "https://biomejs.dev/schemas/2.5.5/schema.json",
"$schema": "https://biomejs.dev/schemas/2.4.16/schema.json",
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
"files": {
"ignoreUnknown": false,
"includes": ["**", "!**/assets/app/js", "!**/assets/**/*.svg"]
"includes": ["**", "!**/assets/app/js"]
},
"formatter": {
"enabled": true,
@ -20,7 +20,7 @@
"linter": {
"enabled": true,
"rules": {
"preset": "recommended",
"recommended": true,
"complexity": {
"noForEach": "off"
},

View file

@ -32,28 +32,28 @@
},
"homepage": "https://github.com/Legcord/Legcord#readme",
"devDependencies": {
"@biomejs/biome": "2.5.5",
"@rolldown-plugin/solid": "^0.1.0",
"@biomejs/biome": "2.4.16",
"@rolldown-plugin/solid": "^0.0.4",
"@rollup/plugin-esm-shim": "^0.1.8",
"@types/adm-zip": "^0.5.8",
"@types/node": "^26.1.1",
"@types/node": "^25.9.1",
"@types/ws": "^8.18.1",
"@uwu/lune": "^1.6.3",
"@uwu/lune": "^1.6.2",
"@uwu/shelter-defs": "^1.5.1",
"@uwu/shelter-ui": "^0.0.6",
"@xmldom/xmldom": "^0.9.10",
"app-builder-lib": "^26.15.3",
"app-builder-lib": "^26.8.1",
"babel-preset-solid": "^1.9.12",
"electron": "43.2.0",
"electron-builder": "26.15.7",
"lucide-solid": "^1.26.0",
"monaco-editor": "0.56.0",
"lucide-solid": "^1.16.0",
"monaco-editor": "0.52.2",
"rolldown": "1.2.0",
"rollup-plugin-copy": "^3.5.0",
"solid-js": "^1.9.14",
"solid-motionone": "^1.0.4",
"spdx-license-list": "^6.11.0",
"typescript": "^7.0.2",
"typescript": "^6.0.3",
"xml-formatter": "^3.7.0"
},
"dependencies": {
@ -62,14 +62,14 @@
"arrpc": "github:Legcord/arrpc#efe7589762470d32b9ba10d529be5acc23cd0e19",
"electron-context-menu": "^4.1.2",
"electron-is-dev": "^3.0.1",
"electron-updater": "^6.8.9",
"electron-updater": "^6.8.3",
"ms": "^2.1.3",
"spitroast": "^2.1.6",
"tslib": "^2.8.1",
"ws": "^8.21.1"
"ws": "^8.21.0"
},
"optionalDependencies": {
"@vencord/venmic": "^7.1.0"
"@vencord/venmic": "^6.1.0"
},
"packageManager": "pnpm@11.10.0",
"package-manager-strict": false

1549
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -58,8 +58,7 @@ export interface Settings {
| "none";
customJsBundle: RequestInfo | URL | string;
customCssBundle: RequestInfo | URL | string;
/** How the main window appears on launch: normal, taskbar minimized, or tray-only. */
startMinimized: "off" | "minimized" | "tray";
startMinimized: boolean;
keybinds: Keybind[];
hardwareAcceleration: boolean;
/** Rewrite H.264 Constrained Baseline (42e0) → Baseline (4200) in WebRTC SDP for HW encode. */

View file

@ -43,7 +43,7 @@ const defaults: Settings = {
performanceMode: "none",
skipSplash: false,
inviteWebsocket: true,
startMinimized: "off",
startMinimized: false,
disableHttpCache: false,
customJsBundle: "https://legcord.app/placeholder.js",
customCssBundle: "https://legcord.app/placeholder.css",
@ -123,29 +123,9 @@ export function getConfig<K extends keyof Settings>(object: K): Settings[K] {
return returnData[object];
}
const START_MINIMIZED_MODES = new Set<Settings["startMinimized"]>(["off", "minimized", "tray"]);
/** Effective startup window mode (CLI overrides are session-only). */
export function getStartMinimizedMode(): Settings["startMinimized"] {
if (process.argv.includes("--start-in-tray")) return "tray";
if (process.argv.includes("--start-minimized")) return "minimized";
const mode = getConfig("startMinimized");
return START_MINIMIZED_MODES.has(mode) ? mode : "off";
}
/** True when startup should not show the window normally (skip splash). */
export function isBackgroundStart(): boolean {
return getStartMinimizedMode() !== "off";
}
function migrateStartMinimized(settingsObject: Record<string, unknown>): boolean {
const value = settingsObject.startMinimized;
if (typeof value === "boolean") {
settingsObject.startMinimized = value ? "tray" : "off";
console.log(`[Config] Migrated startMinimized boolean → "${settingsObject.startMinimized}"`);
return true;
}
return false;
/** True when the settings toggle is on or `--start-minimized` was passed for this session. */
export function shouldStartMinimized(): boolean {
return process.argv.includes("--start-minimized") || getConfig("startMinimized") === true;
}
export function setConfig<K extends keyof Settings>(object: K, toSet: Settings[K]): void {
const rawData = readFileSync(getConfigLocation(), "utf-8");
@ -209,15 +189,10 @@ export function checkIfConfigExists(): void {
export function checkIfConfigIsBroken(): void {
try {
const settingsData = readFileSync(getConfigLocation(), "utf-8");
const settingsObject = JSON.parse(settingsData) as Settings & Record<string, unknown>;
// Migrate before typeof repair — boolean → "tray" | "off"
if (migrateStartMinimized(settingsObject)) {
writeFileSync(getConfigLocation(), JSON.stringify(settingsObject, null, 4), "utf-8");
}
const settingsObject = JSON.parse(settingsData) as Settings;
// Performance optimization: Update cache after validation
configCache = settingsObject as Settings;
configCache = settingsObject;
configCacheTime = Date.now();
let configWasFine = true;

View file

@ -47,8 +47,6 @@ export function navigateTo(passedWindow: BrowserWindow, url: string): void {
passedWindow.webContents.executeJavaScript(
`history.pushState({}, null, ${JSON.stringify(sanitized)});window.dispatchEvent(new PopStateEvent("popstate", {}));`,
);
passedWindow.setSkipTaskbar(false);
if (passedWindow.isMinimized()) passedWindow.restore();
passedWindow.show();
passedWindow.focus();
}

View file

@ -1,37 +0,0 @@
import type { BrowserWindow } from "electron";
import { getConfig, getStartMinimizedMode } from "./config.js";
/** Show the main window and restore taskbar/dock presence after a tray-only start. */
export function revealWindow(win: BrowserWindow): void {
if (win.isDestroyed()) return;
win.setSkipTaskbar(false);
if (win.isMinimized()) win.restore();
win.show();
win.focus();
}
/** Apply startMinimized mode when splash will not call splashEnd, or from splashEnd itself. */
export function applyStartupWindowVisibility(win: BrowserWindow): void {
if (win.isDestroyed()) return;
const mode = getStartMinimizedMode();
switch (mode) {
case "minimized":
win.setSkipTaskbar(false);
win.show();
win.minimize();
break;
case "tray":
if (getConfig("tray") === "disabled") {
console.warn(
'[Window] startMinimized is "tray" but the tray icon is disabled; the window will be hidden with no tray.',
);
}
win.setSkipTaskbar(true);
win.hide();
break;
default:
win.setSkipTaskbar(false);
win.show();
break;
}
}

View file

@ -18,7 +18,7 @@ import {
unblacklistGame as blacklistGameRemove,
getBlacklist,
} from "../common/blacklistGame.js";
import { getConfig, getConfigLocation, setConfig, setConfigBulk } from "../common/config.js";
import { getConfig, getConfigLocation, setConfig, setConfigBulk, shouldStartMinimized } from "../common/config.js";
import { addDetectable, getDetectables, removeDetectable } from "../common/detectables.js";
import { getLang, getLangName, getRawLang, setLang } from "../common/lang.js";
import {
@ -32,7 +32,6 @@ import {
uninstallTheme,
} from "../common/themes.js";
import { getDisplayVersion, getVersion } from "../common/version.js";
import { applyStartupWindowVisibility, revealWindow } from "../common/windowVisibility.js";
import { openCssEditor } from "../cssEditor/main.js";
import { getAppliedFlags, handleRestart } from "../main.js";
import { isPowerSavingEnabled, setPowerSaving } from "../power.js";
@ -219,7 +218,11 @@ export function registerIpc(passedWindow: BrowserWindow): void {
ipcMain.on("splashEnd", () => {
splashWindow?.close();
applyStartupWindowVisibility(passedWindow);
if (shouldStartMinimized()) {
passedWindow.hide();
} else {
passedWindow.show();
}
});
ipcMain.on("setLang", (_event, lang: string) => {
setLang(lang);
@ -267,7 +270,7 @@ export function registerIpc(passedWindow: BrowserWindow): void {
passedWindow.unmaximize();
});
ipcMain.on("win-show", () => {
revealWindow(passedWindow);
passedWindow.show();
});
ipcMain.on("win-hide", () => {
passedWindow.hide();

View file

@ -4,7 +4,6 @@ import { getConfig } from "../common/config.js";
import { setForceQuit } from "../common/forceQuit.js";
import { openSettings, runAction } from "../common/keybindActions.js";
import { getLang } from "../common/lang.js";
import { revealWindow } from "../common/windowVisibility.js";
import { mainWindows } from "./window.js";
const keybindActionLabels: Record<KeybindActions, string> = {
@ -54,7 +53,7 @@ export function setMenu(): void {
accelerator: "Cmd+,",
click() {
mainWindows.forEach((mainWindow) => {
revealWindow(mainWindow);
mainWindow.show();
openSettings();
});
},

View file

@ -5,7 +5,6 @@ import { navigateTo } from "../common/dom.js";
import { setForceQuit } from "../common/forceQuit.js";
import { getLang } from "../common/lang.js";
import { getDisplayVersion } from "../common/version.js";
import { revealWindow } from "../common/windowVisibility.js";
import { handleRestart } from "../main.js";
import { mainWindows } from "./window.js";
export let tray: Tray;
@ -45,7 +44,7 @@ export function createTray() {
label: getLang("tray-openLegcord"),
click() {
mainWindows.forEach((mainWindow) => {
revealWindow(mainWindow);
mainWindow.show();
});
},
},
@ -53,7 +52,7 @@ export function createTray() {
label: getLang("tray-openSettings"),
click() {
mainWindows.forEach((mainWindow) => {
revealWindow(mainWindow);
mainWindow.show();
});
},
},
@ -87,7 +86,7 @@ export function createTray() {
tray.setToolTip(getLang("tray-tooltip"));
tray.on("click", () => {
mainWindows.forEach((mainWindow) => {
revealWindow(mainWindow);
mainWindow.show();
});
});
}

View file

@ -14,7 +14,7 @@ import {
shell,
} from "electron";
import contextMenu from "electron-context-menu";
import { firstRun, getConfig, isBackgroundStart, setConfig } from "../common/config.js";
import { firstRun, getConfig, setConfig, shouldStartMinimized } from "../common/config.js";
import { navigateTo } from "../common/dom.js";
import { forceQuit, setForceQuit } from "../common/forceQuit.js";
import { handleCommands, passedValidArgument } from "../common/handleCommands.js";
@ -35,7 +35,6 @@ import {
sanitizeWindowBounds,
} from "../common/windowBounds.js";
import { getWindowState, setWindowState } from "../common/windowState.js";
import { applyStartupWindowVisibility, revealWindow } from "../common/windowVisibility.js";
import { disconnectDbusService } from "../dbus.js";
import { init } from "../main.js";
import { registerGlobalKeybinds } from "./globalKeybinds.js";
@ -183,7 +182,8 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void {
// we should focus our window if the user is not running special commands.
if (passedWindow && !passedValidArgument(commandLine)) {
if (passedWindow.isMinimized()) passedWindow.restore();
revealWindow(passedWindow);
passedWindow.show();
passedWindow.focus();
}
if (commandLine && commandLine.length > 0) {
handleCommands(commandLine);
@ -475,8 +475,12 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void {
}
// When splash won't run, finalize visibility here (splashEnd never fires).
if (getConfig("skipSplash") || isBackgroundStart()) {
applyStartupWindowVisibility(passedWindow);
if (getConfig("skipSplash") || shouldStartMinimized()) {
if (shouldStartMinimized()) {
passedWindow.hide();
} else {
passedWindow.show();
}
}
}

View file

@ -12,15 +12,14 @@ import {
firstRun,
getConfig,
getConfigLocation,
isBackgroundStart,
setConfig,
setFirstRun,
setup,
shouldStartMinimized,
} from "./common/config.js";
import { getPreset } from "./common/flags.js";
import { setLang } from "./common/lang.js";
import { applyProxyCommandLineSwitches, applySessionProxy, configureNodeProxyEnv } from "./common/proxy.js";
import { revealWindow } from "./common/windowVisibility.js";
import { setupGlobalShortcuts, startDbusService } from "./dbus.js";
// Chrome flags tracking
@ -112,7 +111,7 @@ export async function init(): Promise<void> {
if (bypassSetup || !(firstRun === true || undefined)) {
// Splash owns the final show/hide via splashEnd; skip it when splash is disabled
// or when we intentionally start in the background.
if (getConfig("skipSplash") === false && !isBackgroundStart()) {
if (getConfig("skipSplash") === false && !shouldStartMinimized()) {
void createSplashWindow(); // NOTE - Awaiting will hang at start
}
createWindow();
@ -408,7 +407,7 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) {
void init();
} else {
BrowserWindow.getAllWindows().forEach((window) => {
revealWindow(window);
window.show();
});
}
});

View file

@ -101,9 +101,6 @@ export function SettingsPage() {
t["settings-disableAutogain"],
t["settings-mintoTray"],
t["settings-startMinimized"],
t["settings-startMinimized-off"],
t["settings-startMinimized-minimized"],
t["settings-startMinimized-tray"],
t["settings-smoothScroll"],
t["settings-autoScroll"],
t["settings-spellcheck"],
@ -488,26 +485,14 @@ export function SettingsPage() {
{t["settings-mintoTray"]}
</SwitchItem>
</SearchableSetting>
<SearchableSetting
keywords={[
t["settings-startMinimized"],
t["settings-startMinimized-desc"],
t["settings-startMinimized-off"],
t["settings-startMinimized-minimized"],
t["settings-startMinimized-tray"],
]}
>
<DropdownItem
value={settings.startMinimized}
onChange={(v) => setConfig("startMinimized", v as Settings["startMinimized"], true)}
title={t["settings-startMinimized"]}
<SearchableSetting keywords={[t["settings-startMinimized"], t["settings-startMinimized-desc"]]}>
<SwitchItem
note={t["settings-startMinimized-desc"]}
options={[
{ label: t["settings-startMinimized-off"], value: "off" },
{ label: t["settings-startMinimized-minimized"], value: "minimized" },
{ label: t["settings-startMinimized-tray"], value: "tray" },
]}
/>
value={settings.startMinimized}
onChange={(e: boolean) => setConfig("startMinimized", e, true)}
>
{t["settings-startMinimized"]}
</SwitchItem>
</SearchableSetting>
<SearchableSetting keywords={[t["settings-smoothScroll"], t["settings-smoothScroll-desc"]]}>
<SwitchItem

View file

@ -1,12 +1,12 @@
import path from "node:path";
import { BrowserWindow, ipcMain } from "electron";
import isDev from "electron-is-dev";
import { getConfig, isBackgroundStart } from "../common/config.js";
import { getConfig, shouldStartMinimized } from "../common/config.js";
import { getLang } from "../common/lang.js";
export let splashWindow: BrowserWindow;
export async function createSplashWindow(): Promise<void> {
if (isBackgroundStart()) return;
if (shouldStartMinimized()) return;
splashWindow = new BrowserWindow({
width: 300,
height: 350,