Skip to content

feat(dock): desktop launcher — tray/menu-bar app that runs the server#52

Open
beetlebugorg wants to merge 4 commits into
mainfrom
feat/dock
Open

feat(dock): desktop launcher — tray/menu-bar app that runs the server#52
beetlebugorg wants to merge 4 commits into
mainfrom
feat/dock

Conversation

@beetlebugorg

Copy link
Copy Markdown
Owner

cmd/dock is a small pure-Go launcher (fyne.io/systray): menu bar item on macOS, notification-area icon on Windows, StatusNotifierItem on Linux. It spawns the sibling chartplotter binary's serve subcommand, adopts an already-running server (via the new "app" field on /api/health), opens the browser when healthy, and stops the child on quit. Headless fallback when no tray host is on the bus (stock GNOME); single-instance via lock file; child output logged to the state dir.

Packaging: make xbuild-dock cross-builds dist/dock__ for linux+windows (windows -H=windowsgui) and ships the Linux .desktop + icon; make package-macos assembles an LSUIElement ChartPlotter.app (Info.plist template + AppIcon.icns) natively on a mac. Tray/app icons are generated glyphs (gen_icons.go).

cmd/dock is a small pure-Go launcher (fyne.io/systray): menu bar item on
macOS, notification-area icon on Windows, StatusNotifierItem on Linux. It
spawns the sibling chartplotter binary's serve subcommand, adopts an
already-running server (via the new "app" field on /api/health), opens the
browser when healthy, and stops the child on quit. Headless fallback when no
tray host is on the bus (stock GNOME); single-instance via lock file; child
output logged to the state dir.

Packaging: make xbuild-dock cross-builds dist/dock_<os>_<arch> for
linux+windows (windows -H=windowsgui) and ships the Linux .desktop + icon;
make package-macos assembles an LSUIElement ChartPlotter.app (Info.plist
template + AppIcon.icns) natively on a mac. Tray/app icons are generated
glyphs (gen_icons.go).
GNU Make on Windows (winget/scoop/choco) usually executes recipes through
cmd.exe, so the POSIX-isms in build/build-dock/tile57-lib/clean broke native
builds: VAR=x prefixes, rm -f, [ ... ] tests, /dev/null, @#-comment lines.

Rework those targets to be recipe-shell-agnostic:
- env vars move to make-level 'export' (build: export CGO_ENABLED = 1)
- file tests move into make ($(wildcard)/ifeq replaces test -e and [ -f ])
- file ops route through an OS shim block (explicit 'cmd /C ...' on Windows,
  so they behave the same under cmd.exe and MSYS sh alike)
- outputs gain .exe on Windows; the dock also gets -H=windowsgui natively

Native Windows builds pin the engine lib and C toolchain to the same
<arch>-windows-gnu triple xbuild-tile57.sh cross-links with (zig doubles as
the C compiler; no MinGW needed) and normalize zig's tile57.lib to the
libtile57.a path the Go binding links.

The bake/demo/docs/xbuild targets stay POSIX-only by design (WSL/Git Bash);
README + CLAUDE.md document the split.
With make TILE57=<path>, make builds the C lib from the custom checkout but
the Go binding still resolves via go.mod's replace at ./tile57/bindings/go,
and go dies with the cryptic 'replacement directory ./tile57/bindings/go
does not exist'. Guard build/xbuild with a pure-make parse-time check (no
POSIX shell needed, so it fires on Windows too) that explains the missing
half: create a gitignored go.work replacing the binding at
<path>/bindings/go, per README 'Developing the engine'.
The port probe classified a connection-refused dial as 'free' only when
errors.Is(err, syscall.ECONNREFUSED) matched. On Windows that constant is a
synthetic APPLICATION_ERROR value that Winsock never returns — refused dials
fail with WSAECONNREFUSED (10061, absent from stdlib syscall) — so every
idle port in 8080..8090 read as 'taken by another server' and the dock gave
up without ever spawning chartplotter.

Split the sentinel into per-OS errno_{unix,windows}.go (x/sys/windows
supplies WSAECONNREFUSED; already in the module graph) and add probe unit
tests covering free/ours/other classification.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant