decred.org/dcrdex@v1.0.5/client/cmd/bisonw/main_tray.go (about) 1 // This code is available on the terms of the project LICENSE.md file, 2 // also available online at https://blueoakcouncil.org/license/1.0.0. 3 4 //go:build systray 5 6 package main 7 8 import ( 9 "fmt" 10 "os" 11 "path/filepath" 12 13 "decred.org/dcrdex/client/app" 14 "fyne.io/systray" 15 "github.com/pkg/browser" 16 ) 17 18 var ( 19 mainDone = make(chan struct{}) 20 cfg *app.Config 21 ) 22 23 func onReady() { 24 go func() { 25 defer close(mainDone) 26 if err := runCore(cfg); err != nil { 27 fmt.Fprintln(os.Stderr, err) 28 } 29 }() 30 31 go func() { 32 <-appCtx.Done() 33 systray.SetTooltip("Shutting down. Please wait...") 34 <-mainDone 35 systray.Quit() 36 }() 37 38 systray.SetIcon(FavIcon) 39 systray.SetTitle("DCRDEX") 40 systray.SetTooltip("The Decred DEX") 41 42 mStarting := systray.AddMenuItem("Starting...", "Starting up. Please wait...") 43 var addr string 44 var ok bool 45 select { 46 case addr, ok = <-webserverReady: 47 if !ok { // no webserver started 48 fmt.Fprintln(os.Stderr, "Web server required!") 49 cancel() 50 return 51 } 52 case <-mainDone: 53 return 54 } 55 56 mStarting.Hide() 57 58 mOpen := systray.AddMenuItem("Launch browser", "Open the interface in a browser window.") 59 mOpen.SetIcon(FavIconBW) 60 go func() { 61 for range mOpen.ClickedCh { 62 err := browser.OpenURL("http://" + addr) 63 if err != nil { 64 fmt.Fprintln(os.Stderr, err) 65 } 66 } 67 }() 68 69 systray.AddSeparator() 70 71 if logDirURL, err := app.FilePathToURL(filepath.Dir(cfg.LogPath)); err != nil { 72 fmt.Fprintln(os.Stderr, err) 73 } else { 74 mLogs := systray.AddMenuItem("Open logs folder", "Open the folder with your DEX logs.") 75 go func() { 76 for range mLogs.ClickedCh { 77 err := browser.OpenURL(logDirURL) 78 if err != nil { 79 fmt.Fprintln(os.Stderr, err) 80 } 81 } 82 }() 83 } 84 85 if cfgPathURL, err := app.FilePathToURL(cfg.ConfigPath); err != nil { 86 fmt.Fprintln(os.Stderr, err) 87 } else { 88 mConfigFile := systray.AddMenuItem("Edit config file", "Open the config file in a text editor.") 89 go func() { 90 for range mConfigFile.ClickedCh { 91 if _, err := os.Stat(cfg.ConfigPath); err != nil { 92 if os.IsNotExist(err) { 93 fid, err := os.Create(cfg.ConfigPath) 94 if err != nil { 95 fmt.Fprintf(os.Stderr, "failed to create new config file: %v", err) 96 continue 97 } 98 fid.Close() 99 } 100 } 101 err := browser.OpenURL(cfgPathURL) 102 if err != nil { 103 fmt.Fprintln(os.Stderr, err) 104 } 105 } 106 }() 107 } 108 109 systray.AddSeparator() 110 111 mQuit := systray.AddMenuItem("Quit", "Quit the DEX.") 112 go func() { 113 <-mQuit.ClickedCh 114 mOpen.Disable() 115 mQuit.Disable() 116 cancel() 117 }() 118 119 err := browser.OpenURL("http://" + addr) 120 if err != nil { 121 fmt.Fprintln(os.Stderr, err) 122 } 123 } 124 125 func onExit() { 126 // In case we got here before shutting down, do it now. 127 cancel() 128 <-mainDone 129 } 130 131 func main() { 132 // Parse configuration. 133 var err error 134 cfg, err = configure() 135 if err != nil { 136 fmt.Fprintf(os.Stderr, "configuration error: %v", err) 137 os.Exit(1) 138 } 139 systray.Run(onReady, onExit) 140 }