GetServerPassword can block while the system keyring daemon shows its
unlock dialog. Calling it synchronously on the Fyne main thread froze
the event loop, causing Wayland compositors to hide the window.
Move the keyring lookup into a goroutine and dispatch back to the Fyne
thread to show the connecting dialog and attempt the connection.
GLFW's applicationShouldTerminate: converts all quit paths (Cmd+Q, dock,
menu bar) into window close requests and returns NSTerminateCancel, so our
close-to-hide intercept was hiding the window instead of letting the app exit.
Fix by implementing applicationShouldTerminate: in ReopenDelegate, setting a
darwinQuitting flag before forwarding to GLFW's delegate. The close intercept
checks this flag and calls Window.Close() instead of Hide() when quitting.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The early return added in 13cb672 did not account for the reSort flag,
causing the sort button to have no effect when already viewing the
discography tab. Also extend the early-return guard to cover the
groupedReleases case for consistency.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Shuffle moves to the far left of the transport buttons and repeat to the far right, flanking prev/play/next. Both use a new IconButtonSizeSmallest (10% smaller than IconButtonSizeSmaller) with 2dp spacing separating them from the adjacent transport buttons. Wiring updated in bottompanel.go accordingly.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Add -reload-theme CLI flag to re-apply theme via IPC
Sends a reload-theme IPC message to a running instance, causing it to
call fyne.CurrentApp().Settings().SetTheme(m.theme). Follows the same
callback pattern as -show (OnReactivate) and quit (OnExit).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* actually re-read theme file
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add context cancellation to WidgetPool cleanup goroutine
- Properly stop ticker when context is canceled
- Add BackgroundContext() getter method to App for context access
- Pass application context to NewWidgetPool for lifecycle management
This fixes a resource leak where the cleanup goroutine would run
indefinitely without any way to stop it, preventing proper cleanup
on application shutdown.