diff --git a/cmd/zenity/main.go b/cmd/zenity/main.go index 8940349..e8877a6 100644 --- a/cmd/zenity/main.go +++ b/cmd/zenity/main.go @@ -741,12 +741,12 @@ func addColumn(s string) error { func addFileFilter(s string) error { var filter zenity.FileFilter - if head, tail, cut := strings.Cut(s, "|"); cut { - filter.Name = head - s = tail + if name, rest, cut := strings.Cut(s, "|"); cut { + filter.Name = name + s = rest } - filter.Patterns = strings.Split(strings.Trim(s, " "), " ") + filter.Patterns = strings.Fields(s) fileFilters = append(fileFilters, filter) return nil } diff --git a/cmd/zenity/notify.go b/cmd/zenity/notify.go index 2c8bf8d..7fedd78 100644 --- a/cmd/zenity/notify.go +++ b/cmd/zenity/notify.go @@ -25,14 +25,13 @@ func notify(opts ...zenity.Option) error { ico := zenity.NoIcon for scanner := bufio.NewScanner(os.Stdin); scanner.Scan(); { line := scanner.Text() - var cmd, msg string - if n := strings.IndexByte(line, ':'); n >= 0 { - cmd = strings.TrimSpace(line[:n]) - msg = strings.TrimSpace(zencmd.Unescape(line[n+1:])) - } else { + cmd, msg, cut := strings.Cut(line, ":") + if !cut { os.Stderr.WriteString("Could not parse command from stdin\n") continue } + cmd = strings.TrimSpace(cmd) + msg = strings.TrimSpace(zencmd.Unescape(msg)) switch cmd { case "icon": switch msg { @@ -51,9 +50,9 @@ func notify(opts ...zenity.Option) error { } case "message", "tooltip": opts := []zenity.Option{ico} - if n := strings.IndexByte(msg, '\n'); n >= 0 { - opts = append(opts, zenity.Title(msg[:n])) - msg = msg[n+1:] + if title, rest, cut := strings.Cut(msg, "\n"); cut { + opts = append(opts, zenity.Title(title)) + msg = rest } if err := zenity.Notify(msg, opts...); err != nil { return err diff --git a/internal/win/ole32.go b/internal/win/ole32.go index dd8be8b..be88c70 100644 --- a/internal/win/ole32.go +++ b/internal/win/ole32.go @@ -60,5 +60,6 @@ type IBindCtx struct{ IUnknown } //sys CoCreateInstance(clsid *GUID, unkOuter *IUnknown, clsContext int32, iid *GUID, address unsafe.Pointer) (res error) = ole32.CoCreateInstance func guid(s string) *GUID { + // TODO: use unsafe.StringData after 1.20 return (*GUID)(unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&s)).Data)) } diff --git a/internal/zencmd/window_unix.go b/internal/zencmd/window_unix.go index 1b98254..6450288 100644 --- a/internal/zencmd/window_unix.go +++ b/internal/zencmd/window_unix.go @@ -92,12 +92,10 @@ func getWindowIDs() ([]string, error) { return nil, err } - if i := bytes.IndexByte(out, '\t'); i < 0 { - return nil, fmt.Errorf("xprop: unexpected output: %q", out) - } else { - out = out[i+1:] + if _, out, cut := bytes.Cut(out, []byte("\t")); cut { + return strings.Split(string(out), ", "), nil } - return strings.Split(string(out), ", "), nil + return nil, fmt.Errorf("xprop: unexpected output: %q", out) } func getWindowPid(id string) (int, error) { @@ -106,10 +104,8 @@ func getWindowPid(id string) (int, error) { return 0, err } - if i := bytes.IndexByte(out, '\t'); i < 0 { - return 0, fmt.Errorf("xprop: unexpected output: %q", out) - } else { - out = out[i+1:] + if _, out, cut := bytes.Cut(out, []byte("\t")); cut { + return strconv.Atoi(string(out)) } - return strconv.Atoi(string(out)) + return 0, fmt.Errorf("xprop: unexpected output: %q", out) } diff --git a/internal/zenutil/osa_generator.go b/internal/zenutil/osa_generator.go index e4e8bee..eb6c21a 100644 --- a/internal/zenutil/osa_generator.go +++ b/internal/zenutil/osa_generator.go @@ -33,7 +33,7 @@ func main() { if err != nil { log.Fatal(err) } - if bytes.ContainsAny(data, "`") { + if bytes.ContainsRune(data, '`') { log.Fatalf("illegal character: %s: `", name) } _, err = template.New(file.Name()).Funcs(funcs).Parse(string(data)) diff --git a/notify_darwin.go b/notify_darwin.go index e15ee0e..43490c4 100644 --- a/notify_darwin.go +++ b/notify_darwin.go @@ -8,13 +8,14 @@ import ( func notify(text string, opts options) error { var data zenutil.Notify - data.Text = text data.Options.Title = opts.title - - if i := strings.IndexByte(text, '\n'); i >= 0 && i < len(text) { - data.Options.Subtitle = text[:i] - data.Text = text[i+1:] + if sub, body, cut := strings.Cut(text, "\n"); cut { + data.Options.Subtitle = sub + data.Text = body + } else { + data.Text = text } + _, err := zenutil.Run(opts.ctx, "notify", data) if err != nil { return err