@@ -489,9 +503,24 @@ export default function BottomBar({ onClose, onHeightChange }: BottomBarProps):
Window
- {windowBackground.mode !== 'solid' ? (
-
- Window snapping is disabled in this mode
+ {windowBackground.mode !== 'solid' || loginItemStatusMessage ? (
+
+ {windowBackground.mode !== 'solid' ? (
+
+ Window snapping is disabled in this mode
+
+ ) : null}
+ {windowBackground.mode !== 'solid' && loginItemStatusMessage ? (
+ ·
+ ) : null}
+ {loginItemStatusMessage ? (
+
+ {loginItemStatusMessage}
+
+ ) : null}
) : null}
@@ -536,6 +565,36 @@ export default function BottomBar({ onClose, onHeightChange }: BottomBarProps):
}}
title="How much of the desktop shows through"
/>
+
+
+
+ {
+ void setLoginLaunchMode(event.target.value === 'tray' ? 'tray' : 'show')
+ }}
+ className="bottom-bar__login-select"
+ title="What Prism should show when opened automatically at login"
+ >
+
+
+
diff --git a/src/renderer/components/TrayControlBridge.tsx b/src/renderer/components/TrayControlBridge.tsx
new file mode 100644
index 0000000..20d4540
--- /dev/null
+++ b/src/renderer/components/TrayControlBridge.tsx
@@ -0,0 +1,136 @@
+import { useEffect, type JSX } from 'react'
+import type { TrayRendererCommand, TrayRendererState } from '../../types/desktopIntegration'
+import { useAudioStore } from '../stores/audioStore'
+import { useSettingsStore } from '../stores/settingsStore'
+import { useUiStore } from '../stores/uiStore'
+
+interface TrayControlBridgeProps {
+ ready: boolean
+}
+
+const DEFAULT_SYSTEM_SOURCE_ID = '__default_system_output__'
+
+function getErrorMessage(error: unknown, fallback: string): string {
+ return error instanceof Error && error.message ? error.message : fallback
+}
+
+async function handleTrayCommand(command: TrayRendererCommand): Promise