Fix exit from systray (#4337)

This commit is contained in:
DingDongSoLong4 2023-12-02 17:44:20 +02:00 committed by GitHub
parent d4ef182871
commit ccb1b7c3c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 10 deletions

View file

@ -23,7 +23,7 @@ type FaviconProvider interface {
// Start starts the desktop icon process. It blocks until the process exits. // Start starts the desktop icon process. It blocks until the process exits.
// MUST be run on the main goroutine or will have no effect on macOS // MUST be run on the main goroutine or will have no effect on macOS
func Start(exit chan<- int, faviconProvider FaviconProvider) { func Start(exit chan int, faviconProvider FaviconProvider) {
if IsDesktop() { if IsDesktop() {
hideConsole() hideConsole()

View file

@ -2,7 +2,7 @@
package desktop package desktop
func startSystray(exit chan<- int, favicon FaviconProvider) { func startSystray(exit chan int, favicon FaviconProvider) {
// The systray is not available on Linux because the required libraries (libappindicator3 and gtk+3.0) // The systray is not available on Linux because the required libraries (libappindicator3 and gtk+3.0)
// are not able to be statically compiled. Technically, the systray works perfectly fine when dynamically // are not able to be statically compiled. Technically, the systray works perfectly fine when dynamically
// linked, but we cannot distribute it for compatibility reasons. // linked, but we cannot distribute it for compatibility reasons.

View file

@ -14,7 +14,7 @@ import (
) )
// MUST be run on the main goroutine or will have no effect on macOS // MUST be run on the main goroutine or will have no effect on macOS
func startSystray(exit chan<- int, faviconProvider FaviconProvider) { func startSystray(exit chan int, faviconProvider FaviconProvider) {
// Shows a small notification to inform that Stash will no longer show a terminal window, // Shows a small notification to inform that Stash will no longer show a terminal window,
// and instead will be available in the tray. Will only show the first time a pre-desktop integration // and instead will be available in the tray. Will only show the first time a pre-desktop integration
// system is started from a non-terminal method, e.g. double-clicking an icon. // system is started from a non-terminal method, e.g. double-clicking an icon.
@ -23,7 +23,7 @@ func startSystray(exit chan<- int, faviconProvider FaviconProvider) {
SendNotification("Stash has moved!", "Stash now runs in your tray, instead of a terminal window.") SendNotification("Stash has moved!", "Stash now runs in your tray, instead of a terminal window.")
c.Set(config.ShowOneTimeMovedNotification, false) c.Set(config.ShowOneTimeMovedNotification, false)
if err := c.Write(); err != nil { if err := c.Write(); err != nil {
logger.Errorf("Error while writing configuration file: %s", err.Error()) logger.Errorf("Error while writing configuration file: %v", err)
} }
} }
@ -37,11 +37,16 @@ func startSystray(exit chan<- int, faviconProvider FaviconProvider) {
// } // }
// }() // }()
for { // "intercept" an exit code to quit the systray, allowing the call to systray.Run() below to return.
systray.Run(func() { go func() {
systrayInitialize(exit, faviconProvider) exitCode := <-exit
}, nil) systray.Quit()
} exit <- exitCode
}()
systray.Run(func() {
systrayInitialize(exit, faviconProvider)
}, nil)
} }
func systrayInitialize(exit chan<- int, faviconProvider FaviconProvider) { func systrayInitialize(exit chan<- int, faviconProvider FaviconProvider) {
@ -85,8 +90,8 @@ func systrayInitialize(exit chan<- int, faviconProvider FaviconProvider) {
case <-openStashButton.ClickedCh: case <-openStashButton.ClickedCh:
openURLInBrowser("") openURLInBrowser("")
case <-quitStashButton.ClickedCh: case <-quitStashButton.ClickedCh:
systray.Quit()
exit <- 0 exit <- 0
return
} }
} }
}() }()