...
Tawesoft Logo

Source file src/tawesoft.co.uk/go/dialog/dialog-linux.go

Documentation: src/tawesoft.co.uk/go/dialog/dialog-linux.go

     1  // +build linux
     2  
     3  package dialog // import "tawesoft.co.uk/go/dialog"
     4  
     5  import (
     6      "fmt"
     7      "os"
     8      "os/exec"
     9  )
    10  
    11  type provider struct {
    12      command string
    13      alert func(self *provider, title string, message string, args...interface{}) bool
    14  }
    15  
    16  var xmessageProvider = provider{
    17      command: "xmessage",
    18      alert: func(self *provider, title string, message string, args...interface{}) bool {
    19          var buf string = wrap(fmt.Sprintf(title+": "+message+"\n", args...), 60)
    20  
    21          var err = exec.Command(self.command, "-center", buf).Run()
    22          if err != nil { fmt.Printf("system error: %v\n", err) }
    23          return err == nil
    24      },
    25  }
    26  
    27  var zenityProvider = provider{
    28      command: "zenity",
    29      alert: func(self *provider, title string, message string, args...interface{}) bool {
    30          var buf string = fmt.Sprintf(message, args...)
    31  
    32          var err = exec.Command(self.command,
    33              "--info", "--no-markup",
    34              "--title", title,
    35              "--window-icon", "info",
    36              "--width=400",
    37              "--text="+buf,
    38          ).Run()
    39  
    40          if err != nil {
    41              var _, ok = err.(*exec.ExitError)
    42              if ok {
    43                  // fine - we don't care about the return code
    44                  return true
    45              }
    46              // other type of error
    47              fmt.Printf("system error: %v\n", err)
    48          }
    49          return err == nil
    50      },
    51  }
    52  
    53  var stdioProvider = provider{
    54      command: "",
    55      alert: func(_self *provider, title string, message string, args...interface{}) bool {
    56          fmt.Fprintf(os.Stderr, "\n===[%s]===\n\n", title)
    57          fmt.Fprintf(os.Stderr, message, args...)
    58          fmt.Fprintf(os.Stdout, "\n\n=========\n\n")
    59          return true
    60      },
    61  }
    62  
    63  var providers []*provider
    64  
    65  func (p *provider) register() {
    66      if len(p.command) == 0 || haveCommand(p.command) {
    67          providers = append(providers, p)
    68      }
    69  }
    70  
    71  func init() {
    72      providers = make([]*provider, 0, 4)
    73  
    74      // register in order of preference
    75      zenityProvider.register()
    76      xmessageProvider.register()
    77      stdioProvider.register()
    78  }
    79  
    80  func haveCommand(cmd string) bool {
    81      return (exec.Command("sh", "-c", "which "+cmd+" > /dev/null 2>&1").Run() == nil)
    82  }
    83  
    84  func platformAlert(title string, message string, args...interface{}) {
    85      for _, provider := range(providers) {
    86          if provider.alert == nil { continue }
    87          if provider.alert(provider, title, message, args...) { break }
    88      }
    89  }
    90  

View as plain text