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  }