Skip to content

Commit c3c8002

Browse files
authored
Merge pull request #90 from YUCLing/fix/menu-click-through
菜单打开后鼠标被拦截
2 parents 976862b + 03b5ce7 commit c3c8002

8 files changed

Lines changed: 28 additions & 11 deletions

File tree

gui/src/lib/inputRegion.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { getBridge } from "./bridge";
77
const api = getBridge<InputRegionContract>("inputRegion");
88
const inputRegionElements: Element[] = [];
99

10-
function refreshInputRegion() {
10+
export function refreshInputRegion() {
1111
if (api.platform === "linux") {
1212
api.setInputRegions(
1313
inputRegionElements.map((v) => {
@@ -58,3 +58,9 @@ export const inputRegionAttachment: Attachment = (element) => {
5858
removeInputRegion(element);
5959
};
6060
};
61+
62+
api.events.shown(() => {
63+
// Ensure it's set, even if it was populated before window surface is
64+
// actually shown.
65+
refreshInputRegion();
66+
});

gui/src/routes/(transparent)/menu/+page.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import MenuPanel from "./MenuPanel.svelte";
88
import { getBridge } from "$lib/bridge";
99
import type { MenuContract } from "$bridge/contracts/menu-api";
10+
import { inputRegionAttachment } from "$lib/inputRegion";
1011
1112
const api = getBridge<MenuContract>("menu");
1213
@@ -235,6 +236,7 @@
235236
style="left: {cursorX}px; top: {menuTop}px; visibility: {menuReady
236237
? 'visible'
237238
: 'hidden'};"
239+
{@attach inputRegionAttachment}
238240
/>
239241

240242
{#if submenuItems}
@@ -252,6 +254,7 @@
252254
showSubmenuArrows={false}
253255
bind:el={submenuEl}
254256
style="left: {submenuX}px; top: {submenuY}px;"
257+
{@attach inputRegionAttachment}
255258
/>
256259
{/if}
257260
</div>

gui/src/routes/(transparent)/menu/MenuPanel.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script lang="ts">
2+
import type { HTMLAttributes } from "svelte/elements";
3+
24
import type { MenuItem, MenuItemBtn, LayoutNode } from "./types";
35
import { getCachedTemplate } from "./template";
46
import IconButton from "$lib/components/IconButton.svelte";
@@ -13,6 +15,7 @@
1315
onitemhover,
1416
onitemleave,
1517
onbtnclick,
18+
...props
1619
}: {
1720
items: MenuItem[];
1821
hoveredIndex: number;
@@ -23,7 +26,7 @@
2326
onitemhover?: (index: number, item: MenuItem, event: MouseEvent) => void;
2427
onitemleave?: (index: number) => void;
2528
onbtnclick?: (btn: MenuItemBtn) => void;
26-
} = $props();
29+
} & HTMLAttributes<HTMLDivElement> = $props();
2730
</script>
2831

2932
{#snippet layoutNode(node: LayoutNode, btns: MenuItemBtn[])}
@@ -95,6 +98,7 @@
9598
class="absolute max-w-80 min-w-58 overflow-hidden rounded-lg py-1.5 shadow-[0_4px_16px_rgba(0,0,0,0.15),0_1px_4px_rgba(0,0,0,0.1)] select-none"
9699
style="background-color: var(--menu-bg); {style ?? ''}"
97100
bind:this={el}
101+
{...props}
98102
>
99103
{#each items as item, i (i)}
100104
{#if item.separator}

src/bridge/common/inputRegion.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ export function registerInputRegionHandlers(wnd: Electron.BrowserWindow) {
2222
}
2323
},
2424
});
25+
26+
wnd.on("show", () => {
27+
wnd.webContents.send("inputRegion.shown");
28+
});
2529
}

src/bridge/contracts/input-region-api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ export type { InputRegion };
55
export interface InputRegionContract {
66
platform: NodeJS.Platform;
77
setInputRegions(regions: InputRegion[]): Promise<void>;
8+
9+
events: {
10+
shown(callback: () => void): void;
11+
};
812
}

src/bridge/contracts/menu-api.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,6 @@ export interface MenuContract {
1616
submenu: boolean;
1717

1818
events: {
19-
show(
20-
callback: (
21-
items: unknown[],
22-
templates: Record<string, ElementTemplate>,
23-
cursorX: number,
24-
cursorY: number,
25-
colors: MenuSkin
26-
) => void
27-
): void;
2819
update(callback: (items: unknown[]) => void): void;
2920
};
3021

src/main/menu.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { registerIpcHandlers } from "../bridge/register";
2424
import type { MenuContract } from "../bridge/contracts/menu-api";
2525
import { parseBtnUrl, parseElementTemplate } from "./skin/dui";
2626
import type { ElementTemplate } from "./skin/dui";
27+
import { registerInputRegionHandlers } from "../bridge/common/inputRegion";
2728

2829
import type { AppMenuItem } from "$sharedTypes/menu";
2930

@@ -217,6 +218,7 @@ export default class AppMenu extends EventTarget {
217218
openSubmenu: async () => {},
218219
closeSubmenu: async () => {},
219220
});
221+
registerInputRegionHandlers(wnd);
220222
}
221223

222224
// --- Non-Wayland: transparent popup BrowserWindow ---

src/windows/menu.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ exposeApi("menu", {
44
wayland: process.argv.includes("--wayland"),
55
submenu: process.argv.includes("--submenu"),
66
});
7+
exposeApi("inputRegion", {
8+
platform: process.platform,
9+
});

0 commit comments

Comments
 (0)