5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 00:09:56 +08:00

[windows-x] Update events system to accommodate dev build

This commit is contained in:
Lea Anthony 2021-08-25 20:54:05 +10:00
parent dbcf4058e5
commit e00d65d468
8 changed files with 37 additions and 25 deletions

View File

@ -8,6 +8,7 @@ import (
"flag" "flag"
"github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/frontend" "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/devserver"
"github.com/wailsapp/wails/v2/internal/frontend/dispatcher" "github.com/wailsapp/wails/v2/internal/frontend/dispatcher"
"github.com/wailsapp/wails/v2/internal/frontend/runtime" "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) ctx = context.WithValue(ctx, "events", eventHandler)
messageDispatcher := dispatcher.NewDispatcher(myLogger, appBindings, eventHandler) messageDispatcher := dispatcher.NewDispatcher(myLogger, appBindings, eventHandler)
appFrontend := devserver.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher, menuManager) // Create the frontends and register to event handler
eventHandler.SetFrontend(appFrontend) 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{ result := &App{
ctx: ctx, ctx: ctx,

View File

@ -259,7 +259,7 @@ func (f *Frontend) processMessage(message string) {
} }
return return
} }
result, err := f.dispatcher.ProcessMessage(message) result, err := f.dispatcher.ProcessMessage(message, f)
if err != nil { if err != nil {
f.logger.Error(err.Error()) f.logger.Error(err.Error())
} }

View File

@ -9,7 +9,6 @@ import (
"github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/frontend" "github.com/wailsapp/wails/v2/internal/frontend"
"github.com/wailsapp/wails/v2/internal/frontend/assetserver" "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/logger"
"github.com/wailsapp/wails/v2/internal/menumanager" "github.com/wailsapp/wails/v2/internal/menumanager"
"github.com/wailsapp/wails/v2/pkg/menu" "github.com/wailsapp/wails/v2/pkg/menu"
@ -70,12 +69,13 @@ func (d *DevServer) Run(ctx context.Context) error {
continue continue
} }
// Notify the other browsers
if len(msg) > 2 && strings.HasPrefix(string(msg), "EE") { if len(msg) > 2 && strings.HasPrefix(string(msg), "EE") {
d.notifyExcludingSender(msg, c) 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 { if err != nil {
d.logger.Error(err.Error()) d.logger.Error(err.Error())
} }
@ -235,8 +235,6 @@ func (d *DevServer) UpdateApplicationMenu() {
} }
func (d *DevServer) Notify(name string, data ...interface{}) { func (d *DevServer) Notify(name string, data ...interface{}) {
d.desktopFrontend.Notify(name, data...)
// Notify Websockets....
d.notify(name, data...) d.notify(name, data...)
} }
@ -342,10 +340,10 @@ func (d *DevServer) notifyExcludingSender(eventMessage []byte, sender *websocket
d.desktopFrontend.Notify(notifyMessage.Name, notifyMessage.Data...) 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{ result := &DevServer{
ctx: ctx, ctx: ctx,
desktopFrontend: desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, dispatcher), desktopFrontend: desktopFrontend,
appoptions: appoptions, appoptions: appoptions,
logger: myLogger, logger: myLogger,
appBindings: appBindings, appBindings: appBindings,

View File

@ -1,5 +1,5 @@
package frontend package frontend
type Dispatcher interface { type Dispatcher interface {
ProcessMessage(message string) (string, error) ProcessMessage(message string, sender Frontend) (string, error)
} }

View File

@ -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 == "" { if message == "" {
return "", errors.New("No message to process") return "", errors.New("No message to process")
} }
@ -31,7 +31,7 @@ func (d *Dispatcher) ProcessMessage(message string) (string, error) {
case 'L': case 'L':
return d.processLogMessage(message) return d.processLogMessage(message)
case 'E': case 'E':
return d.processEventMessage(message) return d.processEventMessage(message, sender)
case 'C': case 'C':
return d.processCallMessage(message) return d.processCallMessage(message)
default: default:

View File

@ -3,6 +3,7 @@ package dispatcher
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"github.com/wailsapp/wails/v2/internal/frontend"
) )
type EventMessage struct { type EventMessage struct {
@ -10,7 +11,7 @@ type EventMessage struct {
Data []interface{} `json:"data"` 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 { if len(message) < 3 {
return "", errors.New("Invalid Event Message: " + message) return "", errors.New("Invalid Event Message: " + message)
} }
@ -22,7 +23,7 @@ func (d *Dispatcher) processEventMessage(message string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
go d.events.Notify(eventMessage.Name, eventMessage.Data) go d.events.Notify(sender, eventMessage.Name, eventMessage.Data)
case 'X': case 'X':
eventName := message[2:] eventName := message[2:]
go d.events.Off(eventName) go d.events.Off(eventName)

View File

@ -6,5 +6,5 @@ type Events interface {
Once(eventName string, callback func(...interface{})) Once(eventName string, callback func(...interface{}))
Emit(eventName string, data ...interface{}) Emit(eventName string, data ...interface{})
Off(eventName string) Off(eventName string)
Notify(name string, data ...interface{}) Notify(sender Frontend, name string, data ...interface{})
} }

View File

@ -19,15 +19,21 @@ type eventListener struct {
// Events handles eventing // Events handles eventing
type Events struct { type Events struct {
log *logger.Logger log *logger.Logger
frontend frontend.Frontend frontend []frontend.Frontend
// Go event listeners // Go event listeners
listeners map[string][]*eventListener listeners map[string][]*eventListener
notifyLock sync.RWMutex notifyLock sync.RWMutex
} }
func (e *Events) Notify(name string, data ...interface{}) { func (e *Events) Notify(sender frontend.Frontend, name string, data ...interface{}) {
e.notify(name, data...) 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{})) { 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{}) { func (e *Events) Emit(eventName string, data ...interface{}) {
e.notify(eventName, data...) e.notifyBackend(eventName, data...)
e.frontend.Notify(eventName, data...) for _, thisFrontend := range e.frontend {
thisFrontend.Notify(eventName, data...)
}
} }
func (e *Events) Off(eventName string) { func (e *Events) Off(eventName string) {
@ -82,8 +90,8 @@ func (e *Events) unRegisterListener(eventName string) {
e.notifyLock.Unlock() e.notifyLock.Unlock()
} }
// Notify for the given event name // Notify backend for the given event name
func (e *Events) notify(eventName string, data ...interface{}) { func (e *Events) notifyBackend(eventName string, data ...interface{}) {
// Get list of event listeners // Get list of event listeners
listeners := e.listeners[eventName] listeners := e.listeners[eventName]
@ -137,6 +145,7 @@ func (e *Events) notify(eventName string, data ...interface{}) {
e.notifyLock.Unlock() e.notifyLock.Unlock()
} }
func (e *Events) SetFrontend(appFrontend frontend.Frontend) { func (e *Events) AddFrontend(appFrontend frontend.Frontend) {
e.frontend = appFrontend println("Adding frontend", appFrontend)
e.frontend = append(e.frontend, appFrontend)
} }