renamed structs and functions to better fit packages and added a test program

This commit is contained in:
InventorXtreme 2024-05-23 23:20:17 -04:00
parent 9783251f41
commit f3ac5a48d5
7 changed files with 186 additions and 35 deletions

50
frame.go Normal file
View file

@ -0,0 +1,50 @@
package pinwindows
import (
// "fmt"
rl "github.com/gen2brain/raylib-go/raylib"
)
// frame struct - used for grouping elements together. Will eventually be drawable and autodraw a
// list of elements that will be autoreized and managed by the frame
type Frame struct {
Texture *rl.RenderTexture2D
Size rl.Vector2
ScrollH bool
ScrollW bool
ScrollOffsetH float32
ScrollOffsetW float32
}
func NewFrame(w, h int) Frame {
texture := rl.LoadRenderTexture(int32(w), int32(h))
rframe := Frame{}
rframe.Texture = &texture
rframe.Size = rl.Vector2{X: float32(w), Y: float32(h)}
return Frame{Texture: &texture, Size: rl.Vector2{X: float32(w), Y: float32(h)}, ScrollW: false, ScrollH: false}
}
func (f *Frame) Resize(w, h int) {
rl.UnloadRenderTexture(*f.Texture)
f.Size.X += float32(w)
f.Size.Y += float32(h)
*f.Texture = rl.LoadRenderTexture(int32(f.Size.X), int32(f.Size.Y))
}
func (f *Frame) BeginDrawMode() {
rl.BeginTextureMode(*f.Texture)
var startposH int32 = int32(0 + f.ScrollOffsetH)
var startposW int32 = int32(0 + f.ScrollOffsetW)
rl.BeginScissorMode(startposW, startposH, int32(f.Size.X-float32(startposW)), int32(f.Size.Y-float32(startposH)))
}
func (f *Frame) EndDrawMode() {
rl.EndScissorMode()
rl.EndTextureMode()
}
func (f *Frame) Draw() {
DrawTextureFlipped(&f.Texture.Texture, 0, 0)
}

7
go.mod
View file

@ -2,9 +2,12 @@ module git.dummkopf.live/InventorX/pinwindows
go 1.22.2 go 1.22.2
require github.com/gen2brain/raylib-go/raylib v0.0.0-20240421191056-278df68f40bb require (
github.com/gen2brain/raylib-go/raygui v0.0.0-20240522200953-b7c9eeec1b29
github.com/gen2brain/raylib-go/raylib v0.0.0-20240522200953-b7c9eeec1b29
)
require ( require (
github.com/ebitengine/purego v0.7.1 // indirect github.com/ebitengine/purego v0.7.1 // indirect
golang.org/x/sys v0.19.0 // indirect golang.org/x/sys v0.20.0 // indirect
) )

6
go.sum
View file

@ -2,11 +2,17 @@ github.com/ebitengine/purego v0.6.0-alpha.1.0.20231122024802-192c5e846faa h1:Ik7
github.com/ebitengine/purego v0.6.0-alpha.1.0.20231122024802-192c5e846faa/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/ebitengine/purego v0.6.0-alpha.1.0.20231122024802-192c5e846faa/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA=
github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
github.com/gen2brain/raylib-go/raygui v0.0.0-20240522200953-b7c9eeec1b29 h1:9bC6G+GJcebNe4y7AQTASzbq/35uCAZpna5Yaxh5fY8=
github.com/gen2brain/raylib-go/raygui v0.0.0-20240522200953-b7c9eeec1b29/go.mod h1:Ra1zgJP7vnGst+STvzPPiVJhjicklFWONCz5nu6MnOM=
github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6 h1:mNKFgLZIU0eEHKHjb7Uk9ZuSy65DdgmEf2xxum0Tof4= github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6 h1:mNKFgLZIU0eEHKHjb7Uk9ZuSy65DdgmEf2xxum0Tof4=
github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6/go.mod h1:P/hDjVwz/9fhR0ww3+umzDpDA7Bf7Tce4xNChHIEFqE= github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6/go.mod h1:P/hDjVwz/9fhR0ww3+umzDpDA7Bf7Tce4xNChHIEFqE=
github.com/gen2brain/raylib-go/raylib v0.0.0-20240421191056-278df68f40bb h1:2CdDr/LfDc9uLOW/+3ffSM5Ia7xZZMgjC6UmP7KTjRw= github.com/gen2brain/raylib-go/raylib v0.0.0-20240421191056-278df68f40bb h1:2CdDr/LfDc9uLOW/+3ffSM5Ia7xZZMgjC6UmP7KTjRw=
github.com/gen2brain/raylib-go/raylib v0.0.0-20240421191056-278df68f40bb/go.mod h1:P/hDjVwz/9fhR0ww3+umzDpDA7Bf7Tce4xNChHIEFqE= github.com/gen2brain/raylib-go/raylib v0.0.0-20240421191056-278df68f40bb/go.mod h1:P/hDjVwz/9fhR0ww3+umzDpDA7Bf7Tce4xNChHIEFqE=
github.com/gen2brain/raylib-go/raylib v0.0.0-20240522200953-b7c9eeec1b29 h1:PcZhEzXyuccb+d27B2txaUsD3/cBlGKiS8BE8qgBC6c=
github.com/gen2brain/raylib-go/raylib v0.0.0-20240522200953-b7c9eeec1b29/go.mod h1:76svhwieyfOFogKyYbDwqjPSTaWFDp1aDk0sLsQoO5k=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=

