Add Webview navigation events

Add HTML/JS/CSS in config
Add RenderHTML()
Tidy up window delegate
This commit is contained in:
Lea Anthony 2022-12-19 21:17:50 +11:00
commit e7abe1c606
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
16 changed files with 442 additions and 285 deletions

View file

@ -0,0 +1,32 @@
package main
import (
_ "embed"
"log"
"github.com/wailsapp/wails/exp/pkg/options"
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
app := application.New()
// Create window
app.NewWindowWithOptions(&options.Window{
Title: "Plain Bundle",
EnableDevTools: true,
HTML: `<html><head><title>Plain Bundle</title></head><body><div class="main"><h1>Plain Bundle</h1><p>This is a plain bundle. It has no frontend code.</p></div></body></html>`,
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: &options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,
},
})
err := app.Run()
if err != nil {
log.Fatal(err)
}
}

View file

@ -2,9 +2,4 @@ module github.com/wailsapp/wails/exp
go 1.19
require (
github.com/leaanthony/clir v1.3.0
github.com/samber/lo v1.36.0
)
require golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
require github.com/leaanthony/clir v1.3.0

View file

@ -1,11 +1,2 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/leaanthony/clir v1.3.0 h1:L9nPDWrmc/qU9UWZZvRaFajWYuO0np9V5p+5gxyYno0=
github.com/leaanthony/clir v1.3.0/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/samber/lo v1.36.0 h1:4LaOxH1mHnbDGhTVE0i1z8v/lWaQW8AIfOD3HU4mSaw=
github.com/samber/lo v1.36.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

View file

@ -6,8 +6,6 @@
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property NSApplicationActivationPolicy activationPolicy;
- (void)setApplicationActivationPolicy:(NSApplicationActivationPolicy)policy;
@end
#endif

View file

@ -1,31 +1,12 @@
//go:build darwin
#import "app_delegate.h"
#import "../events/events.h"
@implementation AppDelegate
- (void)dealloc
{
[super dealloc];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSApp setActivationPolicy:self.activationPolicy];
[NSApp activateIgnoringOtherApps:YES];
//callOnApplicationDidFinishLaunchingHandler();
processApplicationEvent(EventApplicationDidFinishLaunching);
}
- (void)setApplicationActivationPolicy:(NSApplicationActivationPolicy)policy
{
self.activationPolicy = policy;
}
// GENERATED EVENTS START
- (void)applicationDidBecomeActive:(NSNotification *)notification {
processApplicationEvent(EventApplicationDidBecomeActive);
@ -59,6 +40,10 @@
processApplicationEvent(EventApplicationDidChangeStatusBarOrientation);
}
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
processApplicationEvent(EventApplicationDidFinishLaunching);
}
- (void)applicationDidHide:(NSNotification *)notification {
processApplicationEvent(EventApplicationDidHide);
}
@ -104,8 +89,4 @@
}
// GENERATED EVENTS END
@end

View file

