feat(dock): desktop launcher — tray/menu-bar app that runs the server#52
Open
beetlebugorg wants to merge 4 commits into
Open
feat(dock): desktop launcher — tray/menu-bar app that runs the server#52beetlebugorg wants to merge 4 commits into
beetlebugorg wants to merge 4 commits into
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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).