82
maintest/main.go Normal file
View file

@ -0,0 +1,82 @@
package main
import (
"fmt"
gui "github.com/gen2brain/raylib-go/raygui"
rl "github.com/gen2brain/raylib-go/raylib"
"git.dummkopf.live/InventorX/pinwindows"
)
const RENDERWIDTH = 1920
const RENDERHEIGHT = 1080
const SCREENWIDTH = 1280
const SCREENHEIGHT = 720
func DrawButtonAt00(window *pinwindows.Window) {
//fmt.Println(window)
window.BeginDrawMode()
rl.ClearBackground(rl.White)
close := gui.Button(rl.NewRectangle(0, 0, 20, 20), "Ha")
if close {
window.ManageFunc = pinwindows.CloseWindow
}
window.EndDrawMode()
}
func main() {
rl.InitWindow(SCREENWIDTH, SCREENHEIGHT, "raylib [core] example - basic window")
rl.SetWindowState(rl.FlagWindowResizable)
defer rl.CloseWindow()
rl.SetTargetFPS(int32(rl.GetMonitorRefreshRate(0)))
a := rl.GetMonitorPosition(0)
mh := rl.GetMonitorHeight(0)
mw := rl.GetMonitorWidth(0)
rl.SetWindowPosition(int(a.X)+int(0.5*float32(mw))-(SCREENWIDTH/2), int(a.Y)+int(0.5*float32(mh))-(0.5*SCREENHEIGHT))
wm := pinwindows.NewWindowManager()
rendertexture := rl.LoadRenderTexture(SCREENWIDTH, SCREENHEIGHT)
raywin := pinwindows.NewWindow(100, 100, 200, 200)
wm.AddWindow(&raywin)
for !rl.WindowShouldClose() {
wm.ManageWindowlist()
wm.ProcessUserWindowMovement()
raywin.BeginDrawMode()
rl.ClearBackground(rl.White)
ispressed := gui.Button(rl.NewRectangle(0, 0, 50, 50), "new")
raywin.EndDrawMode()
if ispressed {
newwindow := pinwindows.NewWindow(50, 50, 200, 200)
newwindow.DrawBorder = true
newwindow.DrawFunc = DrawButtonAt00
wm.AddWindow(&newwindow)
}
pinwindows.UpdateRenderTexture(&rendertexture)
wm.DrawInternalWindowList()
rl.BeginTextureMode(rendertexture)
rl.ClearBackground(rl.Black)
wm.DrawWindowlist()
rl.EndTextureMode()
rl.BeginDrawing()
pinwindows.DrawTextureFlipped(&rendertexture.Texture, 0, 0)
rl.EndDrawing()
}
fmt.Println("test")
pinwindows.Testfunc()
}

View file

@ -6,3 +6,9 @@ func DrawTextureFlipped(rentex *rl.Texture2D, posx, posy int32) {
rl.DrawTexturePro(*rentex, rl.NewRectangle(0, 0, float32(rentex.Width), -float32(rentex.Height)), rl.NewRectangle(float32(posx), float32(posy), float32(rentex.Width), float32(rentex.Height)), rl.NewVector2(0, 0), 0, rl.White) rl.DrawTexturePro(*rentex, rl.NewRectangle(0, 0, float32(rentex.Width), -float32(rentex.Height)), rl.NewRectangle(float32(posx), float32(posy), float32(rentex.Width), float32(rentex.Height)), rl.NewVector2(0, 0), 0, rl.White)
} }
func UpdateRenderTexture(texture *rl.RenderTexture2D) {
if rl.IsWindowResized() {
rl.UnloadRenderTexture(*texture)
*texture = rl.LoadRenderTexture(int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()))
}
}

