From e00d65d468d2b727759a950ae5b7492957f36b62 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 25 Aug 2021 20:54:05 +1000 Subject: [PATCH] [windows-x] Update events system to accommodate dev build --- v2/internal/appng/app_dev.go | 8 ++++-- .../frontend/desktop/windows/frontend.go | 2 +- v2/internal/frontend/devserver/devserver.go | 12 ++++----- v2/internal/frontend/dispatcher.go | 2 +- v2/internal/frontend/dispatcher/dispatcher.go | 4 +-- v2/internal/frontend/dispatcher/events.go | 5 ++-- v2/internal/frontend/events.go | 2 +- v2/internal/frontend/runtime/events.go | 27 ++++++++++++------- 8 files changed, 37 insertions(+), 25 deletions(-) diff --git a/v2/internal/appng/app_dev.go b/v2/internal/appng/app_dev.go index 62fb80fc0..9fc9ef104 100644 --- a/v2/internal/appng/app_dev.go +++ b/v2/internal/appng/app_dev.go @@ -8,6 +8,7 @@ import ( "flag" "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/frontend" + "github.com/wailsapp/wails/v2/internal/frontend/desktop" "github.com/wailsapp/wails/v2/internal/frontend/devserver" "github.com/wailsapp/wails/v2/internal/frontend/dispatcher" "github.com/wailsapp/wails/v2/internal/frontend/runtime" @@ -100,8 +101,11 @@ func CreateApp(appoptions *options.App) (*App, error) { ctx = context.WithValue(ctx, "events", eventHandler) messageDispatcher := dispatcher.NewDispatcher(myLogger, appBindings, eventHandler) - appFrontend := devserver.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher, menuManager) - eventHandler.SetFrontend(appFrontend) + // Create the frontends and register to event handler + desktopFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher) + appFrontend := devserver.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher, menuManager, desktopFrontend) + eventHandler.AddFrontend(appFrontend) + eventHandler.AddFrontend(desktopFrontend) result := &App{ ctx: ctx, diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index 5d71601ba..087ee7303 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -259,7 +259,7 @@ func (f *Frontend) processMessage(message string) { } return } - result, err := f.dispatcher.ProcessMessage(message) + result, err := f.dispatcher.ProcessMessage(message, f) if err != nil { f.logger.Error(err.Error()) } diff --git a/v2/internal/frontend/devserver/devserver.go b/v2/internal/frontend/devserver/devserver.go index 8ae88e88f..7ffe69e68 100644 --- a/v2/internal/frontend/devserver/devserver.go +++ b/v2/internal/frontend/devserver/devserver.go @@ -9,7 +9,6 @@ import ( "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/frontend" "github.com/wailsapp/wails/v2/internal/frontend/assetserver" - "github.com/wailsapp/wails/v2/internal/frontend/desktop" "github.com/wailsapp/wails/v2/internal/logger" "github.com/wailsapp/wails/v2/internal/menumanager" "github.com/wailsapp/wails/v2/pkg/menu" @@ -70,12 +69,13 @@ func (d *DevServer) Run(ctx context.Context) error { continue } + // Notify the other browsers if len(msg) > 2 && strings.HasPrefix(string(msg), "EE") { d.notifyExcludingSender(msg, c) - continue } - result, err := d.dispatcher.ProcessMessage(string(msg)) + // Send the message to dispatch to the frontend + result, err := d.dispatcher.ProcessMessage(string(msg), d) if err != nil { d.logger.Error(err.Error()) } @@ -235,8 +235,6 @@ func (d *DevServer) UpdateApplicationMenu() { } func (d *DevServer) Notify(name string, data ...interface{}) { - d.desktopFrontend.Notify(name, data...) - // Notify Websockets.... d.notify(name, data...) } @@ -342,10 +340,10 @@ func (d *DevServer) notifyExcludingSender(eventMessage []byte, sender *websocket d.desktopFrontend.Notify(notifyMessage.Name, notifyMessage.Data...) } -func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger.Logger, appBindings *binding.Bindings, dispatcher frontend.Dispatcher, menuManager *menumanager.Manager) *DevServer { +func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger.Logger, appBindings *binding.Bindings, dispatcher frontend.Dispatcher, menuManager *menumanager.Manager, desktopFrontend frontend.Frontend) *DevServer { result := &DevServer{ ctx: ctx, - desktopFrontend: desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, dispatcher), + desktopFrontend: desktopFrontend, appoptions: appoptions, logger: myLogger, appBindings: appBindings, diff --git a/v2/internal/frontend/dispatcher.go b/v2/internal/frontend/dispatcher.go index 8678ba26c..367f4cdc8 100644 --- a/v2/internal/frontend/dispatcher.go +++ b/v2/internal/frontend/dispatcher.go @@ -1,5 +1,5 @@ package frontend type Dispatcher interface { - ProcessMessage(message string) (string, error) + ProcessMessage(message string, sender Frontend) (string, error) } diff --git a/v2/internal/frontend/dispatcher/dispatcher.go b/v2/internal/frontend/dispatcher/dispatcher.go index c671a6f62..5d2e35b50 100644 --- a/v2/internal/frontend/dispatcher/dispatcher.go +++ b/v2/internal/frontend/dispatcher/dispatcher.go @@ -23,7 +23,7 @@ func NewDispatcher(log *logger.Logger, bindings *binding.Bindings, events fronte } } -func (d *Dispatcher) ProcessMessage(message string) (string, error) { +func (d *Dispatcher) ProcessMessage(message string, sender frontend.Frontend) (string, error) { if message == "" { return "", errors.New("No message to process") } @@ -31,7 +31,7 @@ func (d *Dispatcher) ProcessMessage(message string) (string, error) { case 'L': return d.processLogMessage(message) case 'E': - return d.processEventMessage(message) + return d.processEventMessage(message, sender) case 'C': return d.processCallMessage(message) default: diff --git a/v2/internal/frontend/dispatcher/events.go b/v2/internal/frontend/dispatcher/events.go index 41f55274a..cb308b803 100644 --- a/v2/internal/frontend/dispatcher/events.go +++ b/v2/internal/frontend/dispatcher/events.go @@ -3,6 +3,7 @@ package dispatcher import ( "encoding/json" "errors" + "github.com/wailsapp/wails/v2/internal/frontend" ) type EventMessage struct { @@ -10,7 +11,7 @@ type EventMessage struct { Data []interface{} `json:"data"` } -func (d *Dispatcher) processEventMessage(message string) (string, error) { +func (d *Dispatcher) processEventMessage(message string, sender frontend.Frontend) (string, error) { if len(message) < 3 { return "", errors.New("Invalid Event Message: " + message) } @@ -22,7 +23,7 @@ func (d *Dispatcher) processEventMessage(message string) (string, error) { if err != nil { return "", err } - go d.events.Notify(eventMessage.Name, eventMessage.Data) + go d.events.Notify(sender, eventMessage.Name, eventMessage.Data) case 'X': eventName := message[2:] go d.events.Off(eventName) diff --git a/v2/internal/frontend/events.go b/v2/internal/frontend/events.go index 3ba822e67..484e3607a 100644 --- a/v2/internal/frontend/events.go +++ b/v2/internal/frontend/events.go @@ -6,5 +6,5 @@ type Events interface { Once(eventName string, callback func(...interface{})) Emit(eventName string, data ...interface{}) Off(eventName string) - Notify(name string, data ...interface{}) + Notify(sender Frontend, name string, data ...interface{}) } diff --git a/v2/internal/frontend/runtime/events.go b/v2/internal/frontend/runtime/events.go index 358ed9a2e..3e60eab7b 100644 --- a/v2/internal/frontend/runtime/events.go +++ b/v2/internal/frontend/runtime/events.go @@ -19,15 +19,21 @@ type eventListener struct { // Events handles eventing type Events struct { log *logger.Logger - frontend frontend.Frontend + frontend []frontend.Frontend // Go event listeners listeners map[string][]*eventListener notifyLock sync.RWMutex } -func (e *Events) Notify(name string, data ...interface{}) { - e.notify(name, data...) +func (e *Events) Notify(sender frontend.Frontend, name string, data ...interface{}) { + e.notifyBackend(name, data...) + for _, thisFrontend := range e.frontend { + if thisFrontend == sender { + continue + } + thisFrontend.Notify(name, data...) + } } func (e *Events) On(eventName string, callback func(...interface{})) { @@ -43,8 +49,10 @@ func (e *Events) Once(eventName string, callback func(...interface{})) { } func (e *Events) Emit(eventName string, data ...interface{}) { - e.notify(eventName, data...) - e.frontend.Notify(eventName, data...) + e.notifyBackend(eventName, data...) + for _, thisFrontend := range e.frontend { + thisFrontend.Notify(eventName, data...) + } } func (e *Events) Off(eventName string) { @@ -82,8 +90,8 @@ func (e *Events) unRegisterListener(eventName string) { e.notifyLock.Unlock() } -// Notify for the given event name -func (e *Events) notify(eventName string, data ...interface{}) { +// Notify backend for the given event name +func (e *Events) notifyBackend(eventName string, data ...interface{}) { // Get list of event listeners listeners := e.listeners[eventName] @@ -137,6 +145,7 @@ func (e *Events) notify(eventName string, data ...interface{}) { e.notifyLock.Unlock() } -func (e *Events) SetFrontend(appFrontend frontend.Frontend) { - e.frontend = appFrontend +func (e *Events) AddFrontend(appFrontend frontend.Frontend) { + println("Adding frontend", appFrontend) + e.frontend = append(e.frontend, appFrontend) }