diff --git a/app.go b/app.go index 95a8a7e82..ca9ca004e 100644 --- a/app.go +++ b/app.go @@ -141,7 +141,7 @@ func (a *App) start() error { // Defer the shutdown defer a.shutdown() - // Run the renderer + // run the renderer err = a.renderer.Run() if err != nil { return err diff --git a/exp/examples/basic/main.go b/exp/examples/basic/main.go index c6c354fe0..a89e11f0f 100644 --- a/exp/examples/basic/main.go +++ b/exp/examples/basic/main.go @@ -22,17 +22,21 @@ func main() { println("TERMINATION!!") }) myWindow := app.NewWindow(&options.Window{ - Title: "Basic", - Width: 600, - Height: 400, - AlwaysOnTop: false, + Title: "Basic", + Width: 600, + Height: 400, + AlwaysOnTop: false, + URL: "https://google.com", + DisableResize: false, }) myWindow2 := app.NewWindow(&options.Window{ - Title: "#2", - Width: 1024, - Height: 768, - AlwaysOnTop: false, + Title: "#2", + Width: 1024, + Height: 768, + AlwaysOnTop: false, + URL: "https://google.com", + DisableResize: true, }) go func() { @@ -40,6 +44,7 @@ func main() { myWindow.SetTitle("Wooooo") myWindow.SetAlwaysOnTop(true) myWindow2.SetTitle("OMFG") + myWindow2.NavigateToURL("https://wails.io") }() err := app.Run() diff --git a/exp/pkg/application/application_darwin.go b/exp/pkg/application/application_darwin.go index b26a518e3..c30a60864 100644 --- a/exp/pkg/application/application_darwin.go +++ b/exp/pkg/application/application_darwin.go @@ -31,7 +31,7 @@ func (a *App) Run() error { } }() - // Run windows + // run windows for _, window := range a.windows { err := window.Run() if err != nil { diff --git a/exp/pkg/application/window.go b/exp/pkg/application/window.go index 1b9902b11..dc6e58ad5 100644 --- a/exp/pkg/application/window.go +++ b/exp/pkg/application/window.go @@ -6,7 +6,9 @@ type windowImpl interface { setTitle(title string) setSize(width, height int) setAlwaysOnTop(alwaysOnTop bool) - Run() error + run() error + navigateToURL(url string) + setResizable(resizable bool) } type Window struct { @@ -39,7 +41,7 @@ func (w *Window) SetSize(width, height int) { func (w *Window) Run() error { w.impl = newWindowImpl(w.options) - return w.impl.Run() + return w.impl.run() } func (w *Window) SetAlwaysOnTop(b bool) { @@ -49,3 +51,19 @@ func (w *Window) SetAlwaysOnTop(b bool) { } w.impl.setAlwaysOnTop(b) } + +func (w *Window) NavigateToURL(s string) { + if w.impl == nil { + w.options.URL = s + return + } + w.impl.navigateToURL(s) +} + +func (w *Window) SetResizable(b bool) { + if w.impl == nil { + w.options.DisableResize = !b + return + } + w.impl.setResizable(b) +} diff --git a/exp/pkg/application/window_darwin.go b/exp/pkg/application/window_darwin.go index a8d81af85..2f229f8dc 100644 --- a/exp/pkg/application/window_darwin.go +++ b/exp/pkg/application/window_darwin.go @@ -4,12 +4,14 @@ package application /* #cgo CFLAGS: -mmacosx-version-min=10.10 -x objective-c -#cgo LDFLAGS: -framework Cocoa +#cgo LDFLAGS: -framework Cocoa -framework WebKit #include "application.h" #include "window_delegate.h" #include #include "Cocoa/Cocoa.h" +#import + // Create a new Window void* windowNew(int width, int height) { @@ -22,6 +24,13 @@ void* windowNew(int width, int height) { // Set delegate [window setDelegate:delegate]; + // Embed wkwebview in window + NSRect frame = NSMakeRect(0, 0, width, height); + WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init]; + WKWebView* webView = [[WKWebView alloc] initWithFrame:frame configuration:config]; + [window setContentView:webView]; + delegate.webView = webView; + delegate.hideOnClose = false; return window; } @@ -67,6 +76,26 @@ void windowSetAlwaysOnTop(void* nsWindow, bool alwaysOnTop) { }); } +// Load URL in NSWindow +void navigationLoadURL(void* nsWindow, char* url) { + // Load URL on main thread + dispatch_async(dispatch_get_main_queue(), ^{ + NSURL* nsURL = [NSURL URLWithString:[NSString stringWithUTF8String:url]]; + NSURLRequest* request = [NSURLRequest requestWithURL:nsURL]; + [[(WindowDelegate*)[(NSWindow*)nsWindow delegate] webView] loadRequest:request]; + free(url); + }); +} + +// Set NSWindow resizable +void windowSetResizable(void* nsWindow, bool resizable) { + // Set window resizable on main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [(NSWindow*)nsWindow setStyleMask:resizable ? NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask : NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask]; + }); +} + + */ import "C" import ( @@ -80,6 +109,10 @@ type macosWindow struct { options *options.Window } +func (w *macosWindow) navigateToURL(url string) { + C.navigationLoadURL(w.nsWindow, C.CString(url)) +} + func (w *macosWindow) setAlwaysOnTop(alwaysOnTop bool) { C.windowSetAlwaysOnTop(w.nsWindow, C.bool(alwaysOnTop)) } @@ -100,10 +133,16 @@ func (w *macosWindow) setSize(width, height int) { C.windowSetSize(w.nsWindow, C.int(width), C.int(height)) } -func (w *macosWindow) Run() error { +func (w *macosWindow) setResizable(resizable bool) { + C.windowSetResizable(w.nsWindow, C.bool(resizable)) +} + +func (w *macosWindow) run() error { w.nsWindow = C.windowNew(C.int(w.options.Width), C.int(w.options.Height)) w.setTitle(w.options.Title) w.setAlwaysOnTop(w.options.AlwaysOnTop) + w.setResizable(!w.options.DisableResize) C.windowShow(w.nsWindow) + C.navigationLoadURL(w.nsWindow, C.CString(w.options.URL)) return nil } diff --git a/exp/pkg/application/window_delegate.h b/exp/pkg/application/window_delegate.h index 27937938e..26ca44643 100644 --- a/exp/pkg/application/window_delegate.h +++ b/exp/pkg/application/window_delegate.h @@ -5,10 +5,12 @@ #define WindowDelegate_h #import +#import @interface WindowDelegate : NSObject @property bool hideOnClose; +@property (retain) WKWebView* webView; @end diff --git a/exp/pkg/options/application.go b/exp/pkg/options/application.go index 40d1c6e97..8c178bce7 100644 --- a/exp/pkg/options/application.go +++ b/exp/pkg/options/application.go @@ -24,4 +24,7 @@ type Window struct { Title string Width, Height int AlwaysOnTop bool + URL string + DisableResize bool + Resizable bool }