From bf86b0d9c17417e18e5c5bc7c001058537cb288e Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 23 Mar 2023 06:51:24 +1100 Subject: [PATCH] Add Window creation hooks Add InjectJS() to plugins interface --- v3/pkg/application/application.go | 12 ++++++++++++ v3/pkg/application/plugins.go | 19 +++++++++++++++++-- v3/plugins/TODO.md | 3 +++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 v3/plugins/TODO.md diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 4cc3083f2..6fe6a9090 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -166,6 +166,9 @@ type App struct { contextMenusLock sync.Mutex assets *assetserver.AssetServer + + // Hooks + windowCreatedCallbacks []func(window *WebviewWindow) } func (a *App) getSystemTrayID() uint { @@ -243,6 +246,11 @@ func (a *App) NewWebviewWindowWithOptions(windowOptions *WebviewWindowOptions) * a.windows[id] = newWindow a.windowsLock.Unlock() + // Call hooks + for _, hook := range a.windowCreatedCallbacks { + hook(newWindow) + } + if a.running { newWindow.run() } @@ -560,3 +568,7 @@ func (a *App) getContextMenu(name string) (*Menu, bool) { return menu, ok } + +func (a *App) OnWindowCreation(callback func(window *WebviewWindow)) { + a.windowCreatedCallbacks = append(a.windowCreatedCallbacks, callback) +} diff --git a/v3/pkg/application/plugins.go b/v3/pkg/application/plugins.go index 7b3b1c9d9..c12ef0c8e 100644 --- a/v3/pkg/application/plugins.go +++ b/v3/pkg/application/plugins.go @@ -4,8 +4,8 @@ type Plugin interface { Name() string Init(app *App) error Shutdown() - // Exported is a list of method names that should be exposed to the frontend CallableByJS() []string + InjectJS() string } type PluginManager struct { @@ -13,9 +13,11 @@ type PluginManager struct { } func NewPluginManager(plugins map[string]Plugin) *PluginManager { - return &PluginManager{ + result := &PluginManager{ plugins: plugins, } + globalApplication.OnWindowCreation(result.onWindowCreation) + return result } func (p *PluginManager) Init() error { @@ -23,6 +25,10 @@ func (p *PluginManager) Init() error { err := plugin.Init(globalApplication) if err != nil { return err + } + injectJS := plugin.InjectJS() + if injectJS != "" { + } globalApplication.info("Plugin '%s' initialised", plugin.Name()) } @@ -35,3 +41,12 @@ func (p *PluginManager) Shutdown() { globalApplication.info("Plugin '%s' shutdown", plugin.Name()) } } + +func (p *PluginManager) onWindowCreation(window *WebviewWindow) { + for _, plugin := range p.plugins { + injectJS := plugin.InjectJS() + if injectJS != "" { + window.ExecJS(injectJS) + } + } +} diff --git a/v3/plugins/TODO.md b/v3/plugins/TODO.md new file mode 100644 index 000000000..690966caf --- /dev/null +++ b/v3/plugins/TODO.md @@ -0,0 +1,3 @@ +# TODO + +- [ ] Add InjectCSS() to the plugin API? \ No newline at end of file