Add more Window API

This commit is contained in:
Lea Anthony 2022-12-07 23:30:20 +11:00
commit 05803fb5d5
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
7 changed files with 81 additions and 14 deletions

2
app.go
View file

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

View file

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

View file

@ -31,7 +31,7 @@ func (a *App) Run() error {
}
}()
// Run windows
// run windows
for _, window := range a.windows {
err := window.Run()
if err != nil {

View file

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

View file

@ -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 <stdlib.h>
#include "Cocoa/Cocoa.h"
#import <WebKit/WebKit.h>
// 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
}

View file

@ -5,10 +5,12 @@
#define WindowDelegate_h
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>
@interface WindowDelegate : NSObject <NSWindowDelegate>
@property bool hideOnClose;
@property (retain) WKWebView* webView;
@end

View file

@ -24,4 +24,7 @@ type Window struct {
Title string
Width, Height int
AlwaysOnTop bool
URL string
DisableResize bool
Resizable bool
}