1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
package rbar_util
import (
"os"
"io"
"fmt"
)
type Impl struct {
LeftClick func() error
MiddleClick func() error
RightClick func() error
ScrollUp func() error
ScrollDown func() error
Update func(tag string) error
}
func gerror(status int, err error, format string, a ...interface{}) {
msg := fmt.Sprintf(format, a...)
if err == nil {
fmt.Fprintf(os.Stderr, "%s: %s", os.Args[0], msg)
} else {
fmt.Fprintf(os.Stderr, "%s: %s: %v", os.Args[0], msg, err)
}
if status != 0 {
os.Exit(status)
}
}
func errusage(fmt string, a ...interface{}) {
gerror(0, nil, fmt, a...)
usage(os.Stderr)
os.Exit(2)
}
func usage(w io.Writer) {
fmt.Fprintf(w, "Usage: %[1]v NN_LABEL\n or: %[1]v BTN_ID\n or: %[1]v -h\n", os.Args[0])
}
func Main(impl Impl) {
if len(os.Args) != 2 {
errusage("exactly 1 argument expected, got %d", len(os.Args)-1)
}
var fn func() error
switch os.Args[1] {
case "-h":
usage(os.Stdout)
os.Exit(0)
case "1": fn = impl.LeftClick;
case "2": fn = impl.MiddleClick;
case "3": fn = impl.RightClick;
case "4": fn = impl.ScrollUp;
case "5": fn = impl.ScrollDown;
default:
arg := os.Args[1]
if len(arg) > 3 && '0' <= arg[0] && arg[0] <= '9' && '0' <= arg[1] && arg[1] <= '9' && arg[2] == '_' {
if impl.Update != nil {
fn = func() error { return impl.Update(arg) }
}
} else {
errusage("invalid argument: %s\n", os.Args[1])
}
}
if fn == nil {
fn = func() error { return nil }
}
if os.Getenv("XDG_RUNTIME_DIR") == "" {
gerror(6, nil, "XDG_RUNTIME_DIR isn't set")
}
err := fn()
if err != nil && err != NoRbar{
gerror(1, err, "")
}
os.Exit(0)
}
|