@ -23,7 +23,11 @@ static void init(void) {
}
static void setActivationPolicy(int policy) {
[appDelegate setApplicationActivationPolicy:policy];
[NSApp setActivationPolicy:policy];
}
static void activateIgnoringOtherApps() {
[NSApp activateIgnoringOtherApps:YES];
}
static void run(void) {
@ -123,6 +127,7 @@ func newPlatformApp(appOptions *options.Application) *macosApp {
}
C.init()
C.setActivationPolicy(C.int(appOptions.Mac.ActivationPolicy))
C.activateIgnoringOtherApps()
return &macosApp{
options: appOptions,
}

View file

@ -4,8 +4,6 @@ import (
"fmt"
"strconv"
"strings"
"github.com/samber/lo"
)
// modifier is actually a string
@ -42,7 +40,59 @@ type accelerator struct {
Modifiers []modifier
}
var namedKeys = []string{"backspace", "tab", "return", "enter", "escape", "left", "right", "up", "down", "space", "delete", "home", "end", "page up", "page down", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34", "f35", "numlock"}
var namedKeys = map[string]struct{}{
"backspace": {},
"tab": {},
"return": {},
"enter": {},
"escape": {},
"left": {},
"right": {},
"up": {},
"down": {},
"space": {},
"delete": {},
"home": {},
"end": {},
"page up": {},
"page down": {},
"f1": {},
"f2": {},
"f3": {},
"f4": {},
"f5": {},
"f6": {},
"f7": {},
"f8": {},
"f9": {},
"f10": {},
"f11": {},
"f12": {},
"f13": {},
"f14": {},
"f15": {},
"f16": {},
"f17": {},
"f18": {},
"f19": {},
"f20": {},
"f21": {},
"f22": {},
"f23": {},
"f24": {},
"f25": {},
"f26": {},
"f27": {},
"f28": {},
"f29": {},
"f30": {},
"f31": {},
"f32": {},
"f33": {},
"f34": {},
"f35": {},
"numlock": {},
}
func parseKey(key string) (string, bool) {
@ -55,7 +105,8 @@ func parseKey(key string) (string, bool) {
}
// Handle named keys
if lo.Contains(namedKeys, key) {
_, namedKey := namedKeys[key]
if namedKey {
return key, true
}
@ -89,6 +140,8 @@ func parseAccelerator(shortcut string) (*accelerator, error) {
return nil, fmt.Errorf("no components given to validateComponents")
}
modifiers := map[modifier]struct{}{}
// Check components
for index, component := range components {
@ -109,10 +162,11 @@ func parseAccelerator(shortcut string) (*accelerator, error) {
return nil, fmt.Errorf("'%s' is not a valid modifier", component)
}
// Save this data
modifiers[thisModifier] = struct{}{}
}
// return the keys as a slice
for thisModifier := range modifiers {
result.Modifiers = append(result.Modifiers, thisModifier)
}
result.Modifiers = lo.Uniq(result.Modifiers)
return &result, nil
}

View file

@ -43,6 +43,7 @@ type windowImpl interface {
close()
zoom()
minimize()
renderHTML(html string)
}
type Window struct {
@ -66,6 +67,12 @@ func getWindowID() uint {
}
func NewWindow(options *options.Window) *Window {
if options.Width == 0 {
options.Width = 800
}
if options.Height == 0 {
options.Height = 600
}
return &Window{
id: getWindowID(),
options: options,
@ -94,7 +101,7 @@ func (w *Window) SetSize(width, height int) {
func (w *Window) Run() {
w.implLock.Lock()
w.impl = newWindowImpl(w.id, w.options)
w.impl = newWindowImpl(w)
w.implLock.Unlock()
w.impl.run()
}
@ -173,7 +180,6 @@ func (w *Window) ExecJS(js string) {
w.impl.execJS(js)
}
// Set Maximized
func (w *Window) SetMaximized() {
w.options.StartState = options.WindowStateMaximised
if w.impl == nil {
@ -375,3 +381,10 @@ func (w *Window) Zoom() {
}
w.impl.zoom()
}
func (w *Window) RenderHTML(html string) {
if w.impl == nil {
return
}
w.impl.renderHTML(html)
}

View file

@ -45,6 +45,9 @@ void* windowNew(unsigned int id, int width, int height) {
WKWebView* webView = [[WKWebView alloc] initWithFrame:frame configuration:config];
[view addSubview:webView];
// support webview events
[webView setNavigationDelegate:delegate];
// Ensure webview resizes with the window
[webView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
@ -229,14 +232,18 @@ void windowZoomOut(void* nsWindow) {
}
// Execute JS in NSWindow
void windowExecJS(void* nsWindow, char* js) {
void windowExecJS(void* nsWindow, const char* js) {
printf("windowExecJS\n");
// Execute JS on main thread
dispatch_async(dispatch_get_main_queue(), ^{
printf("windowExecJS 2\n");
// Get window delegate
WindowDelegate* delegate = (WindowDelegate*)[(NSWindow*)nsWindow delegate];
// Execute JS in webview
printf("windowExecJS: %s\n", js);
[delegate.webView evaluateJavaScript:[NSString stringWithUTF8String:js] completionHandler:nil];
free(js);
free((void*)js);
});
}
@ -546,23 +553,47 @@ static void windowMaximize(void *window) {
[(NSWindow*)window zoom:nil];
});
}
// webviewRenderHTML renders the given HTML
static void windowRenderHTML(void *window, const char *html) {
dispatch_async(dispatch_get_main_queue(), ^{
// get main window
NSWindow* nsWindow = (NSWindow*)window;
// get window delegate
WindowDelegate* windowDelegate = (WindowDelegate*)[nsWindow delegate];
// render html
[(WKWebView*)windowDelegate.webView loadHTMLString:[NSString stringWithUTF8String:html] baseURL:nil];
});
}
static void windowInjectCSS(void *window, const char *css) {
dispatch_async(dispatch_get_main_queue(), ^{
// get main window
NSWindow* nsWindow = (NSWindow*)window;
// get window delegate
WindowDelegate* windowDelegate = (WindowDelegate*)[nsWindow delegate];
// inject css
[(WKWebView*)windowDelegate.webView evaluateJavaScript:[NSString stringWithFormat:@"(function() { var style = document.createElement('style'); style.appendChild(document.createTextNode('%@')); document.head.appendChild(style); })();", [NSString stringWithUTF8String:css]] completionHandler:nil];
free((void*)css);
});
}
*/
import "C"
import (
"sync"
"unsafe"
"github.com/wailsapp/wails/exp/pkg/events"
"github.com/wailsapp/wails/exp/pkg/options"
)
var showDevTools = func(window unsafe.Pointer) {}
type macosWindow struct {
id uint
nsWindow unsafe.Pointer
options *options.Window
// devtools
parent *Window
}
func (w *macosWindow) zoom() {
@ -603,12 +634,12 @@ func (w *macosWindow) toggleFullscreen() {
func (w *macosWindow) reload() {
//TODO: Implement
println("reload called on Window", w.id)
println("reload called on Window", w.parent.id)
}
func (w *macosWindow) forceReload() {
//TODO: Implement
println("forceReload called on Window", w.id)
println("forceReload called on Window", w.parent.id)
}
func (w *macosWindow) center() {
@ -667,6 +698,7 @@ func (w *macosWindow) restoreWindow() {
}
func (w *macosWindow) execJS(js string) {
println("execJS called on Window", w.parent.id)
C.windowExecJS(w.nsWindow, C.CString(js))
}
@ -678,10 +710,9 @@ func (w *macosWindow) setAlwaysOnTop(alwaysOnTop bool) {
C.windowSetAlwaysOnTop(w.nsWindow, C.bool(alwaysOnTop))
}
func newWindowImpl(id uint, options *options.Window) *macosWindow {
func newWindowImpl(parent *Window) *macosWindow {
result := &macosWindow{
id: id,
options: options,
parent: parent,
}
return result
}
@ -746,22 +777,22 @@ func (w *macosWindow) height() int {
func (w *macosWindow) run() {
DispatchOnMainThread(func() {
w.nsWindow = C.windowNew(C.uint(w.id), 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)
if w.options.MinWidth != 0 || w.options.MinHeight != 0 {
w.setMinSize(w.options.MinWidth, w.options.MinHeight)
w.nsWindow = C.windowNew(C.uint(w.parent.id), C.int(w.parent.options.Width), C.int(w.parent.options.Height))
w.setTitle(w.parent.options.Title)
w.setAlwaysOnTop(w.parent.options.AlwaysOnTop)
w.setResizable(!w.parent.options.DisableResize)
if w.parent.options.MinWidth != 0 || w.parent.options.MinHeight != 0 {
w.setMinSize(w.parent.options.MinWidth, w.parent.options.MinHeight)
}
if w.options.MaxWidth != 0 || w.options.MaxHeight != 0 {
w.setMaxSize(w.options.MaxWidth, w.options.MaxHeight)
if w.parent.options.MaxWidth != 0 || w.parent.options.MaxHeight != 0 {
w.setMaxSize(w.parent.options.MaxWidth, w.parent.options.MaxHeight)
}
if w.options.EnableDevTools {
if w.parent.options.EnableDevTools {
w.enableDevTools()
}
w.setBackgroundColor(w.options.BackgroundColour)
if w.options.Mac != nil {
macOptions := w.options.Mac
w.setBackgroundColor(w.parent.options.BackgroundColour)
if w.parent.options.Mac != nil {
macOptions := w.parent.options.Mac
switch macOptions.Backdrop {
case options.MacBackdropTransparent:
C.windowSetTransparent(w.nsWindow)
@ -785,7 +816,7 @@ func (w *macosWindow) run() {
C.windowSetAppearanceTypeByName(w.nsWindow, C.CString(string(macOptions.Appearance)))
}
switch w.options.StartState {
switch w.parent.options.StartState {
case options.WindowStateMaximised:
w.setMaximised()
case options.WindowStateMinimised:
@ -798,9 +829,22 @@ func (w *macosWindow) run() {
}
C.windowCenter(w.nsWindow)
if w.options.URL != "" {
w.navigateToURL(w.options.URL)
if w.parent.options.URL != "" {
w.navigateToURL(w.parent.options.URL)
}
// Ee need to wait for the HTML to load before we can execute the javascript
w.parent.On(events.Mac.WebViewDidFinishNavigation, func() {
if w.parent.options.JS != "" {
w.execJS(w.parent.options.JS)
}
if w.parent.options.CSS != "" {
C.windowInjectCSS(w.nsWindow, C.CString(w.parent.options.CSS))
}
})
if w.parent.options.HTML != "" {
w.renderHTML(w.parent.options.HTML)
}
C.windowShow(w.nsWindow)
})
}
@ -827,3 +871,10 @@ func (w *macosWindow) position() (int, int) {
func (w *macosWindow) destroy() {
C.windowDestroy(w.nsWindow)
}
func (w *macosWindow) renderHTML(html string) {
// Convert HTML to C string
cHTML := C.CString(html)
// Render HTML
C.windowRenderHTML(w.nsWindow, cHTML)
}

View file

@ -6,7 +6,7 @@
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>
@interface WindowDelegate : NSObject <NSWindowDelegate, WKScriptMessageHandler>
@interface WindowDelegate : NSObject <NSWindowDelegate, WKScriptMessageHandler, WKNavigationDelegate>
@property bool hideOnClose;
@property (retain) WKWebView* webView;

View file

@ -5,14 +5,11 @@
//
// Created by Lea Anthony on 10/10/21.
//
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "window_delegate.h"
#import "../events/events.h"
extern void processMessage(unsigned int, const char*);
@implementation WindowDelegate
- (BOOL)windowShouldClose:(NSWindow *)sender {
if( self.hideOnClose ) {
@ -21,11 +18,9 @@ extern void processMessage(unsigned int, const char*);
}
return true;
}
// Handle script messages from the external bridge
- (void)userContentController:(nonnull WKUserContentController *)userContentController didReceiveScriptMessage:(nonnull WKScriptMessage *)message {
NSString *m = message.body;
/*
// TODO: Check for drag
if ( [m isEqualToString:@"drag"] ) {
@ -38,12 +33,14 @@ extern void processMessage(unsigned int, const char*);
return;
}
*/
const char *_m = [m UTF8String];
processMessage(self.windowId, _m);
}
- (void) mouseDown:(NSEvent*)someEvent {
NSLog(@"MOUSE DOWN!!!");
}
// GENERATED EVENTS START
- (void)windowDidBecomeKey:(NSNotification *)notification {
processWindowEvent(self.windowId, EventWindowDidBecomeKey);
@ -337,19 +334,21 @@ extern void processMessage(unsigned int, const char*);
processWindowEvent(self.windowId, EventWindowWillUseStandardFrame);
}
- (void)webView:(WKWebView *)webview didStartProvisionalNavigation:(WKNavigation *)navigation {
processWindowEvent(self.windowId, EventWebViewDidStartProvisionalNavigation);
}
- (void)webView:(WKWebView *)webview didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
processWindowEvent(self.windowId, EventWebViewDidReceiveServerRedirectForProvisionalNavigation);
}
- (void)webView:(WKWebView *)webview didFinishNavigation:(WKNavigation *)navigation {
processWindowEvent(self.windowId, EventWebViewDidFinishNavigation);
}
- (void)webView:(WKWebView *)webview didCommitNavigation:(WKNavigation *)navigation {
processWindowEvent(self.windowId, EventWebViewDidCommitNavigation);
}
// GENERATED EVENTS END
@end

View file

@ -6,122 +6,126 @@ type WindowEventType uint
var Mac = newMacEvents()
type macEvents struct {
ApplicationDidBecomeActive ApplicationEventType
ApplicationDidChangeBackingProperties ApplicationEventType
ApplicationDidChangeEffectiveAppearance ApplicationEventType
ApplicationDidChangeIcon ApplicationEventType
ApplicationDidChangeOcclusionState ApplicationEventType
ApplicationDidChangeScreenParameters ApplicationEventType
ApplicationDidChangeStatusBarFrame ApplicationEventType
ApplicationDidChangeStatusBarOrientation ApplicationEventType
ApplicationDidFinishLaunching ApplicationEventType
ApplicationDidHide ApplicationEventType
ApplicationDidResignActive ApplicationEventType
ApplicationDidUnhide ApplicationEventType
ApplicationDidUpdate ApplicationEventType
ApplicationWillBecomeActive ApplicationEventType
ApplicationWillFinishLaunching ApplicationEventType
ApplicationWillHide ApplicationEventType
ApplicationWillResignActive ApplicationEventType
ApplicationWillTerminate ApplicationEventType
ApplicationWillUnhide ApplicationEventType
ApplicationWillUpdate ApplicationEventType
WindowDidBecomeKey WindowEventType
WindowDidBecomeMain WindowEventType
WindowDidBeginSheet WindowEventType
WindowDidChangeAlpha WindowEventType
WindowDidChangeBackingLocation WindowEventType
WindowDidChangeBackingProperties WindowEventType
WindowDidChangeCollectionBehavior WindowEventType
WindowDidChangeEffectiveAppearance WindowEventType
WindowDidChangeOcclusionState WindowEventType
WindowDidChangeOrderingMode WindowEventType
WindowDidChangeScreen WindowEventType
WindowDidChangeScreenParameters WindowEventType
WindowDidChangeScreenProfile WindowEventType
WindowDidChangeScreenSpace WindowEventType
WindowDidChangeScreenSpaceProperties WindowEventType
WindowDidChangeSharingType WindowEventType
WindowDidChangeSpace WindowEventType
WindowDidChangeSpaceOrderingMode WindowEventType
WindowDidChangeTitle WindowEventType
WindowDidChangeToolbar WindowEventType
WindowDidChangeVisibility WindowEventType
WindowDidClose WindowEventType
WindowDidDeminiaturize WindowEventType
WindowDidEndSheet WindowEventType
WindowDidEnterFullScreen WindowEventType
WindowDidEnterVersionBrowser WindowEventType
WindowDidExitFullScreen WindowEventType
WindowDidExitVersionBrowser WindowEventType
WindowDidExpose WindowEventType
WindowDidFocus WindowEventType
WindowDidMiniaturize WindowEventType
WindowDidMove WindowEventType
WindowDidOrderOffScreen WindowEventType
WindowDidOrderOnScreen WindowEventType
WindowDidResignKey WindowEventType
WindowDidResignMain WindowEventType
WindowDidResize WindowEventType
WindowDidUnfocus WindowEventType
WindowDidUpdate WindowEventType
WindowDidUpdateAlpha WindowEventType
WindowDidUpdateCollectionBehavior WindowEventType
WindowDidUpdateCollectionProperties WindowEventType
WindowDidUpdateShadow WindowEventType
WindowDidUpdateTitle WindowEventType
WindowDidUpdateToolbar WindowEventType
WindowDidUpdateVisibility WindowEventType
WindowWillBecomeKey WindowEventType
WindowWillBecomeMain WindowEventType
WindowWillBeginSheet WindowEventType
WindowWillChangeOrderingMode WindowEventType
WindowWillClose WindowEventType
WindowWillDeminiaturize WindowEventType
WindowWillEnterFullScreen WindowEventType
WindowWillEnterVersionBrowser WindowEventType
WindowWillExitFullScreen WindowEventType
WindowWillExitVersionBrowser WindowEventType
WindowWillFocus WindowEventType
WindowWillMiniaturize WindowEventType
WindowWillMove WindowEventType
WindowWillOrderOffScreen WindowEventType
WindowWillOrderOnScreen WindowEventType
WindowWillResignMain WindowEventType
WindowWillResize WindowEventType
WindowWillUnfocus WindowEventType
WindowWillUpdate WindowEventType
WindowWillUpdateAlpha WindowEventType
WindowWillUpdateCollectionBehavior WindowEventType
WindowWillUpdateCollectionProperties WindowEventType
WindowWillUpdateShadow WindowEventType
WindowWillUpdateTitle WindowEventType
WindowWillUpdateToolbar WindowEventType
WindowWillUpdateVisibility WindowEventType
WindowWillUseStandardFrame WindowEventType
MenuWillOpen ApplicationEventType
MenuDidOpen ApplicationEventType
MenuDidClose ApplicationEventType
MenuWillSendAction ApplicationEventType
MenuDidSendAction ApplicationEventType
MenuWillHighlightItem ApplicationEventType
MenuDidHighlightItem ApplicationEventType
MenuWillDisplayItem ApplicationEventType
MenuDidDisplayItem ApplicationEventType
MenuWillAddItem ApplicationEventType
MenuDidAddItem ApplicationEventType
MenuWillRemoveItem ApplicationEventType
MenuDidRemoveItem ApplicationEventType
MenuWillBeginTracking ApplicationEventType
MenuDidBeginTracking ApplicationEventType
MenuWillEndTracking ApplicationEventType
MenuDidEndTracking ApplicationEventType
MenuWillUpdate ApplicationEventType
MenuDidUpdate ApplicationEventType
MenuWillPopUp ApplicationEventType
MenuDidPopUp ApplicationEventType
MenuWillSendActionToItem ApplicationEventType
MenuDidSendActionToItem ApplicationEventType
ApplicationDidBecomeActive ApplicationEventType
ApplicationDidChangeBackingProperties ApplicationEventType
ApplicationDidChangeEffectiveAppearance ApplicationEventType
ApplicationDidChangeIcon ApplicationEventType
ApplicationDidChangeOcclusionState ApplicationEventType
ApplicationDidChangeScreenParameters ApplicationEventType
ApplicationDidChangeStatusBarFrame ApplicationEventType
ApplicationDidChangeStatusBarOrientation ApplicationEventType
ApplicationDidFinishLaunching ApplicationEventType
ApplicationDidHide ApplicationEventType
ApplicationDidResignActive ApplicationEventType
ApplicationDidUnhide ApplicationEventType
ApplicationDidUpdate ApplicationEventType
ApplicationWillBecomeActive ApplicationEventType
ApplicationWillFinishLaunching ApplicationEventType
ApplicationWillHide ApplicationEventType
ApplicationWillResignActive ApplicationEventType
ApplicationWillTerminate ApplicationEventType
ApplicationWillUnhide ApplicationEventType
ApplicationWillUpdate ApplicationEventType
WindowDidBecomeKey WindowEventType
WindowDidBecomeMain WindowEventType
WindowDidBeginSheet WindowEventType
WindowDidChangeAlpha WindowEventType
WindowDidChangeBackingLocation WindowEventType
WindowDidChangeBackingProperties WindowEventType
WindowDidChangeCollectionBehavior WindowEventType
WindowDidChangeEffectiveAppearance WindowEventType
WindowDidChangeOcclusionState WindowEventType
WindowDidChangeOrderingMode WindowEventType
WindowDidChangeScreen WindowEventType
WindowDidChangeScreenParameters WindowEventType
WindowDidChangeScreenProfile WindowEventType
WindowDidChangeScreenSpace WindowEventType
WindowDidChangeScreenSpaceProperties WindowEventType
WindowDidChangeSharingType WindowEventType
WindowDidChangeSpace WindowEventType
WindowDidChangeSpaceOrderingMode WindowEventType
WindowDidChangeTitle WindowEventType
WindowDidChangeToolbar WindowEventType
WindowDidChangeVisibility WindowEventType
WindowDidClose WindowEventType
WindowDidDeminiaturize WindowEventType
WindowDidEndSheet WindowEventType
WindowDidEnterFullScreen WindowEventType
WindowDidEnterVersionBrowser WindowEventType
WindowDidExitFullScreen WindowEventType
WindowDidExitVersionBrowser WindowEventType
WindowDidExpose WindowEventType
WindowDidFocus WindowEventType
WindowDidMiniaturize WindowEventType
WindowDidMove WindowEventType
WindowDidOrderOffScreen WindowEventType
WindowDidOrderOnScreen WindowEventType
WindowDidResignKey WindowEventType
WindowDidResignMain WindowEventType
WindowDidResize WindowEventType
WindowDidUnfocus WindowEventType
WindowDidUpdate WindowEventType
WindowDidUpdateAlpha WindowEventType
WindowDidUpdateCollectionBehavior WindowEventType
WindowDidUpdateCollectionProperties WindowEventType
WindowDidUpdateShadow WindowEventType
WindowDidUpdateTitle WindowEventType
WindowDidUpdateToolbar WindowEventType
WindowDidUpdateVisibility WindowEventType
WindowWillBecomeKey WindowEventType
WindowWillBecomeMain WindowEventType
WindowWillBeginSheet WindowEventType
WindowWillChangeOrderingMode WindowEventType
WindowWillClose WindowEventType
WindowWillDeminiaturize WindowEventType
WindowWillEnterFullScreen WindowEventType
WindowWillEnterVersionBrowser WindowEventType
WindowWillExitFullScreen WindowEventType
WindowWillExitVersionBrowser WindowEventType
WindowWillFocus WindowEventType
WindowWillMiniaturize WindowEventType
WindowWillMove WindowEventType
WindowWillOrderOffScreen WindowEventType
WindowWillOrderOnScreen WindowEventType
WindowWillResignMain WindowEventType
WindowWillResize WindowEventType
WindowWillUnfocus WindowEventType
WindowWillUpdate WindowEventType
WindowWillUpdateAlpha WindowEventType
WindowWillUpdateCollectionBehavior WindowEventType
WindowWillUpdateCollectionProperties WindowEventType
WindowWillUpdateShadow WindowEventType
WindowWillUpdateTitle WindowEventType
WindowWillUpdateToolbar WindowEventType
WindowWillUpdateVisibility WindowEventType
WindowWillUseStandardFrame WindowEventType
MenuWillOpen ApplicationEventType
MenuDidOpen ApplicationEventType
MenuDidClose ApplicationEventType
MenuWillSendAction ApplicationEventType
MenuDidSendAction ApplicationEventType
MenuWillHighlightItem ApplicationEventType
MenuDidHighlightItem ApplicationEventType
MenuWillDisplayItem ApplicationEventType
MenuDidDisplayItem ApplicationEventType
MenuWillAddItem ApplicationEventType
MenuDidAddItem ApplicationEventType
MenuWillRemoveItem ApplicationEventType
MenuDidRemoveItem ApplicationEventType
MenuWillBeginTracking ApplicationEventType
MenuDidBeginTracking ApplicationEventType
MenuWillEndTracking ApplicationEventType
MenuDidEndTracking ApplicationEventType
MenuWillUpdate ApplicationEventType
MenuDidUpdate ApplicationEventType
MenuWillPopUp ApplicationEventType
MenuDidPopUp ApplicationEventType
MenuWillSendActionToItem ApplicationEventType
MenuDidSendActionToItem ApplicationEventType
WebViewDidStartProvisionalNavigation WindowEventType
WebViewDidReceiveServerRedirectForProvisionalNavigation WindowEventType
WebViewDidFinishNavigation WindowEventType
WebViewDidCommitNavigation WindowEventType
}
func newMacEvents() macEvents {
@ -242,5 +246,9 @@ func newMacEvents() macEvents {
MenuDidPopUp: 113,
MenuWillSendActionToItem: 114,
MenuDidSendActionToItem: 115,
WebViewDidStartProvisionalNavigation: 116,
WebViewDidReceiveServerRedirectForProvisionalNavigation: 117,
WebViewDidFinishNavigation: 118,
WebViewDidCommitNavigation: 119,
}
}

View file

@ -122,6 +122,10 @@ extern void processWindowEvent(unsigned int, unsigned int);
#define EventMenuDidPopUp 113
#define EventMenuWillSendActionToItem 114
#define EventMenuDidSendActionToItem 115
#define EventWebViewDidStartProvisionalNavigation 116
#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 117
#define EventWebViewDidFinishNavigation 118
#define EventWebViewDidCommitNavigation 119
#endif

View file

@ -6,7 +6,7 @@ mac:ApplicationDidChangeOcclusionState
mac:ApplicationDidChangeScreenParameters
mac:ApplicationDidChangeStatusBarFrame
mac:ApplicationDidChangeStatusBarOrientation
mac:ApplicationDidFinishLaunching!
mac:ApplicationDidFinishLaunching
mac:ApplicationDidHide
mac:ApplicationDidResignActive
mac:ApplicationDidUnhide
@ -114,3 +114,8 @@ mac:MenuWillPopUp
mac:MenuDidPopUp
mac:MenuWillSendActionToItem
mac:MenuDidSendActionToItem
mac:WebViewDidStartProvisionalNavigation
mac:WebViewDidReceiveServerRedirectForProvisionalNavigation
mac:WebViewDidFinishNavigation
mac:WebViewDidCommitNavigation

View file

@ -32,6 +32,9 @@ type Window struct {
Mac *MacWindow
BackgroundColour *RGBA
Assets Assets
HTML string
JS string
CSS string
}
var WindowDefaults = &Window{

View file

@ -47,6 +47,7 @@ func main() {
cHeaderEvents := bytes.NewBufferString("")
windowDelegateEvents := bytes.NewBufferString("")
applicationDelegateEvents := bytes.NewBufferString("")
webviewDelegateEvents := bytes.NewBufferString("")
// Loop over each line in the file
for id, line := range bytes.Split(eventNames, []byte{'\n'}) {
@ -78,6 +79,9 @@ func main() {
if strings.HasPrefix(event, "Window") {
eventType = "WindowEventType"
}
if strings.HasPrefix(event, "WebView") {
eventType = "WindowEventType"
}
macEventsDecl.WriteString("\t" + eventTitle + " " + eventType + "\n")
macEventsValues.WriteString("\t\t" + event + ": " + strconv.Itoa(id) + ",\n")
cHeaderEvents.WriteString("#define Event" + eventTitle + " " + strconv.Itoa(id) + "\n")
@ -90,6 +94,16 @@ func main() {
processWindowEvent(self.windowId, Event` + eventTitle + `);
}
`)
}
// Check if this is a webview event
if strings.HasPrefix(event, "WebView") {
webViewFunction := strings.TrimPrefix(event, "WebView")
webViewFunction = string(bytes.ToLower([]byte{webViewFunction[0]})) + webViewFunction[1:]
webviewDelegateEvents.WriteString(`- (void)webView:(WKWebView *)webview ` + webViewFunction + `:(WKNavigation *)navigation {
processWindowEvent(self.windowId, Event` + eventTitle + `);
}
`)
}
if strings.HasPrefix(event, "Application") {
@ -99,88 +113,92 @@ func main() {
`)
}
}
}
// Save the eventsGo template substituting the values and decls
templateToWrite := strings.ReplaceAll(eventsGo, "$$MACEVENTSDECL", macEventsDecl.String())
templateToWrite = strings.ReplaceAll(templateToWrite, "$$MACEVENTSVALUES", macEventsValues.String())
err = os.WriteFile("../../pkg/events/events.go", []byte(templateToWrite), 0644)
if err != nil {
panic(err)
}
// Save the eventsGo template substituting the values and decls
templateToWrite := strings.ReplaceAll(eventsGo, "$$MACEVENTSDECL", macEventsDecl.String())
templateToWrite = strings.ReplaceAll(templateToWrite, "$$MACEVENTSVALUES", macEventsValues.String())
err = os.WriteFile("../../pkg/events/events.go", []byte(templateToWrite), 0644)
if err != nil {
panic(err)
}
// Save the eventsH template substituting the values and decls
templateToWrite = strings.ReplaceAll(eventsH, "$$CHEADEREVENTS", cHeaderEvents.String())
err = os.WriteFile("../../pkg/events/events.h", []byte(templateToWrite), 0644)
if err != nil {
panic(err)
}
// Save the eventsH template substituting the values and decls
templateToWrite = strings.ReplaceAll(eventsH, "$$CHEADEREVENTS", cHeaderEvents.String())
err = os.WriteFile("../../pkg/events/events.h", []byte(templateToWrite), 0644)
if err != nil {
panic(err)
}
// Load the window_delegate.m file
windowDelegate, err := os.ReadFile("../../pkg/application/window_delegate.m")
if err != nil {
panic(err)
}
// iterate over the lines until we reach a line that says "// GENERATED EVENTS START"
// then we insert the events
// then we iterate until we reach a line that says "// GENERATED EVENTS END"
// then we write the file
var buffer bytes.Buffer
var inGeneratedEvents bool
for _, line := range bytes.Split(windowDelegate, []byte{'\n'}) {
if bytes.Contains(line, []byte("// GENERATED EVENTS START")) {
inGeneratedEvents = true
buffer.WriteString("// GENERATED EVENTS START\n")
buffer.WriteString(windowDelegateEvents.String())
buffer.WriteString(webviewDelegateEvents.String())
continue
}
if bytes.Contains(line, []byte("// GENERATED EVENTS END")) {
inGeneratedEvents = false
buffer.WriteString("// GENERATED EVENTS END\n")
continue
}
if !inGeneratedEvents {
if len(line) > 0 {
buffer.Write(line)
buffer.WriteString("\n")
}
}
}
err = os.WriteFile("../../pkg/application/window_delegate.m", buffer.Bytes(), 0755)
if err != nil {
panic(err)
}
// Load the window_delegate.m file
windowDelegate, err := os.ReadFile("../../pkg/application/window_delegate.m")
if err != nil {
panic(err)
}
// iterate over the lines until we reach a line that says "// GENERATED EVENTS START"
// then we insert the events
// then we iterate until we reach a line that says "// GENERATED EVENTS END"
// then we write the file
var buffer bytes.Buffer
var inGeneratedEvents bool
for _, line := range bytes.Split(windowDelegate, []byte{'\n'}) {
if bytes.Contains(line, []byte("// GENERATED EVENTS START")) {
inGeneratedEvents = true
buffer.WriteString("// GENERATED EVENTS START\n")
buffer.WriteString(windowDelegateEvents.String())
continue
// Load the app_delegate.m file
appDelegate, err := os.ReadFile("../../pkg/application/app_delegate.m")
if err != nil {
panic(err)
}
if bytes.Contains(line, []byte("// GENERATED EVENTS END")) {
inGeneratedEvents = false
buffer.WriteString("// GENERATED EVENTS END\n")
continue
// iterate over the lines until we reach a line that says "// GENERATED EVENTS START"
// then we insert the events
// then we iterate until we reach a line that says "// GENERATED EVENTS END"
// then we write the file
buffer.Reset()
for _, line := range bytes.Split(appDelegate, []byte{'\n'}) {
if bytes.Contains(line, []byte("// GENERATED EVENTS START")) {
inGeneratedEvents = true
buffer.WriteString("// GENERATED EVENTS START\n")
buffer.WriteString(applicationDelegateEvents.String())
continue
}
if bytes.Contains(line, []byte("// GENERATED EVENTS END")) {
inGeneratedEvents = false
buffer.WriteString("// GENERATED EVENTS END\n")
continue
}
if !inGeneratedEvents {
if len(line) > 0 {
buffer.Write(line)
buffer.WriteString("\n")
}
}
}
if !inGeneratedEvents {
buffer.Write(line)
buffer.WriteString("\n")
err = os.WriteFile("../../pkg/application/app_delegate.m", buffer.Bytes(), 0755)
if err != nil {
panic(err)
}
}
err = os.WriteFile("../../pkg/application/window_delegate.m", buffer.Bytes(), 0755)
if err != nil {
panic(err)
}
// Load the app_delegate.m file
appDelegate, err := os.ReadFile("../../pkg/application/app_delegate.m")
if err != nil {
panic(err)
}
// iterate over the lines until we reach a line that says "// GENERATED EVENTS START"
// then we insert the events
// then we iterate until we reach a line that says "// GENERATED EVENTS END"
// then we write the file
buffer.Reset()
for _, line := range bytes.Split(appDelegate, []byte{'\n'}) {
if bytes.Contains(line, []byte("// GENERATED EVENTS START")) {
inGeneratedEvents = true
buffer.WriteString("// GENERATED EVENTS START\n")
buffer.WriteString(applicationDelegateEvents.String())
continue
}
if bytes.Contains(line, []byte("// GENERATED EVENTS END")) {
inGeneratedEvents = false
buffer.WriteString("// GENERATED EVENTS END\n")
continue
}
if !inGeneratedEvents {
buffer.Write(line)
buffer.WriteString("\n")
}
}
err = os.WriteFile("../../pkg/application/app_delegate.m", buffer.Bytes(), 0755)
if err != nil {
panic(err)
}
}