diff --git a/exp/examples/window/main.go b/exp/examples/window/main.go index 6b385be13..b6cf12856 100644 --- a/exp/examples/window/main.go +++ b/exp/examples/window/main.go @@ -44,7 +44,7 @@ func main() { SetTitle("Window "+strconv.Itoa(windowCounter)). SetPosition(rand.Intn(1000), rand.Intn(800)). SetURL("https://wails.io"). - Run() + Show() windowCounter++ }) @@ -71,6 +71,13 @@ func main() { w.SetMaxSize(600, 600) }) }) + sizeMenu.Add("Get Current Window Size").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + width, height := w.Size() + app.NewInfoDialog().SetTitle("Current Window Size").SetMessage("Width: " + strconv.Itoa(width) + " Height: " + strconv.Itoa(height)).Show() + }) + }) + sizeMenu.Add("Reset Min Size").OnClick(func(ctx *application.Context) { currentWindow(func(w *application.Window) { w.SetMinSize(0, 0) @@ -94,6 +101,14 @@ func main() { w.SetPosition(rand.Intn(1000), rand.Intn(800)) }) }) + + positionMenu.Add("Get Position").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + x, y := w.Position() + app.NewInfoDialog().SetTitle("Current Window Position").SetMessage("X: " + strconv.Itoa(x) + " Y: " + strconv.Itoa(y)).Show() + }) + }) + positionMenu.Add("Center").OnClick(func(ctx *application.Context) { currentWindow(func(w *application.Window) { w.Center() @@ -127,6 +142,33 @@ func main() { w.Restore() }) }) + stateMenu.Add("Hide (for 2 seconds)").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + w.Hide() + time.Sleep(2 * time.Second) + w.Show() + }) + }) + stateMenu.Add("Always on Top").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + w.SetAlwaysOnTop(true) + }) + }) + stateMenu.Add("Not always on Top").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + w.SetAlwaysOnTop(false) + }) + }) + stateMenu.Add("Google.com").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + w.SetURL("https://google.com") + }) + }) + stateMenu.Add("wails.io").OnClick(func(ctx *application.Context) { + currentWindow(func(w *application.Window) { + w.SetURL("https://wails.io") + }) + }) app.NewWindow() diff --git a/exp/pkg/application/application.go b/exp/pkg/application/application.go index 698306418..b556580bb 100644 --- a/exp/pkg/application/application.go +++ b/exp/pkg/application/application.go @@ -140,7 +140,7 @@ func (a *App) NewWindowWithOptions(windowOptions *options.Window) *Window { a.windowAliasesLock.Unlock() } if a.running { - newWindow.Run() + newWindow.run() } return newWindow @@ -192,7 +192,7 @@ func (a *App) Run() error { // run windows for _, window := range a.windows { - go window.Run() + go window.run() } // run system trays diff --git a/exp/pkg/application/window.go b/exp/pkg/application/window.go index 6c4b2a29e..6198933d6 100644 --- a/exp/pkg/application/window.go +++ b/exp/pkg/application/window.go @@ -50,6 +50,8 @@ type ( isFullscreen() bool disableSizeConstraints() setFullscreenButtonEnabled(enabled bool) + show() + hide() } ) @@ -137,7 +139,7 @@ func (w *Window) SetSize(width, height int) *Window { return w } -func (w *Window) Run() { +func (w *Window) run() { if w.impl != nil { return } @@ -155,6 +157,22 @@ func (w *Window) SetAlwaysOnTop(b bool) *Window { return w } +func (w *Window) Show() *Window { + if w.impl == nil { + w.run() + return w + } + w.impl.show() + return w +} +func (w *Window) Hide() *Window { + w.options.Hidden = true + if w.impl != nil { + w.impl.hide() + } + return w +} + func (w *Window) SetURL(s string) *Window { w.options.URL = s if w.impl != nil { diff --git a/exp/pkg/application/window_darwin.go b/exp/pkg/application/window_darwin.go index 8f2717a2d..f29a05635 100644 --- a/exp/pkg/application/window_darwin.go +++ b/exp/pkg/application/window_darwin.go @@ -125,22 +125,6 @@ void windowSetSize(void* nsWindow, int width, int height) { }); } -// Show the NSWindow -void windowShow(void* nsWindow) { - // Show window on main thread - dispatch_async(dispatch_get_main_queue(), ^{ - [(NSWindow*)nsWindow makeKeyAndOrderFront:nil]; - }); -} - -// Hide the NSWindow -void windowHide(void* nsWindow) { - // Hide window on main thread - dispatch_async(dispatch_get_main_queue(), ^{ - [(NSWindow*)nsWindow orderOut:nil]; - }); -} - // Set NSWindow always on top void windowSetAlwaysOnTop(void* nsWindow, bool alwaysOnTop) { // Set window always on top on main thread @@ -676,6 +660,19 @@ static void windowDisableSizeConstraints(void *window) { }); } +static void windowShow(void *window) { + dispatch_async(dispatch_get_main_queue(), ^{ + // show window + [(NSWindow*)window makeKeyAndOrderFront:nil]; + }); +} + +static void windowHide(void *window) { + dispatch_async(dispatch_get_main_queue(), ^{ + [(NSWindow*)window orderOut:nil]; + }); +} + */ import "C" import ( @@ -694,6 +691,14 @@ type macosWindow struct { parent *Window } +func (w *macosWindow) show() { + C.windowShow(w.nsWindow) +} + +func (w *macosWindow) hide() { + C.windowHide(w.nsWindow) +} + func (w *macosWindow) setFullscreenButtonEnabled(enabled bool) { C.setFullscreenButtonEnabled(w.nsWindow, C.bool(enabled)) } @@ -972,8 +977,9 @@ func (w *macosWindow) run() { if w.parent.options.HTML != "" { w.setHTML(w.parent.options.HTML) } - - C.windowShow(w.nsWindow) + if w.parent.options.Hidden == false { + C.windowShow(w.nsWindow) + } }) } diff --git a/exp/pkg/options/window.go b/exp/pkg/options/window.go index 214bd092f..de4f15603 100644 --- a/exp/pkg/options/window.go +++ b/exp/pkg/options/window.go @@ -37,6 +37,7 @@ type Window struct { X int Y int FullscreenButtonEnabled bool + Hidden bool } var WindowDefaults = &Window{