Simplify tray: static template icon, click focuses the app

The setImage-swapped progress frames lost the template treatment on macOS and
rendered black-on-dark once transfers started. Dial back per user decision:
the tray is now just the glyph (template image set once at construction, never
swapped) and clicking it activates the window — no menu, no progress effects.
Removes everything that only served the fancy version: progress frames +
generation, engine.aggregateProgress, the workspacesSync webview->bun channel
(schema, send proxy, panels effect, handlers) and the activate-tab action.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jokin
2026-07-11 21:55:42 +02:00
co-authored by Claude Fable 5
parent 42e5e5bb9a
commit 3fb08fdc24
31 changed files with 17 additions and 229 deletions
+1 -6
View File
@@ -67,13 +67,8 @@ export class App {
});
}
/** Native application-menu / tray actions forwarded from the bun process. */
/** Native application-menu actions forwarded from the bun process. */
private handleMenuAction(action: string): void {
if (action.startsWith('activate-tab:')) {
const id = Number(action.slice('activate-tab:'.length));
if (Number.isFinite(id)) this.panels.setActiveWorkspace(id);
return;
}
if (action.startsWith('connect:')) {
const id = action.slice('connect:'.length);
const connection = this.connections.connections().find((c) => c.id === id);
+1 -16
View File
@@ -1,4 +1,4 @@
import { Injectable, computed, effect, signal, type WritableSignal } from '@angular/core';
import { Injectable, computed, signal, type WritableSignal } from '@angular/core';
import type { ConnectionConfig, FileEntry, SavedConnection } from '@shared/types';
import { RpcService } from './rpc.service';
import { ToastService } from './toast.service';
@@ -180,21 +180,6 @@ export class PanelsService {
) {
this.newWorkspace();
// keep the bun-side tray informed about tabs (names, sessions, active)
if (this.rpc.available) {
effect(() => {
this.rpc.send.workspacesSync({
workspaces: this.workspaces().map((ws) => ({
id: ws.id,
name: this.workspaceName(ws),
remote: this.workspaceIsRemote(ws),
sessionIds: [ws.left.sessionId(), ws.right.sessionId()],
})),
activeId: this.activeWorkspaceId(),
});
});
}
// a session died on its own — reset every panel bound to it, in any tab
this.rpc.onSessionClosed((event) => {
for (const workspace of this.workspaces()) {
-16
View File
@@ -87,20 +87,4 @@ export class RpcService {
});
}
/** Fire-and-forget messages to the bun process (e.g. workspacesSync). */
get send() {
const rpc = this.rpc;
if (!rpc) throw new Error('RPC is only available inside the desktop app');
const ready = this.ready;
return new Proxy({} as (typeof rpc)['send'], {
get:
(_target, message: string) =>
(payload?: unknown) => {
void ready.then(() => {
const messages = rpc.send as unknown as Record<string, (p?: unknown) => void>;
messages[message](payload);
});
},
});
}
}