vvin/cmd_wait.go
Evan a839fe4655 Update from upstream by squashing
commit 6172ea4fdf435d7125697d40af2c17ae5ff3a8c6
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Sat Nov 4 15:30:11 2023 +0900

    build: same config as csv2xlsx

commit 6c522e8ca857f7218db476153ffd06e8b7d2bdde
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Sat Nov 4 15:11:53 2023 +0900

    change: debug output

commit 4cec3963cdc20c781bbacde8be927591145b95ca
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Sat Nov 4 15:10:26 2023 +0900

    chore: use gli/v2

commit 958c93d6256bbb4611f21f870087c074a783001b
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Fri Nov 3 20:45:57 2023 +0900

    fix(alpha): improve output, variable name

commit 8bc79c6bd2c4a93c087e8fea7c2e306e7028466c
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Fri Nov 3 20:18:34 2023 +0900

    refactor: remove unused code

commit 7a14926dd7f83dd6a41f3baa6c905b7c81191a93
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Fri Nov 3 20:18:59 2023 +0900

    build: go 1.21

commit 40007434e6fdbc3ad485862b3d2785d7ba7263a8
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Fri Nov 3 20:18:15 2023 +0900

    fix: call cancel finally

commit 5b02edacd34942adedf38d089737d3c8130d52e3
Author: Shuhei Kubota <kubota.shuhei+github@gmail.com>
Date:   Fri Nov 3 20:16:34 2023 +0900

    fix: typo
2024-04-04 10:50:39 -04:00

84 lines
1.4 KiB
Go

//go:build windows
// +build windows
package vvin
import (
"context"
"errors"
"fmt"
"os"
"os/signal"
"strings"
"syscall"
"time"
)
type waitCmd struct {
_ struct{} `help:"[--close] {Title}"`
Closed bool `help:"wait until the window is closed"`
Interval time.Duration `cli:"interval,i=DURATION" default:"1s"`
Timeout time.Duration `cli:"timeout=DURATION" default:"0s" help:"zero value means ininite"`
}
func (c waitCmd) Run(args []string) error {
if len(args) != 1 {
return errors.New("not one target")
}
an := ancestors()
t := strings.ToLower(args[0])
var ctx context.Context
var cancel func()
if c.Timeout == 0 {
ctx = context.Background()
cancel = func() {}
} else {
ctx, cancel = context.WithTimeout(context.Background(), c.Timeout)
}
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt)
fmt.Println("Press Ctrl+C to cancel.")
waitLoop:
for {
wins, err := listAllWindows()
if err != nil {
cancel()
return err
}
win := findFirstTarget(t, wins, an)
if c.Closed {
if win == nil {
break
}
} else {
if win != nil {
break
}
}
select {
case <-signalChan:
fmt.Fprintln(os.Stderr, "cancelled")
break waitLoop
case <-ctx.Done():
fmt.Fprintln(os.Stderr, "cancelled (timeout)")
break waitLoop
default:
//nop
}
time.Sleep(c.Interval)
}
cancel()
return nil
}