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
This commit is contained in:
parent
e8feb8401f
commit
a839fe4655
6 changed files with 87 additions and 62 deletions
20
cmd_alpha.go
20
cmd_alpha.go
|
@ -5,8 +5,9 @@ package vvin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/shu-go/rog"
|
"github.com/shu-go/nmfmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
type alphaCmd struct {
|
type alphaCmd struct {
|
||||||
|
@ -14,19 +15,22 @@ type alphaCmd struct {
|
||||||
|
|
||||||
func (c alphaCmd) Run(args []string, g globalCmd) error {
|
func (c alphaCmd) Run(args []string, g globalCmd) error {
|
||||||
if len(args) != 1 {
|
if len(args) != 1 {
|
||||||
return errors.New("an argument is required")
|
return errors.New("an argument (opacity; 0%-100% or 0-255) is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
alpha := toInt(args[0], 255)
|
opacity := toInt(args[0], 255)
|
||||||
if g.Debug {
|
|
||||||
rog.Printf("alpha = %v -> %v", args[0], alpha)
|
g.debug(os.Stderr, "opacity $=arg:q -> $opacity/255\n",
|
||||||
}
|
nmfmt.M{
|
||||||
|
"arg": args[0],
|
||||||
|
"opacity": opacity,
|
||||||
|
})
|
||||||
|
|
||||||
style, _, _ := getWindowLong.Call(uintptr(g.targetHandle), gwlEXStyle)
|
style, _, _ := getWindowLong.Call(uintptr(g.targetHandle), gwlEXStyle)
|
||||||
setWindowLong.Call(uintptr(g.targetHandle), gwlEXStyle, style|wsEXLayered)
|
setWindowLong.Call(uintptr(g.targetHandle), gwlEXStyle, style|wsEXLayered)
|
||||||
|
|
||||||
setLayeredWindowAttributes.Call(uintptr(g.targetHandle), 0, uintptr(alpha), lwaAlpha)
|
setLayeredWindowAttributes.Call(uintptr(g.targetHandle), 0, uintptr(opacity), lwaAlpha)
|
||||||
if alpha == 255 {
|
if opacity == 255 {
|
||||||
setWindowLong.Call(uintptr(g.targetHandle), gwlEXStyle, style&^wsEXLayered)
|
setWindowLong.Call(uintptr(g.targetHandle), gwlEXStyle, style&^wsEXLayered)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,10 @@ package vvin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"os"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shu-go/rog"
|
"github.com/shu-go/nmfmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
type resizeCmd struct {
|
type resizeCmd struct {
|
||||||
|
@ -32,9 +33,11 @@ func (c *resizeCmd) Before(g globalCmd) error {
|
||||||
|
|
||||||
oldrect := c.rect
|
oldrect := c.rect
|
||||||
|
|
||||||
if g.Debug {
|
g.debug(os.Stderr, "$=original\n",
|
||||||
rog.Print(oldrect)
|
nmfmt.M{
|
||||||
}
|
"original": oldrect,
|
||||||
|
})
|
||||||
|
|
||||||
if c.Left != "" {
|
if c.Left != "" {
|
||||||
c.rect.Left = toInt(c.Left, g.scrWidth)
|
c.rect.Left = toInt(c.Left, g.scrWidth)
|
||||||
}
|
}
|
||||||
|
@ -51,12 +54,11 @@ func (c *resizeCmd) Before(g globalCmd) error {
|
||||||
} else {
|
} else {
|
||||||
c.rect.Bottom = c.rect.Top + (oldrect.Bottom - oldrect.Top)
|
c.rect.Bottom = c.rect.Top + (oldrect.Bottom - oldrect.Top)
|
||||||
}
|
}
|
||||||
if g.Debug {
|
|
||||||
if c.Restore {
|
if c.Restore {
|
||||||
rog.Print("restore")
|
g.debug(os.Stderr, "restore\n")
|
||||||
} else {
|
} else {
|
||||||
rog.Print(c.rect)
|
g.debug(os.Stderr, "resized $rect\n", nmfmt.M{"rect": c.rect})
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
19
cmd_wait.go
19
cmd_wait.go
|
@ -12,16 +12,14 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/shu-go/gli"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type waitCmd struct {
|
type waitCmd struct {
|
||||||
_ struct{} `help:"[--close] {Title}"`
|
_ struct{} `help:"[--close] {Title}"`
|
||||||
|
|
||||||
Closed bool `help:"wait until the window is closed"`
|
Closed bool `help:"wait until the window is closed"`
|
||||||
Interval gli.Duration `cli:"interval,i=DURATION" default:"1s"`
|
Interval time.Duration `cli:"interval,i=DURATION" default:"1s"`
|
||||||
Timeout gli.Duration `cli:"timeout=DURATION" default:"0s" help:"zelo value means ininite"`
|
Timeout time.Duration `cli:"timeout=DURATION" default:"0s" help:"zero value means ininite"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c waitCmd) Run(args []string) error {
|
func (c waitCmd) Run(args []string) error {
|
||||||
|
@ -33,10 +31,13 @@ func (c waitCmd) Run(args []string) error {
|
||||||
t := strings.ToLower(args[0])
|
t := strings.ToLower(args[0])
|
||||||
|
|
||||||
var ctx context.Context
|
var ctx context.Context
|
||||||
|
var cancel func()
|
||||||
|
|
||||||
if c.Timeout == 0 {
|
if c.Timeout == 0 {
|
||||||
ctx = context.Background()
|
ctx = context.Background()
|
||||||
|
cancel = func() {}
|
||||||
} else {
|
} else {
|
||||||
ctx, _ = context.WithTimeout(context.Background(), c.Timeout.Duration())
|
ctx, cancel = context.WithTimeout(context.Background(), c.Timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
signalChan := make(chan os.Signal, 1)
|
signalChan := make(chan os.Signal, 1)
|
||||||
|
@ -48,6 +49,7 @@ waitLoop:
|
||||||
for {
|
for {
|
||||||
wins, err := listAllWindows()
|
wins, err := listAllWindows()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
cancel()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,14 +69,15 @@ waitLoop:
|
||||||
fmt.Fprintln(os.Stderr, "cancelled")
|
fmt.Fprintln(os.Stderr, "cancelled")
|
||||||
break waitLoop
|
break waitLoop
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
fmt.Fprintln(os.Stderr, "cancelled")
|
fmt.Fprintln(os.Stderr, "cancelled (timeout)")
|
||||||
break waitLoop
|
break waitLoop
|
||||||
default:
|
default:
|
||||||
//nop
|
//nop
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(c.Interval.Duration())
|
time.Sleep(c.Interval)
|
||||||
}
|
}
|
||||||
|
cancel()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
15
go.mod
15
go.mod
|
@ -1,9 +1,16 @@
|
||||||
module git.bigun.dev/evan/vvin
|
module github.com/shu-go/vvin
|
||||||
|
|
||||||
go 1.13
|
go 1.21
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/mitchellh/go-ps v1.0.0
|
github.com/mitchellh/go-ps v1.0.0
|
||||||
github.com/shu-go/gli v1.5.7
|
github.com/shu-go/gli/v2 v2.0.1
|
||||||
github.com/shu-go/rog v0.1.0
|
github.com/shu-go/nmfmt v0.1.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/rivo/uniseg v0.4.4 // indirect
|
||||||
|
github.com/shu-go/cliparser v0.2.2 // indirect
|
||||||
)
|
)
|
||||||
|
|
25
go.sum
25
go.sum
|
@ -1,22 +1,17 @@
|
||||||
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
|
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||||
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
|
||||||
github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b h1:9+ke9YJ9KGWw5ANXK6ozjoK47uI3uNbXv4YVINBnGm8=
|
|
||||||
github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
|
|
||||||
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
|
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
|
||||||
github.com/shu-go/cliparser v0.2.1 h1:09Nqe/SBmHr00DAQM3JxkVnSCBkGf8P5+7EtHWVndh0=
|
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
github.com/shu-go/cliparser v0.2.1/go.mod h1:oX+xgwUi9B2OzBFudKc5ayoqWhlVAbuN67rAqyWvvQ4=
|
github.com/shu-go/cliparser v0.2.2 h1:EONHyGHC+9l2mukTBNsxvngXro73T22kXb+agVFd0CY=
|
||||||
github.com/shu-go/cliparser v0.2.2/go.mod h1:oX+xgwUi9B2OzBFudKc5ayoqWhlVAbuN67rAqyWvvQ4=
|
github.com/shu-go/cliparser v0.2.2/go.mod h1:oX+xgwUi9B2OzBFudKc5ayoqWhlVAbuN67rAqyWvvQ4=
|
||||||
github.com/shu-go/clise v0.0.0-20190822023516-79849fb81cfe/go.mod h1:VLiMEzXMBozBLD37i3id3qPflaupus48v/979ipQ43s=
|
github.com/shu-go/gli/v2 v2.0.1 h1:XA1QSfUdpWW1FIqLjuXo+Gs/IjEy+uviuxKQ45IRYC8=
|
||||||
github.com/shu-go/gli v1.5.2 h1:sn15ZBwgy3cAhMQc3+5IhTzCZxi3kuESVPfP3D7qJ8E=
|
github.com/shu-go/gli/v2 v2.0.1/go.mod h1:pSC0XKb69hEarQpiQU74CNiKpcS7a90iJAMUGL3SinQ=
|
||||||
github.com/shu-go/gli v1.5.2/go.mod h1:3m4JxIHbLp5yx2LgyKOj8cqN2IcJC0slhZB6mewmlvI=
|
|
||||||
github.com/shu-go/gli v1.5.7/go.mod h1:WZSG6NFYr/1rwT2F3Oms0gWyklvjJNDW6qvBfZ/tM4U=
|
|
||||||
github.com/shu-go/gotwant v0.0.0-20190920074605-b4f19c0bac91 h1:nwDc3kHbf9scf1UZIWiWw5tZF3Z4yOJAMjNN+kYXJwE=
|
github.com/shu-go/gotwant v0.0.0-20190920074605-b4f19c0bac91 h1:nwDc3kHbf9scf1UZIWiWw5tZF3Z4yOJAMjNN+kYXJwE=
|
||||||
github.com/shu-go/gotwant v0.0.0-20190920074605-b4f19c0bac91/go.mod h1:FZepfqvib0mXjHiaQPTv0RUD5QMpMA/FHLfBQjZRRQg=
|
github.com/shu-go/gotwant v0.0.0-20190920074605-b4f19c0bac91/go.mod h1:FZepfqvib0mXjHiaQPTv0RUD5QMpMA/FHLfBQjZRRQg=
|
||||||
github.com/shu-go/rog v0.1.0 h1:mplglNOiUN1ujq0UTkosB5NL/GQhFX2gRYcen7aEhTY=
|
github.com/shu-go/nmfmt v0.1.0 h1:gL5u0yiIsegh2gofeNUpAJPWCNgOF+qIivBc9qO/KoE=
|
||||||
github.com/shu-go/rog v0.1.0/go.mod h1:gO+FpqgnHoxbF6FPJN6PaAEl6hcZRLNL+nQZgbbElzo=
|
github.com/shu-go/nmfmt v0.1.0/go.mod h1:ulgNf0sfuQEEdX2cM71sGviSEKDf9DUXlm5WtFn0PJY=
|
||||||
|
|
48
vvin.go
48
vvin.go
|
@ -1,11 +1,9 @@
|
||||||
//go:build windows
|
package main
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package vvin
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -14,13 +12,19 @@ import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/mitchellh/go-ps"
|
"github.com/mitchellh/go-ps"
|
||||||
"github.com/shu-go/gli"
|
"github.com/shu-go/gli/v2"
|
||||||
|
"github.com/shu-go/nmfmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Version is app version
|
||||||
|
var Version string
|
||||||
|
|
||||||
type globalCmd struct {
|
type globalCmd struct {
|
||||||
Target string `cli:"target,t=WINDOW_TITLE" help:"default to current window"`
|
Target string `cli:"target,t=WINDOW_TITLE" help:"default to current window"`
|
||||||
Debug bool `help:"output debug info"`
|
Debug bool `help:"output debug info"`
|
||||||
|
|
||||||
|
debug func(io.Writer, string, ...any) (int, error) // nmfmt
|
||||||
|
|
||||||
Minimize minCmd `cli:"minimize,min" help:"minimize/restore"`
|
Minimize minCmd `cli:"minimize,min" help:"minimize/restore"`
|
||||||
Maximize maxCmd `cli:"maximize,max" help:"maximize/restore"`
|
Maximize maxCmd `cli:"maximize,max" help:"maximize/restore"`
|
||||||
Resize resizeCmd `cli:"resize,move,mv" help:"resize/move"`
|
Resize resizeCmd `cli:"resize,move,mv" help:"resize/move"`
|
||||||
|
@ -30,11 +34,18 @@ type globalCmd struct {
|
||||||
|
|
||||||
targetHandle syscall.Handle
|
targetHandle syscall.Handle
|
||||||
|
|
||||||
scrWidth, scrHeight int
|
scrWidth, scrHeight int
|
||||||
frameWidth, frameHeight int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *globalCmd) Before() error {
|
func (c *globalCmd) Before() error {
|
||||||
|
c.debug = func(io.Writer, string, ...any) (int, error) {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
if c.Debug {
|
||||||
|
c.debug = nmfmt.Fprintf
|
||||||
|
}
|
||||||
|
c.debug(os.Stderr, "Debug enabled.\n")
|
||||||
|
|
||||||
wins, err := listAllWindows()
|
wins, err := listAllWindows()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -46,6 +57,12 @@ func (c *globalCmd) Before() error {
|
||||||
}
|
}
|
||||||
c.targetHandle = win.Handle
|
c.targetHandle = win.Handle
|
||||||
|
|
||||||
|
c.debug(os.Stderr, "$=target:q -> $=handle:x\n",
|
||||||
|
nmfmt.M{
|
||||||
|
"target": c.Target,
|
||||||
|
"handle": c.targetHandle,
|
||||||
|
})
|
||||||
|
|
||||||
w, _, _ := getSystemMetrics.Call(smCXVirtualScreen)
|
w, _, _ := getSystemMetrics.Call(smCXVirtualScreen)
|
||||||
h, _, _ := getSystemMetrics.Call(smCYVirtualScreen)
|
h, _, _ := getSystemMetrics.Call(smCYVirtualScreen)
|
||||||
c.scrWidth = int(w)
|
c.scrWidth = int(w)
|
||||||
|
@ -54,15 +71,17 @@ func (c *globalCmd) Before() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Start(args []string) error {
|
func main() {
|
||||||
app := gli.NewWith(&globalCmd{})
|
app := gli.NewWith(&globalCmd{})
|
||||||
app.Name = "vvin"
|
app.Name = "vvin"
|
||||||
app.Desc = "Change window properties for Windows"
|
app.Desc = "Change window properties for Windows"
|
||||||
app.Version = "0.8.0"
|
app.Version = Version
|
||||||
app.Usage = ``
|
app.Usage = ``
|
||||||
app.Copyright = "(C) 2019 Shuhei Kubota"
|
app.Copyright = "(C) 2019 Shuhei Kubota"
|
||||||
app.SuppressErrorOutput = true
|
app.SuppressErrorOutput = true
|
||||||
return app.Run(args)
|
if err := app.Run(os.Args); err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -112,8 +131,8 @@ const (
|
||||||
hwndTopmost = ^uintptr(0)
|
hwndTopmost = ^uintptr(0)
|
||||||
hwndNoTopmost = ^uintptr(1)
|
hwndNoTopmost = ^uintptr(1)
|
||||||
|
|
||||||
spiGetAnimation = 0x0048
|
//spiGetAnimation = 0x0048
|
||||||
spiSetAnimation = 0x0049
|
//spiSetAnimation = 0x0049
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
@ -126,11 +145,6 @@ type (
|
||||||
rect struct {
|
rect struct {
|
||||||
Left, Top, Right, Bottom int32
|
Left, Top, Right, Bottom int32
|
||||||
}
|
}
|
||||||
|
|
||||||
anmationinfo struct {
|
|
||||||
Size uint32
|
|
||||||
Animate int32
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func listAllWindows() (wins []*window, err error) {
|
func listAllWindows() (wins []*window, err error) {
|
||||||
|
|
Loading…
Reference in a new issue