Skip to content

Commit 43e6e88

Browse files
committed
feat: allow override main window size limits
close #18
1 parent e3e8d5b commit 43e6e88

3 files changed

Lines changed: 95 additions & 4 deletions

File tree

gui/src/routes/+page.svelte

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import Database from "@lucide/svelte/icons/database";
1212
import LocalResources from "./LocalResources.svelte";
1313
14+
import AppWindow from "@lucide/svelte/icons/app-window";
15+
import Window from "./Window.svelte";
16+
1417
import TableOfContents from "@lucide/svelte/icons/table-of-contents";
1518
import Tray from "./Tray.svelte";
1619
@@ -30,6 +33,12 @@
3033
icon: Database,
3134
component: LocalResources,
3235
},
36+
{
37+
id: "window",
38+
name: "窗口设置",
39+
icon: AppWindow,
40+
component: Window,
41+
},
3342
{
3443
id: "tray",
3544
name: "托盘菜单",

gui/src/routes/Window.svelte

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<script lang="ts">
2+
import * as RadioGroup from "$lib/components/ui/radio-group";
3+
import * as Field from "$lib/components/ui/field";
4+
5+
let overrideMainWindowSizeLimitPromise = $state(
6+
kv.get("window.overrideMainWindowSizeLimit")
7+
);
8+
</script>
9+
10+
<h1 class="text-2xl font-bold">窗口设置</h1>
11+
<p class="mt-2 text-gray-700">选择主窗口大小限制的行为。</p>
12+
13+
{#await overrideMainWindowSizeLimitPromise then value}
14+
<RadioGroup.Root
15+
class="mt-2"
16+
bind:value={
17+
() => (value as string) || "false",
18+
(v) => {
19+
kv.set("window.overrideMainWindowSizeLimit", v);
20+
overrideMainWindowSizeLimitPromise = Promise.resolve(v);
21+
}
22+
}
23+
>
24+
<Field.Label for="main-window-size-limit-false">
25+
<Field.Field orientation="horizontal">
26+
<Field.Content>
27+
<Field.Title>正常应用限制</Field.Title>
28+
<Field.Description>
29+
主窗口将遵循网易云音乐设置的大小限制。
30+
</Field.Description>
31+
</Field.Content>
32+
<RadioGroup.Item id="main-window-size-limit-false" value="false" />
33+
</Field.Field>
34+
</Field.Label>
35+
<Field.Label for="main-window-size-limit-true">
36+
<Field.Field orientation="horizontal">
37+
<Field.Content>
38+
<Field.Title>不应用限制</Field.Title>
39+
<Field.Description>主窗口将没有大小限制。</Field.Description>
40+
</Field.Content>
41+
<RadioGroup.Item id="main-window-size-limit-true" value="true" />
42+
</Field.Field>
43+
</Field.Label>
44+
</RadioGroup.Root>
45+
{/await}

src/main/calls/winhelper.ts

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ import {
1717
import AppMenu, { AppMenuItem } from "../menu";
1818
import showManageWindow from "../windows/manage";
1919
import { registerGlobalShortcut, unregisterGlobalShortcut } from "../shortcuts";
20-
import { kvGet } from "../kv";
20+
import {
21+
addEventListener as addKVEventListener,
22+
KvChangeEvent,
23+
kvGet,
24+
} from "../kv";
2125

2226
function shouldApplyScaleFactor() {
2327
return (
@@ -137,6 +141,8 @@ registerCallHandler<[], [WindowPosition]>(
137141
}
138142
);
139143

144+
type SizeLimit = { x: number; y: number };
145+
let mainWindowSizeLimits: [SizeLimit, SizeLimit] | null = null;
140146
registerCallHandler<[{ x: number; y: number }, { x: number; y: number }], void>(
141147
"winhelper.setWindowSizeLimit",
142148
(event, min, max) => {
@@ -145,11 +151,42 @@ registerCallHandler<[{ x: number; y: number }, { x: number; y: number }], void>(
145151
const scaleFactor = shouldApplyScaleFactor()
146152
? getWindowScaleFactor(wnd)
147153
: 1;
148-
// Use window module to set maximum size to avoid issues with maximized/fullscreen windows
149-
setMinimumSize(wnd, min.x, min.y);
150-
setMaximumSize(wnd, max.x * scaleFactor, max.y * scaleFactor);
154+
if (
155+
wnd !== mainWindow ||
156+
kvGet("window.overrideMainWindowSizeLimit") !== "true"
157+
) {
158+
// Use window module to set maximum size to avoid issues with maximized/fullscreen windows
159+
setMinimumSize(wnd, min.x, min.y);
160+
setMaximumSize(wnd, max.x * scaleFactor, max.y * scaleFactor);
161+
}
162+
if (wnd == mainWindow) {
163+
mainWindowSizeLimits = [
164+
min,
165+
{ x: max.x * scaleFactor, y: max.y * scaleFactor },
166+
];
167+
}
151168
}
152169
);
170+
addKVEventListener("change", ((e: KvChangeEvent) => {
171+
const { key, current } = e.detail;
172+
if (key === "window.overrideMainWindowSizeLimit") {
173+
if (current === "true" || !mainWindowSizeLimits) {
174+
setMinimumSize(mainWindow, 0, 0);
175+
setMaximumSize(mainWindow, 0, 0);
176+
} else {
177+
setMinimumSize(
178+
mainWindow,
179+
mainWindowSizeLimits[0].x,
180+
mainWindowSizeLimits[0].y
181+
);
182+
setMaximumSize(
183+
mainWindow,
184+
mainWindowSizeLimits[1].x,
185+
mainWindowSizeLimits[1].y
186+
);
187+
}
188+
}
189+
}) as EventListener);
153190

154191
registerCallHandler<[], void>("winhelper.bringWindowToTop", (event) => {
155192
const wnd = BrowserWindow.fromWebContents(event.sender);

0 commit comments

Comments
 (0)