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:
parent
dbcf4058e5
commit
e00d65d468
@ -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,
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
@ -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{})
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user