diff --git a/v2/internal/appng/app.go b/v2/internal/appng/app.go index 8283eda2..c173497f 100644 --- a/v2/internal/appng/app.go +++ b/v2/internal/appng/app.go @@ -8,7 +8,6 @@ import ( "github.com/wailsapp/wails/v2/internal/menumanager" "github.com/wailsapp/wails/v2/internal/signal" "github.com/wailsapp/wails/v2/pkg/options" - "time" ) // App defines a Wails application structure @@ -34,19 +33,75 @@ type App struct { func (a *App) Run() error { go func() { - time.Sleep(1 * time.Second) - println("fullscreen") - a.frontend.WindowFullscreen() - time.Sleep(1 * time.Second) - println("unfullscreen") - a.frontend.WindowUnFullscreen() - time.Sleep(1 * time.Second) - println("hide") - a.frontend.WindowHide() - time.Sleep(1 * time.Second) - println("show") - a.frontend.WindowShow() - time.Sleep(1 * time.Second) + //time.Sleep(3 * time.Second) + //println("WindowSetSize(3000,2000)") + //a.frontend.WindowSetSize(3000,2000) + //x,y := a.frontend.WindowGetSize() + //println("X", x, "Y", y) + //time.Sleep(3 * time.Second) + //println("a.frontend.WindowSetSize(10,10)") + //a.frontend.WindowSetSize(10,10) + //x,y = a.frontend.WindowGetSize() + //println("X", x, "Y", y) + //time.Sleep(3 * time.Second) + //time.Sleep(3 * time.Second) + //println("WindowSetMaxSize(50,50)") + //a.frontend.WindowSetMaxSize(200,200) + //x,y := a.frontend.WindowGetSize() + //println("X", x, "Y", y) + //time.Sleep(3 * time.Second) + //println("WindowSetMinSize(100,100)") + //a.frontend.WindowSetMinSize(600,600) + //x,y = a.frontend.WindowGetSize() + //println("X", x, "Y", y) + //println("fullscreen") + //a.frontend.WindowFullscreen() + //time.Sleep(1 * time.Second) + //println("unfullscreen") + //a.frontend.WindowUnFullscreen() + //time.Sleep(1 * time.Second) + //println("hide") + //a.frontend.WindowHide() + //time.Sleep(1 * time.Second) + //println("show") + //a.frontend.WindowShow() + //time.Sleep(1 * time.Second) + //println("title 1") + //a.frontend.WindowSetTitle("title 1") + //time.Sleep(1 * time.Second) + //println("title 2") + //a.frontend.WindowSetTitle("title 2") + //time.Sleep(1 * time.Second) + //println("setsize 1") + //a.frontend.WindowSetSize(100,100) + //time.Sleep(1 * time.Second) + //println("setsize 2") + //a.frontend.WindowSetSize(500,500) + //time.Sleep(1 * time.Second) + //println("setpos 1") + //a.frontend.WindowSetPos(0,0) + //time.Sleep(1 * time.Second) + //println("setpos 2") + //a.frontend.WindowSetPos(500,500) + //time.Sleep(1 * time.Second) + //println("Center 1") + //a.frontend.WindowCenter() + //time.Sleep(5 * time.Second) + //println("Center 2") + //a.frontend.WindowCenter() + //time.Sleep(1 * time.Second) + //println("maximise") + //a.frontend.WindowMaximise() + //time.Sleep(1 * time.Second) + //println("UnMaximise") + //a.frontend.WindowUnmaximise() + //time.Sleep(1 * time.Second) + //println("minimise") + //a.frontend.WindowMinimise() + //time.Sleep(1 * time.Second) + //println("unminimise") + //a.frontend.WindowUnminimise() + //time.Sleep(1 * time.Second) }() return a.frontend.Run() diff --git a/v2/internal/frontend/frontend.go b/v2/internal/frontend/frontend.go index 3f403bcd..84be2373 100644 --- a/v2/internal/frontend/frontend.go +++ b/v2/internal/frontend/frontend.go @@ -27,9 +27,11 @@ type Frontend interface { WindowMinimise() WindowUnminimise() WindowSetPos(x int, y int) + WindowGetPos() (int, int) WindowSetSize(width int, height int) - //WindowSetMinSize(width int, height int) - //WindowSetMaxSize(width int, height int) + WindowGetSize() (int, int) + WindowSetMinSize(width int, height int) + WindowSetMaxSize(width int, height int) WindowFullscreen() WindowUnFullscreen() //WindowSetColour(colour int) diff --git a/v2/internal/frontend/windows/frontend.go b/v2/internal/frontend/windows/frontend.go index 7407a5ed..d501db2a 100644 --- a/v2/internal/frontend/windows/frontend.go +++ b/v2/internal/frontend/windows/frontend.go @@ -2,63 +2,33 @@ package windows import ( "github.com/tadvi/winc" - "github.com/tadvi/winc/w32" "github.com/wailsapp/wails/v2/internal/logger" "github.com/wailsapp/wails/v2/pkg/options" "runtime" ) type Frontend struct { - options *options.App - logger *logger.Logger + frontendOptions *options.App + logger *logger.Logger // main window handle - mainWindow *winc.Form + mainWindow *Window + minWidth, minHeight, maxWidth, maxHeight int } func (f *Frontend) Run() error { - exStyle := w32.WS_EX_CONTROLPARENT | w32.WS_EX_APPWINDOW - if f.options.Windows.WindowBackgroundIsTranslucent { - exStyle |= w32.WS_EX_NOREDIRECTIONBITMAP - } - - var dwStyle uint - if f.options.Frameless { - dwStyle = w32.WS_POPUP - } - - mainWindow := winc.NewCustomForm(nil, exStyle, dwStyle) + mainWindow := NewWindow(nil, f.frontendOptions) f.mainWindow = mainWindow - mainWindow.SetSize(f.options.Width, f.options.Height) - mainWindow.SetText(f.options.Title) - mainWindow.EnableSizable(!f.options.DisableResize) - mainWindow.EnableMaxButton(!f.options.DisableResize) - - if f.options.Windows.WindowBackgroundIsTranslucent { - mainWindow.SetTranslucentBackground() - } - - if f.options.Windows.DisableWindowIcon { - mainWindow.DisableIcon() - } - - if f.options.StartHidden { - mainWindow.Hide() - } - - if f.options.Fullscreen { - mainWindow.Fullscreen() - } f.WindowCenter() - if !f.options.StartHidden { + if !f.frontendOptions.StartHidden { mainWindow.Show() } mainWindow.OnClose().Bind(func(arg *winc.Event) { - if f.options.HideWindowOnClose { + if f.frontendOptions.HideWindowOnClose { f.WindowHide() } else { f.Quit() @@ -78,12 +48,21 @@ func (f *Frontend) WindowSetPos(x, y int) { runtime.LockOSThread() f.mainWindow.SetPos(x, y) } +func (f *Frontend) WindowGetPos() (int, int) { + runtime.LockOSThread() + return f.mainWindow.Pos() +} func (f *Frontend) WindowSetSize(width, height int) { runtime.LockOSThread() f.mainWindow.SetSize(width, height) } +func (f *Frontend) WindowGetSize() (int, int) { + runtime.LockOSThread() + return f.mainWindow.Size() +} + func (f *Frontend) WindowSetTitle(title string) { runtime.LockOSThread() f.mainWindow.SetText(title) @@ -125,6 +104,15 @@ func (f *Frontend) WindowUnminimise() { f.mainWindow.Restore() } +func (f *Frontend) WindowSetMinSize(width int, height int) { + runtime.LockOSThread() + f.mainWindow.SetMinSize(width, height) +} +func (f *Frontend) WindowSetMaxSize(width int, height int) { + runtime.LockOSThread() + f.mainWindow.SetMaxSize(width, height) +} + func (f *Frontend) Quit() { winc.Exit() } @@ -132,7 +120,7 @@ func (f *Frontend) Quit() { func NewFrontend(appoptions *options.App, myLogger *logger.Logger) *Frontend { return &Frontend{ - options: appoptions, - logger: myLogger, + frontendOptions: appoptions, + logger: myLogger, } } diff --git a/v2/internal/frontend/windows/window.go b/v2/internal/frontend/windows/window.go new file mode 100644 index 00000000..c15ac645 --- /dev/null +++ b/v2/internal/frontend/windows/window.go @@ -0,0 +1,64 @@ +package windows + +import ( + "github.com/tadvi/winc" + "github.com/tadvi/winc/w32" + "github.com/wailsapp/wails/v2/pkg/options" +) + +type Window struct { + winc.Form + frontendOptions *options.App +} + +func NewWindow(parent winc.Controller, options *options.App) *Window { + result := new(Window) + result.frontendOptions = options + result.SetIsForm(true) + + exStyle := w32.WS_EX_CONTROLPARENT | w32.WS_EX_APPWINDOW + if options.Windows.WindowBackgroundIsTranslucent { + exStyle |= w32.WS_EX_NOREDIRECTIONBITMAP + } + + var dwStyle = w32.WS_OVERLAPPEDWINDOW + if options.Frameless { + dwStyle = w32.WS_POPUP + } + + winc.RegClassOnlyOnce("wailsWindow") + result.SetHandle(winc.CreateWindow("wailsWindow", parent, uint(exStyle), uint(dwStyle))) + result.SetParent(parent) + + // result might fail if icon resource is not embedded in the binary + if ico, err := winc.NewIconFromResource(winc.GetAppInstance(), uint16(winc.AppIconID)); err == nil { + result.SetIcon(0, ico) + } + + result.SetSize(options.Width, options.Height) + result.SetText(options.Title) + result.EnableSizable(!options.DisableResize) + result.EnableMaxButton(!options.DisableResize) + result.SetMinSize(options.MinWidth, options.MinHeight) + result.SetMaxSize(options.MaxWidth, options.MaxHeight) + + // Dlg forces display of focus rectangles, as soon as the user starts to type. + w32.SendMessage(result.Handle(), w32.WM_CHANGEUISTATE, w32.UIS_INITIALIZE, 0) + winc.RegMsgHandler(result) + + result.SetFont(winc.DefaultFont) + + if options.Windows.WindowBackgroundIsTranslucent { + result.SetTranslucentBackground() + } + + if options.Windows.DisableWindowIcon { + result.DisableIcon() + } + + if options.Fullscreen { + result.Fullscreen() + } + + return result +}