mirror of
https://github.com/smartfrigde/armcord.git
synced 2026-08-19 14:23:23 +00:00
Compare commits
No commits in common. "022676cf6573637e7d7d250500baf28a7ea07fab" and "0a022f149000bdaed644c2609e19aa7b8badf825" have entirely different histories.
022676cf65
...
0a022f1490
4 changed files with 19 additions and 136 deletions
|
|
@ -85,17 +85,6 @@ export const config: Configuration = {
|
||||||
electronDownload: {
|
electronDownload: {
|
||||||
cache: ".cache",
|
cache: ".cache",
|
||||||
},
|
},
|
||||||
|
|
||||||
electronFuses: {
|
|
||||||
runAsNode: false,
|
|
||||||
enableCookieEncryption: false,
|
|
||||||
enableNodeOptionsEnvironmentVariable: false,
|
|
||||||
enableNodeCliInspectArguments: false,
|
|
||||||
enableEmbeddedAsarIntegrityValidation: false,
|
|
||||||
onlyLoadAppFromAsar: true,
|
|
||||||
loadBrowserProcessSpecificV8Snapshot: false,
|
|
||||||
grantFileProtocolExtraPrivileges: false,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export default config;
|
||||||
|
|
|
||||||
2
src/@types/windowState.d.ts
vendored
2
src/@types/windowState.d.ts
vendored
|
|
@ -4,6 +4,4 @@ export interface WindowState {
|
||||||
x: number;
|
x: number;
|
||||||
y: number;
|
y: number;
|
||||||
isMaximized: boolean;
|
isMaximized: boolean;
|
||||||
displayId?: number;
|
|
||||||
displayScaleFactor?: number;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import {
|
||||||
dialog,
|
dialog,
|
||||||
type MessageBoxOptions,
|
type MessageBoxOptions,
|
||||||
nativeImage,
|
nativeImage,
|
||||||
screen,
|
|
||||||
shell,
|
shell,
|
||||||
} from "electron";
|
} from "electron";
|
||||||
import contextMenu from "electron-context-menu";
|
import contextMenu from "electron-context-menu";
|
||||||
|
|
@ -30,51 +29,6 @@ import { registerVenmicIpc } from "./venmic.js";
|
||||||
export let mainWindows: BrowserWindow[] = [];
|
export let mainWindows: BrowserWindow[] = [];
|
||||||
export let inviteWindow: BrowserWindow;
|
export let inviteWindow: BrowserWindow;
|
||||||
|
|
||||||
function getStoredWindowBounds(): BrowserWindowConstructorOptions {
|
|
||||||
const width = getWindowState("width") ?? 835;
|
|
||||||
const height = getWindowState("height") ?? 600;
|
|
||||||
const x = getWindowState("x");
|
|
||||||
const y = getWindowState("y");
|
|
||||||
|
|
||||||
if (x === undefined || y === undefined) {
|
|
||||||
return {
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the stored window coordinates as-is.
|
|
||||||
// Restore uses setPosition/setSize for a direct API roundtrip.
|
|
||||||
return {
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save window bounds using the same API family we restore with.
|
|
||||||
// This avoids coordinate-space mismatches caused by getNormalBounds()/setBounds() across DPI setups.
|
|
||||||
function saveWindowState(win: BrowserWindow): void {
|
|
||||||
try {
|
|
||||||
const [x, y] = win.getPosition();
|
|
||||||
const [width, height] = win.getSize();
|
|
||||||
const display = screen.getDisplayNearestPoint({ x, y });
|
|
||||||
|
|
||||||
setWindowState({
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
isMaximized: win.isMaximized(),
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
displayId: display.id,
|
|
||||||
displayScaleFactor: display.scaleFactor,
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
console.log("[Window] Failed to save window state:", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
contextMenu({
|
contextMenu({
|
||||||
showSaveImageAs: true,
|
showSaveImageAs: true,
|
||||||
showCopyImageAddress: true,
|
showCopyImageAddress: true,
|
||||||
|
|
@ -337,10 +291,6 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void {
|
||||||
passedWindow.destroy();
|
passedWindow.destroy();
|
||||||
}
|
}
|
||||||
if (getConfig("minimizeToTray") && !forceQuit) {
|
if (getConfig("minimizeToTray") && !forceQuit) {
|
||||||
// Save state when hiding to tray so we persist display metadata
|
|
||||||
try {
|
|
||||||
saveWindowState(passedWindow);
|
|
||||||
} catch {}
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
passedWindow.hide();
|
passedWindow.hide();
|
||||||
} else if (!getConfig("minimizeToTray")) {
|
} else if (!getConfig("minimizeToTray")) {
|
||||||
|
|
@ -349,20 +299,15 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void {
|
||||||
});
|
});
|
||||||
app.on("before-quit", () => {
|
app.on("before-quit", () => {
|
||||||
stopRPC();
|
stopRPC();
|
||||||
try {
|
const [width, height] = passedWindow.getSize();
|
||||||
// Ensure current window state is saved with display info
|
setWindowState({
|
||||||
if (passedWindow && !passedWindow.isDestroyed()) saveWindowState(passedWindow);
|
width,
|
||||||
} catch (e) {
|
height,
|
||||||
console.log("[Window] before-quit save failed:", e);
|
isMaximized: passedWindow.isMaximized(),
|
||||||
}
|
x: passedWindow.getPosition()[0],
|
||||||
setForceQuit(true);
|
y: passedWindow.getPosition()[1],
|
||||||
});
|
});
|
||||||
|
setForceQuit(true);
|
||||||
// also save on minimize in case of session shutdowns
|
|
||||||
passedWindow.on("minimize", () => {
|
|
||||||
try {
|
|
||||||
saveWindowState(passedWindow);
|
|
||||||
} catch {}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
passedWindow.on("focus", () => {
|
passedWindow.on("focus", () => {
|
||||||
|
|
@ -386,48 +331,6 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
registerGlobalKeybinds();
|
registerGlobalKeybinds();
|
||||||
// Persist bounds on move/resize with debounce to avoid frequent writes
|
|
||||||
let _saveTimer: NodeJS.Timeout | null = null;
|
|
||||||
const queueSave = () => {
|
|
||||||
if (_saveTimer) clearTimeout(_saveTimer);
|
|
||||||
_saveTimer = setTimeout(() => {
|
|
||||||
try {
|
|
||||||
saveWindowState(passedWindow);
|
|
||||||
} catch (e) {
|
|
||||||
console.log("[Window] queueSave failed:", e);
|
|
||||||
}
|
|
||||||
_saveTimer = null;
|
|
||||||
}, 500);
|
|
||||||
};
|
|
||||||
passedWindow.on("move", queueSave);
|
|
||||||
passedWindow.on("resize", queueSave);
|
|
||||||
|
|
||||||
// Fallback: periodic poll to detect bounds changes.
|
|
||||||
// Compare raw getNormalBounds() values to detect movement;
|
|
||||||
// saveWindowState normalizes to DIP where needed.
|
|
||||||
let lastPolledBounds: { x: number; y: number; width: number; height: number } | null = null;
|
|
||||||
const pollInterval = setInterval(() => {
|
|
||||||
try {
|
|
||||||
if (passedWindow.isDestroyed()) {
|
|
||||||
clearInterval(pollInterval);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const { x, y, width, height } = passedWindow.getNormalBounds();
|
|
||||||
if (
|
|
||||||
!lastPolledBounds ||
|
|
||||||
lastPolledBounds.x !== x ||
|
|
||||||
lastPolledBounds.y !== y ||
|
|
||||||
lastPolledBounds.width !== width ||
|
|
||||||
lastPolledBounds.height !== height
|
|
||||||
) {
|
|
||||||
lastPolledBounds = { x, y, width, height };
|
|
||||||
saveWindowState(passedWindow);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// ignore transient errors
|
|
||||||
}
|
|
||||||
}, 1000);
|
|
||||||
passedWindow.on("closed", () => clearInterval(pollInterval));
|
|
||||||
switch (getConfig("channel")) {
|
switch (getConfig("channel")) {
|
||||||
case "stable":
|
case "stable":
|
||||||
void passedWindow.loadURL("https://discord.com/app");
|
void passedWindow.loadURL("https://discord.com/app");
|
||||||
|
|
@ -449,11 +352,11 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createWindow() {
|
export function createWindow() {
|
||||||
const storedBounds = getStoredWindowBounds();
|
|
||||||
const browserWindowOptions: BrowserWindowConstructorOptions = {
|
const browserWindowOptions: BrowserWindowConstructorOptions = {
|
||||||
// Use safe defaults for constructor; actual bounds applied via setBounds() below
|
width: getWindowState("width") ?? 835,
|
||||||
width: 835,
|
height: getWindowState("height") ?? 600,
|
||||||
height: 600,
|
x: getWindowState("x"),
|
||||||
|
y: getWindowState("y"),
|
||||||
title: "Legcord",
|
title: "Legcord",
|
||||||
show: false,
|
show: false,
|
||||||
darkTheme: true,
|
darkTheme: true,
|
||||||
|
|
@ -514,13 +417,6 @@ export function createWindow() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
const mainWindow = new BrowserWindow(browserWindowOptions);
|
const mainWindow = new BrowserWindow(browserWindowOptions);
|
||||||
|
|
||||||
// Restore by position + size directly to match saveWindowState roundtrip.
|
|
||||||
if (storedBounds.x !== undefined && storedBounds.y !== undefined) {
|
|
||||||
mainWindow.setPosition(storedBounds.x, storedBounds.y);
|
|
||||||
mainWindow.setSize(storedBounds.width, storedBounds.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
mainWindows.push(mainWindow);
|
mainWindows.push(mainWindow);
|
||||||
doAfterDefiningTheWindow(mainWindow);
|
doAfterDefiningTheWindow(mainWindow);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,14 @@
|
||||||
background-color 0.15s ease,
|
background-color 0.15s ease,
|
||||||
transform 0.1s ease,
|
transform 0.1s ease,
|
||||||
border-color 0.25s ease;
|
border-color 0.25s ease;
|
||||||
border: 2px solid var(--background-modifier-accent);
|
border: 2px solid transparent;
|
||||||
position: relative;
|
position: relative;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
background: var(--background-secondary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.card:hover {
|
.card:hover {
|
||||||
background-color: var(--background-modifier-hover);
|
background-color: var(--background-modifier-hover);
|
||||||
border-color: var(--background-modifier-selected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.card:active {
|
.card:active {
|
||||||
|
|
@ -27,11 +25,11 @@
|
||||||
|
|
||||||
.cardSelected {
|
.cardSelected {
|
||||||
border-color: var(--brand-experiment-560);
|
border-color: var(--brand-experiment-560);
|
||||||
background-color: color-mix(in srgb, var(--brand-experiment-560) 12%, var(--background-secondary));
|
background-color: color-mix(in srgb, var(--brand-experiment-560) 10%, transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
.cardSelected:hover {
|
.cardSelected:hover {
|
||||||
background-color: color-mix(in srgb, var(--brand-experiment-560) 18%, var(--background-secondary));
|
background-color: color-mix(in srgb, var(--brand-experiment-560) 16%, transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkBadge {
|
.checkBadge {
|
||||||
|
|
@ -91,7 +89,8 @@
|
||||||
transition:
|
transition:
|
||||||
opacity 0.2s ease,
|
opacity 0.2s ease,
|
||||||
filter 0.2s ease;
|
filter 0.2s ease;
|
||||||
opacity: 0.85;
|
opacity: 0.55;
|
||||||
|
filter: brightness(0.85);
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumbnailSelected {
|
.thumbnailSelected {
|
||||||
|
|
@ -106,7 +105,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.card:hover .thumbnailUnselected {
|
.card:hover .thumbnailUnselected {
|
||||||
opacity: 1;
|
opacity: 0.75;
|
||||||
|
filter: brightness(0.95);
|
||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue