change missing size/pos option means preserved

This commit is contained in:
ShuheiKubota 2019-11-09 17:17:19 +09:00
parent 28336a0991
commit 99e9a1c279

113
vvin.go
View file

@ -111,12 +111,49 @@ func (c maxCmd) Run(g globalCmd) {
} }
type resizeCmd struct { type resizeCmd struct {
Left string `cli:"left,x" default:"0"` Left string `cli:"left,x"`
Top string `cli:"top,y" default:"0"` Top string `cli:"top,y"`
Width string `cli:"width,w" help:"(default: screen size)"` Width string `cli:"width,w"`
Height string `cli:"height,h" help:"(default: screen size)"` Height string `cli:"height,h"`
NoRestorable bool `cli:"norestorable"` NoRestorable bool `cli:"norestorable"`
rect RECT
}
func (c *resizeCmd) Before(g globalCmd) error {
if c.Left == "" && c.Top == "" && c.Width == "" && c.Height == "" {
return errors.New("no options")
}
getWindowRect.Call(uintptr(g.targetHandle), uintptr(unsafe.Pointer(&c.rect)))
oldrect := c.rect
if g.Debug {
rog.Print(oldrect)
}
if c.Left != "" {
c.rect.Left = toInt(c.Left, g.scrWidth)
}
if c.Top != "" {
c.rect.Top = toInt(c.Top, g.scrHeight)
}
if c.Width != "" {
c.rect.Right = c.rect.Left + toInt(c.Width, g.scrWidth)
} else {
c.rect.Right = c.rect.Left + (oldrect.Right - oldrect.Left)
}
if c.Height != "" {
c.rect.Bottom = c.rect.Top + toInt(c.Height, g.scrHeight)
} else {
c.rect.Bottom = c.rect.Top + (oldrect.Bottom - oldrect.Top)
}
if g.Debug {
rog.Print(c.rect)
}
return nil
} }
func (c resizeCmd) Run(g globalCmd) { func (c resizeCmd) Run(g globalCmd) {
@ -127,10 +164,10 @@ func (c resizeCmd) Run(g globalCmd) {
setWindowPos.Call( setWindowPos.Call(
uintptr(g.targetHandle), uintptr(g.targetHandle),
0, 0,
uintptr(toInt(c.Left, g.scrWidth)), uintptr(c.rect.Left),
uintptr(toInt(c.Top, g.scrHeight)), uintptr(c.rect.Top),
uintptr(toInt(c.Width, g.scrWidth)), uintptr(c.rect.Right-c.rect.Left),
uintptr(toInt(c.Height, g.scrHeight)), uintptr(c.rect.Bottom-c.rect.Top),
SWP_NOACTIVATE|SWP_NOZORDER) SWP_NOACTIVATE|SWP_NOZORDER)
if !c.NoRestorable { if !c.NoRestorable {
showWindow.Call(uintptr(g.targetHandle), SW_SHOWNA) showWindow.Call(uintptr(g.targetHandle), SW_SHOWNA)
@ -138,36 +175,60 @@ func (c resizeCmd) Run(g globalCmd) {
} }
type moveCmd struct { type moveCmd struct {
Left string `cli:"left,x" default:"0"` Left string `cli:"left,x"`
Top string `cli:"top,y" default:"0"` Top string `cli:"top,y"`
NoRestorable bool `cli:"norestorable"` NoRestorable bool `cli:"norestorable"`
rect RECT
}
func (c *moveCmd) Before(g globalCmd) error {
if c.Left == "" && c.Top == "" {
return errors.New("no options")
}
getWindowRect.Call(uintptr(g.targetHandle), uintptr(unsafe.Pointer(&c.rect)))
if g.Debug {
rog.Print(c.rect)
}
if c.Left != "" {
old := c.rect.Left
c.rect.Left = toInt(c.Left, g.scrWidth)
c.rect.Right += -old + c.rect.Left
}
if c.Top != "" {
old := c.rect.Top
c.rect.Top = toInt(c.Top, g.scrHeight)
c.rect.Bottom += -old + c.rect.Top
}
if g.Debug {
rog.Print(c.rect)
}
return nil
} }
func (c moveCmd) Run(g globalCmd) { func (c moveCmd) Run(g globalCmd) {
rect := struct {
Left, Top, Right, Bottom int32
}{}
if !c.NoRestorable { if !c.NoRestorable {
showWindow.Call(uintptr(g.targetHandle), SW_HIDE) showWindow.Call(uintptr(g.targetHandle), SW_HIDE)
getWindowRect.Call(uintptr(g.targetHandle), uintptr(unsafe.Pointer(&rect)))
showWindow.Call(uintptr(g.targetHandle), SW_MAXIMIZE) showWindow.Call(uintptr(g.targetHandle), SW_MAXIMIZE)
setWindowPos.Call( setWindowPos.Call(
uintptr(g.targetHandle), uintptr(g.targetHandle),
0, 0,
uintptr(toInt(c.Left, g.scrWidth)), uintptr(c.rect.Left),
uintptr(toInt(c.Top, g.scrHeight)), uintptr(c.rect.Top),
uintptr(rect.Right-rect.Left), uintptr(c.rect.Right-c.rect.Left),
uintptr(rect.Bottom-rect.Top), uintptr(c.rect.Bottom-c.rect.Top),
SWP_NOACTIVATE|SWP_NOZORDER) SWP_NOACTIVATE|SWP_NOZORDER)
showWindow.Call(uintptr(g.targetHandle), SW_SHOWNA) showWindow.Call(uintptr(g.targetHandle), SW_SHOWNA)
} else { } else {
setWindowPos.Call( setWindowPos.Call(
uintptr(g.targetHandle), uintptr(g.targetHandle),
0, 0,
uintptr(toInt(c.Left, g.scrWidth)), uintptr(c.rect.Left),
uintptr(toInt(c.Top, g.scrHeight)), uintptr(c.rect.Top),
0, 0,
0, 0,
SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE) SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE)
@ -221,6 +282,10 @@ type (
Handle syscall.Handle Handle syscall.Handle
PID int PID int
} }
RECT struct {
Left, Top, Right, Bottom int32
}
) )
func listAllWindows() (wins []*Window, err error) { func listAllWindows() (wins []*Window, err error) {
@ -290,7 +355,7 @@ func ancestors() []int {
return an return an
} }
func toInt(s string, max int) int { func toInt(s string, max int) int32 {
if strings.HasSuffix(s, "%") { if strings.HasSuffix(s, "%") {
i, err := strconv.Atoi(s[:len(s)-1]) i, err := strconv.Atoi(s[:len(s)-1])
if err != nil { if err != nil {
@ -299,12 +364,12 @@ func toInt(s string, max int) int {
if i > 100 { if i > 100 {
i = 100 i = 100
} }
return int(math.Trunc(float64(max*i) / 100)) return int32(math.Trunc(float64(max*i) / 100))
} else { } else {
i, err := strconv.Atoi(s) i, err := strconv.Atoi(s)
if err != nil { if err != nil {
return 0 return 0
} }
return i return int32(i)
} }
} }