[windows] Support all window runtime methods

This commit is contained in:
Lea Anthony
2021-07-24 10:34:43 +10:00
parent 0ea135a546
commit e11dc0e080
4 changed files with 164 additions and 55 deletions

View File

@@ -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()

View File

@@ -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)

View File

@@ -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,
}
}

View File

@@ -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
}