View file

@ -6,7 +6,7 @@ import (
rl "github.com/gen2brain/raylib-go/raylib" rl "github.com/gen2brain/raylib-go/raylib"
) )
type RayGuiWindow struct { type Window struct {
Texture *rl.RenderTexture2D Texture *rl.RenderTexture2D
Pos rl.Vector2 Pos rl.Vector2
Size rl.Vector2 Size rl.Vector2
@ -24,15 +24,19 @@ const (
WINDOW_NO_EVENT = -1 WINDOW_NO_EVENT = -1
) )
type windowdrawfunc func(*RayGuiWindow) type windowdrawfunc func(*Window)
func NewRayGuiWindow(x, y, w, h int) RayGuiWindow { func Testfunc() {
texture := rl.LoadRenderTexture(int32(w), int32(h)) fmt.Println("erm")
return RayGuiWindow{Texture: &texture, Pos: rl.Vector2{X: float32(x), Y: float32(y)}, Size: rl.Vector2{X: float32(w), Y: float32(h)}, DrawBorder: true, AcceptingInput: false}
} }
func (win *RayGuiWindow) GetBorderRect() rl.Rectangle { func NewWindow(x, y, w, h int) Window {
texture := rl.LoadRenderTexture(int32(w), int32(h))
return Window{Texture: &texture, Pos: rl.Vector2{X: float32(x), Y: float32(y)}, Size: rl.Vector2{X: float32(w), Y: float32(h)}, DrawBorder: true, AcceptingInput: false}
}
func (win *Window) GetBorderRect() rl.Rectangle {
if win.DrawBorder { if win.DrawBorder {
return rl.NewRectangle(0, 0, win.Size.X, 20) return rl.NewRectangle(0, 0, win.Size.X, 20)
} else { } else {
@ -40,14 +44,14 @@ func (win *RayGuiWindow) GetBorderRect() rl.Rectangle {
} }
} }
func (win *RayGuiWindow) Resize(x, y int) { func (win *Window) ResizeDelta(x, y int) {
rl.UnloadRenderTexture(*win.Texture) rl.UnloadRenderTexture(*win.Texture)
win.Size.X += float32(x) win.Size.X += float32(x)
win.Size.Y += float32(y) win.Size.Y += float32(y)
*win.Texture = rl.LoadRenderTexture(int32(win.Size.X), int32(win.Size.Y)) *win.Texture = rl.LoadRenderTexture(int32(win.Size.X), int32(win.Size.Y))
} }
func (win *RayGuiWindow) DidStartMoveDrag() bool { func (win *Window) DidStartMoveDrag() bool {
if win.IsTouchingRegion(rl.GetMousePosition(), rl.NewRectangle(0, -win.GetBorderRect().Height, float32(win.Size.X), win.GetBorderRect().Height)) { if win.IsTouchingRegion(rl.GetMousePosition(), rl.NewRectangle(0, -win.GetBorderRect().Height, float32(win.Size.X), win.GetBorderRect().Height)) {
if rl.IsMouseButtonPressed(rl.MouseButtonLeft) { if rl.IsMouseButtonPressed(rl.MouseButtonLeft) {
return true return true
@ -56,7 +60,7 @@ func (win *RayGuiWindow) DidStartMoveDrag() bool {
return false return false
} }
func (win *RayGuiWindow) DidStartResizeDrag() bool { func (win *Window) DidStartResizeDrag() bool {
if win.IsTouchingRegion(rl.GetMousePosition(), rl.NewRectangle(0, 0, float32(win.Size.X), float32(win.Size.Y))) { if win.IsTouchingRegion(rl.GetMousePosition(), rl.NewRectangle(0, 0, float32(win.Size.X), float32(win.Size.Y))) {
if rl.IsMouseButtonPressed(rl.MouseButtonRight) { if rl.IsMouseButtonPressed(rl.MouseButtonRight) {
return true return true
@ -65,11 +69,11 @@ func (win *RayGuiWindow) DidStartResizeDrag() bool {
return false return false
} }
func (window *RayGuiWindow) isLeftClicked() bool { func (window *Window) isLeftClicked() bool {
return rl.IsMouseButtonPressed(rl.MouseButtonLeft) && rl.CheckCollisionPointRec(rl.GetMousePosition(), rl.NewRectangle(float32(window.Pos.X), float32(window.Pos.Y-window.GetBorderRect().Height), float32(window.Size.X), float32(window.Size.Y+window.GetBorderRect().Height))) return rl.IsMouseButtonPressed(rl.MouseButtonLeft) && rl.CheckCollisionPointRec(rl.GetMousePosition(), rl.NewRectangle(float32(window.Pos.X), float32(window.Pos.Y-window.GetBorderRect().Height), float32(window.Size.X), float32(window.Size.Y+window.GetBorderRect().Height)))
} }
func (window *RayGuiWindow) BeginDrawMode() { func (window *Window) BeginDrawMode() {
rl.BeginTextureMode(*window.Texture) rl.BeginTextureMode(*window.Texture)
if window.AcceptingInput { if window.AcceptingInput {
rl.SetMouseOffset(int(-window.Pos.X), int(-window.Pos.Y)) rl.SetMouseOffset(int(-window.Pos.X), int(-window.Pos.Y))
@ -78,12 +82,12 @@ func (window *RayGuiWindow) BeginDrawMode() {
} }
} }
func (window *RayGuiWindow) EndDrawMode() { func (window *Window) EndDrawMode() {
rl.SetMouseOffset(0, 0) rl.SetMouseOffset(0, 0)
rl.EndTextureMode() rl.EndTextureMode()
} }
func (window RayGuiWindow) IsTouchingRegion(posvec rl.Vector2, rect rl.Rectangle) bool { func (window Window) IsTouchingRegion(posvec rl.Vector2, rect rl.Rectangle) bool {
if rl.CheckCollisionPointRec(posvec, rl.Rectangle{X: rect.X + float32(window.Pos.X), Y: rect.Y + float32(window.Pos.Y), Width: rect.Width, Height: rect.Height}) { if rl.CheckCollisionPointRec(posvec, rl.Rectangle{X: rect.X + float32(window.Pos.X), Y: rect.Y + float32(window.Pos.Y), Width: rect.Width, Height: rect.Height}) {
return true return true
@ -91,7 +95,7 @@ func (window RayGuiWindow) IsTouchingRegion(posvec rl.Vector2, rect rl.Rectangle
return false return false
} }
func (window *RayGuiWindow) Draw() { func (window *Window) Draw() {
rl.DrawRectangle(int32(window.Pos.X), int32(window.Pos.Y)-int32(window.GetBorderRect().Height), int32(window.Size.X), int32(window.GetBorderRect().Height), rl.Gray) rl.DrawRectangle(int32(window.Pos.X), int32(window.Pos.Y)-int32(window.GetBorderRect().Height), int32(window.Size.X), int32(window.GetBorderRect().Height), rl.Gray)
rl.DrawText(fmt.Sprint(window.AcceptingInput), int32(window.Pos.X-20), int32(window.Pos.Y)-20, 12, rl.Blue) rl.DrawText(fmt.Sprint(window.AcceptingInput), int32(window.Pos.X-20), int32(window.Pos.Y)-20, 12, rl.Blue)
@ -99,7 +103,7 @@ func (window *RayGuiWindow) Draw() {
DrawTextureFlipped(&window.Texture.Texture, int32(window.Pos.X), int32(window.Pos.Y)) DrawTextureFlipped(&window.Texture.Texture, int32(window.Pos.X), int32(window.Pos.Y))
} }
func (window *RayGuiWindow) DrawInternals() { func (window *Window) DrawInternals() {
if window.DrawFunc != nil { if window.DrawFunc != nil {
window.DrawFunc(window) window.DrawFunc(window)
} }

View file

@ -4,21 +4,21 @@ import (
rl "github.com/gen2brain/raylib-go/raylib" rl "github.com/gen2brain/raylib-go/raylib"
) )
type managewindowfunc func(*RayGuiWindowManager, *RayGuiWindow) type managewindowfunc func(*WindowManager, *Window)
type RayGuiWindowManager struct { type WindowManager struct {
Winlist []*RayGuiWindow Winlist []*Window
Movingwindow *RayGuiWindow // the currently moving (resize, drag, etc...) Movingwindow *Window // the currently moving (resize, drag, etc...)
Movingwindowmode int Movingwindowmode int
} }
func NewRayGuiWindowManager() RayGuiWindowManager { func NewWindowManager() WindowManager {
var windowlist []*RayGuiWindow var windowlist []*Window
return RayGuiWindowManager{Winlist: windowlist, Movingwindow: nil} return WindowManager{Winlist: windowlist, Movingwindow: nil}
} }
func (winman *RayGuiWindowManager) ManageWindowlist() { func (winman *WindowManager) ManageWindowlist() {
var windowtomovetofront *RayGuiWindow = nil var windowtomovetofront *Window = nil
for i := 0; i < len(winman.Winlist); i++ { for i := 0; i < len(winman.Winlist); i++ {
if winman.Winlist[i].isLeftClicked() { if winman.Winlist[i].isLeftClicked() {
windowtomovetofront = winman.Winlist[i] windowtomovetofront = winman.Winlist[i]
@ -34,7 +34,7 @@ func (winman *RayGuiWindowManager) ManageWindowlist() {
} }
} }
func (winman *RayGuiWindowManager) ProcessUserWindowMovement() { func (winman *WindowManager) ProcessUserWindowMovement() {
currentmovingwindow := winman.Movingwindow currentmovingwindow := winman.Movingwindow
for i := 0; i < len(winman.Winlist); i++ { for i := 0; i < len(winman.Winlist); i++ {
@ -57,24 +57,24 @@ func (winman *RayGuiWindowManager) ProcessUserWindowMovement() {
winman.Movingwindow.Pos.Y += (rl.GetMouseDelta().Y) winman.Movingwindow.Pos.Y += (rl.GetMouseDelta().Y)
} }
if winman.Movingwindowmode == WINDOW_MODE_RESZIE { if winman.Movingwindowmode == WINDOW_MODE_RESZIE {
winman.Movingwindow.Resize(int(rl.GetMouseDelta().X), int(rl.GetMouseDelta().Y)) winman.Movingwindow.ResizeDelta(int(rl.GetMouseDelta().X), int(rl.GetMouseDelta().Y))
} }
} }
} }
func (winman RayGuiWindowManager) DrawInternalWindowList() { func (winman WindowManager) DrawInternalWindowList() {
for i := 0; i < len(winman.Winlist); i++ { for i := 0; i < len(winman.Winlist); i++ {
winman.Winlist[i].DrawInternals() winman.Winlist[i].DrawInternals()
} }
} }
func (winman RayGuiWindowManager) DrawWindowlist() { func (winman WindowManager) DrawWindowlist() {
for i := 0; i < len(winman.Winlist); i++ { for i := 0; i < len(winman.Winlist); i++ {
winman.Winlist[i].Draw() winman.Winlist[i].Draw()
} }
} }
func (winman *RayGuiWindowManager) WinlistUnlistWindow(windowtoremove *RayGuiWindow) { func (winman *WindowManager) WinlistUnlistWindow(windowtoremove *Window) {
indextoremove := -1 indextoremove := -1
for i := 0; i < len(winman.Winlist); i++ { for i := 0; i < len(winman.Winlist); i++ {
if winman.Winlist[i] == windowtoremove { if winman.Winlist[i] == windowtoremove {
@ -91,7 +91,7 @@ func (winman *RayGuiWindowManager) WinlistUnlistWindow(windowtoremove *RayGuiWin
return return
} }
func CloseWindow(winman *RayGuiWindowManager, windowtoremove *RayGuiWindow) { func CloseWindow(winman *WindowManager, windowtoremove *Window) {
winman.WinlistUnlistWindow(windowtoremove) winman.WinlistUnlistWindow(windowtoremove)
rl.UnloadRenderTexture(*windowtoremove.Texture) rl.UnloadRenderTexture(*windowtoremove.Texture)
if winman.Movingwindow == windowtoremove { if winman.Movingwindow == windowtoremove {
@ -100,7 +100,7 @@ func CloseWindow(winman *RayGuiWindowManager, windowtoremove *RayGuiWindow) {
return return
} }
func (winman *RayGuiWindowManager) AddWindow(windowtoadd *RayGuiWindow) { func (winman *WindowManager) AddWindow(windowtoadd *Window) {
if len(winman.Winlist) > 0 { if len(winman.Winlist) > 0 {
winman.Winlist[len(winman.Winlist)-1].AcceptingInput = false winman.Winlist[len(winman.Winlist)-1].AcceptingInput = false
} }
@ -108,7 +108,7 @@ func (winman *RayGuiWindowManager) AddWindow(windowtoadd *RayGuiWindow) {
winman.Winlist[len(winman.Winlist)-1].AcceptingInput = true winman.Winlist[len(winman.Winlist)-1].AcceptingInput = true
} }
func MoveToTopOfWindowlist(winman *RayGuiWindowManager, windowtomove *RayGuiWindow) { func MoveToTopOfWindowlist(winman *WindowManager, windowtomove *Window) {
winman.Winlist[len(winman.Winlist)-1].AcceptingInput = false winman.Winlist[len(winman.Winlist)-1].AcceptingInput = false
winman.WinlistUnlistWindow(windowtomove) winman.WinlistUnlistWindow(windowtomove)
winman.AddWindow(windowtomove) winman.AddWindow(windowtomove)