diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json index 3061496..04b1c29 100644 --- a/apps/desktop/src-tauri/capabilities/default.json +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -24,6 +24,7 @@ "core:event:default", "core:window:default", "core:window:allow-set-size", + "core:window:allow-set-enabled", "core:window:allow-start-dragging", "core:window:allow-set-focus", "core:window:allow-toggle-maximize", diff --git a/apps/desktop/src/lib/cmds/builtin.ts b/apps/desktop/src/lib/cmds/builtin.ts index 0a9a992..57015db 100644 --- a/apps/desktop/src/lib/cmds/builtin.ts +++ b/apps/desktop/src/lib/cmds/builtin.ts @@ -411,7 +411,7 @@ export const rawBuiltinCmds: BuiltinCmd[] = [ visible: false }) setTimeout(() => { - window.show() + window.show().then(() => window.setFocus()) }, 2_000) } }, diff --git a/apps/desktop/src/lib/utils/hotkey.ts b/apps/desktop/src/lib/utils/hotkey.ts index 6dad44d..a9b4b0e 100644 --- a/apps/desktop/src/lib/utils/hotkey.ts +++ b/apps/desktop/src/lib/utils/hotkey.ts @@ -48,8 +48,7 @@ export async function registerAppHotkey(hotkeyStr: string) { mainWin.setFocus() } } else { - mainWin.show() - mainWin.setFocus() + mainWin.show().then(() => mainWin.setFocus()) } } }) diff --git a/apps/desktop/src/lib/utils/key.ts b/apps/desktop/src/lib/utils/key.ts index 3c27522..57cbdc0 100644 --- a/apps/desktop/src/lib/utils/key.ts +++ b/apps/desktop/src/lib/utils/key.ts @@ -97,7 +97,7 @@ export async function globalKeyDownHandler(e: KeyboardEvent) { await appWin.hide() location.reload() setTimeout(() => { - appWin.show() + appWin.show().then(() => appWin.setFocus()) }, 1_000) } } diff --git a/apps/desktop/src/routes/+layout.ts b/apps/desktop/src/routes/+layout.ts index 8d7e6d2..96078e6 100644 --- a/apps/desktop/src/routes/+layout.ts +++ b/apps/desktop/src/routes/+layout.ts @@ -1,5 +1,12 @@ +import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow" + // Tauri doesn't have a Node.js server to do proper SSR // so we will use adapter-static to prerender the app (SSG) // See: https://v2.tauri.app/start/frontend/sveltekit/ for more info export const prerender = true export const ssr = false + +export const load = () => { + const win = getCurrentWebviewWindow() + return { win } +} diff --git a/apps/desktop/src/routes/app/+layout.svelte b/apps/desktop/src/routes/app/+layout.svelte index 0c9f71f..baaf21b 100644 --- a/apps/desktop/src/routes/app/+layout.svelte +++ b/apps/desktop/src/routes/app/+layout.svelte @@ -46,7 +46,8 @@ }) }) - let { children } = $props() + let { children, data } = $props() + const unlisteners: UnlistenFn[] = [] onDestroy(() => { unlisteners.forEach((unlistener) => unlistener()) @@ -100,7 +101,7 @@ }) ) } - getCurrentWebviewWindow().show() + data.win.setFocus() }) diff --git a/apps/desktop/src/routes/app/+layout.ts b/apps/desktop/src/routes/app/+layout.ts index 73adb98..140c97b 100644 --- a/apps/desktop/src/routes/app/+layout.ts +++ b/apps/desktop/src/routes/app/+layout.ts @@ -1,8 +1,8 @@ import { getExtensionsFolder, IS_IN_TAURI } from "@/constants" +import * as path from "@tauri-apps/api/path" import { error } from "@tauri-apps/plugin-log" +import { setStoreCollectionPath } from "@tauri-store/svelte" import type { LayoutLoad } from "./$types" -import { setStoreCollectionPath } from '@tauri-store/svelte'; -import * as path from "@tauri-apps/api/path"; export const load: LayoutLoad = async () => { const appDataPath = await path.appDataDir() diff --git a/apps/desktop/src/routes/app/+page.svelte b/apps/desktop/src/routes/app/+page.svelte index 50bf56a..ec3a446 100644 --- a/apps/desktop/src/routes/app/+page.svelte +++ b/apps/desktop/src/routes/app/+page.svelte @@ -64,12 +64,16 @@ if (splashscreenWin) { splashscreenWin.close() } - win.show() + win.show().then(() => win.setFocus()) }) win.onFocusChanged(({ payload: focused }) => { if (focused) { - win.show() - inputEle?.focus() + win + .show() + .then(() => win.setFocus()) + .finally(() => { + inputEle?.focus() + }) } }) inputEle?.focus() diff --git a/apps/desktop/src/routes/app/extension/key-displayer/+page.svelte b/apps/desktop/src/routes/app/extension/key-displayer/+page.svelte index b7a90e9..21c009a 100644 --- a/apps/desktop/src/routes/app/extension/key-displayer/+page.svelte +++ b/apps/desktop/src/routes/app/extension/key-displayer/+page.svelte @@ -8,6 +8,8 @@ import * as userInput from "tauri-plugin-user-input-api" import { type InputEvent } from "tauri-plugin-user-input-api" + let { data } = $props() + const SymbolMap = { Alt: "⎇", AltGr: "⌥", @@ -97,10 +99,7 @@ } $effect(() => { - const win = getCurrentWebviewWindow() - if (win) { - win.show() - } + data.win.show().then(() => data.win.setFocus()) userInput.setEventTypes([userInput.EventTypeEnum.KeyPress, userInput.EventTypeEnum.KeyRelease]) userInput.startListening((evt: InputEvent) => { diff --git a/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte b/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte index 3b68c0e..d7db6bd 100644 --- a/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte +++ b/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte @@ -2,13 +2,12 @@ import { Button } from "@kksh/svelte5" import { Layouts } from "@kksh/ui" import { LogicalSize } from "@tauri-apps/api/dpi" - import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow" import { CircleX } from "lucide-svelte" import { onMount } from "svelte" import * as clipboard from "tauri-plugin-clipboard-api" let image = $state(null) - const appWin = getCurrentWebviewWindow() + let { data } = $props() let originalSize = $state<{ width: number; height: number } | null>(null) let originalScaleFactor = $state(null) let scale = $state(1) @@ -18,13 +17,13 @@ $effect(() => { if (currentSize) { - appWin.setSize(new LogicalSize(currentSize.width, currentSize.height)) + data.win.setSize(new LogicalSize(currentSize.width, currentSize.height)) } }) async function getWindowSize() { - const size = await appWin.outerSize() - const scaleFactor = originalScaleFactor ?? (await appWin.scaleFactor()) + const size = await data.win.outerSize() + const scaleFactor = originalScaleFactor ?? (await data.win.scaleFactor()) const logicalSize = size.toLogical(scaleFactor) return { logicalSize, scaleFactor } } @@ -36,7 +35,7 @@ image = b64 }) .finally(() => { - appWin.show() + data.win.show().then(() => data.win.setFocus()) }) const { logicalSize, scaleFactor } = await getWindowSize() originalSize = { width: logicalSize.width, height: logicalSize.height } @@ -67,13 +66,13 @@ { if (e.key === "Escape") { - appWin.close() + data.win.close() } }} /> - +
{#if image} ([]) - const appWin = getCurrentWindow() let iframeRef: HTMLIFrameElement let uiControl = $state<{ iframeLoaded: boolean @@ -65,7 +64,7 @@ if (isInMainWindow()) { goto(i18n.resolveRoute("/app/")) } else { - appWin.close() + data.win.close() } }, hideBackButton: async () => { @@ -131,7 +130,7 @@ }, getSpawnedProcesses: () => Promise.resolve(extSpawnedProcesses), paste: async () => { - await appWin.hide() + await data.win.hide() await sleep(200) return paste() } @@ -155,7 +154,7 @@ if (isInMainWindow()) { goHome() } else { - appWin.close() + data.win.close() } } @@ -170,7 +169,7 @@ onMount(() => { appState.setFullScreenLoading(true) setTimeout(() => { - appWin.show() + data.win.setFocus() }, 200) if (iframeRef?.contentWindow) { const io = new IframeParentIO(iframeRef.contentWindow) @@ -196,7 +195,7 @@ }) onDestroy(() => { - winExtMap.unregisterExtensionFromWindow(appWin.label) + winExtMap.unregisterExtensionFromWindow(data.win.label) }) @@ -209,7 +208,7 @@ onclick={onBackBtnClicked} style={`${positionToCssStyleString(uiControl.backBtnPosition)}`} > - {#if appWin.label === "main"} + {#if data.win.label === "main"} {:else} diff --git a/apps/desktop/src/routes/app/extension/ui-iframe/+page.ts b/apps/desktop/src/routes/app/extension/ui-iframe/+page.ts index ddd4501..5f13d44 100644 --- a/apps/desktop/src/routes/app/extension/ui-iframe/+page.ts +++ b/apps/desktop/src/routes/app/extension/ui-iframe/+page.ts @@ -1,5 +1,6 @@ import { KunkunIframeExtParams } from "@/cmds/ext" import { i18n } from "@/i18n" +import { appState } from "@/stores/appState" import { db, unregisterExtensionWindow } from "@kksh/api/commands" import type { Ext as ExtInfoInDB, ExtPackageJsonExtra } from "@kksh/api/models" import { loadExtensionManifestFromDisk } from "@kksh/extension" @@ -11,7 +12,6 @@ import { toast } from "svelte-sonner" import * as v from "valibot" import { z } from "zod" import type { PageLoad } from "./$types" -import { appState } from "@/stores/appState" export const load: PageLoad = async ({ url, diff --git a/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte b/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte index 8f569f6..3afe712 100644 --- a/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte +++ b/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte @@ -310,7 +310,7 @@ onMount(async () => { setTimeout(() => { appState.setLoadingBar(true) - appWin.show() + appWin.show().then(() => appWin.setFocus()) }, 100) unlistenRefreshWorkerExt = await listenToRefreshDevExt(() => { debug("Refreshing Worker Extension") diff --git a/apps/desktop/src/routes/splashscreen/+page.svelte b/apps/desktop/src/routes/splashscreen/+page.svelte index d764d5a..9b95107 100644 --- a/apps/desktop/src/routes/splashscreen/+page.svelte +++ b/apps/desktop/src/routes/splashscreen/+page.svelte @@ -1,11 +1,11 @@