From 3209b39488de1f6b172ffbf81fb36980b010909f Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 3 Oct 2020 20:46:18 +1000 Subject: [PATCH] Support System calls in Go Runtime --- v2/internal/app/desktop.go | 2 +- v2/internal/subsystem/call.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/v2/internal/app/desktop.go b/v2/internal/app/desktop.go index 39d6c0fb..e28dd2d4 100644 --- a/v2/internal/app/desktop.go +++ b/v2/internal/app/desktop.go @@ -119,7 +119,7 @@ func (a *App) Run() error { a.event.Start() // Start the call subsystem - call, err := subsystem.NewCall(a.servicebus, a.logger, a.bindings.DB()) + call, err := subsystem.NewCall(a.servicebus, a.logger, a.bindings.DB(), a.runtime.GoRuntime()) if err != nil { return err } diff --git a/v2/internal/subsystem/call.go b/v2/internal/subsystem/call.go index 1ade33dd..54407117 100644 --- a/v2/internal/subsystem/call.go +++ b/v2/internal/subsystem/call.go @@ -3,11 +3,14 @@ package subsystem import ( "encoding/json" "fmt" + "strings" "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/logger" "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/internal/runtime/goruntime" + ) // Call is the Call subsystem. It manages all service bus messages @@ -25,10 +28,13 @@ type Call struct { // logger logger logger.CustomLogger + + // runtime + runtime *goruntime.Runtime } -// NewCall creates a new log subsystem -func NewCall(bus *servicebus.ServiceBus, logger *logger.Logger, DB *binding.DB) (*Call, error) { +// NewCall creates a new call subsystem +func NewCall(bus *servicebus.ServiceBus, logger *logger.Logger, DB *binding.DB, runtime *goruntime.Runtime) (*Call, error) { // Register quit channel quitChannel, err := bus.Subscribe("quit") @@ -48,6 +54,7 @@ func NewCall(bus *servicebus.ServiceBus, logger *logger.Logger, DB *binding.DB) logger: logger.CustomLogger("Call Subsystem"), DB: DB, bus: bus, + runtime: runtime, } return result, nil @@ -65,7 +72,7 @@ func (c *Call) Start() error { case <-c.quitChannel: c.running = false case callMessage := <-c.callChannel: - + // TODO: Check if this works ok in a goroutine c.processCall(callMessage) } } @@ -87,6 +94,12 @@ func (c *Call) processCall(callMessage *servicebus.Message) { // Lookup method registeredMethod := c.DB.GetMethod(payload.Name) + // Check if it's a system call + if strings.HasPrefix(payload.Name, ".wails.") { + c.processSystemCall(payload, callMessage.Target()) + return + } + // Check we have it if registeredMethod == nil { c.sendError(fmt.Errorf("Method not registered"), payload, callMessage.Target()) @@ -105,6 +118,16 @@ func (c *Call) processCall(callMessage *servicebus.Message) { } +func (c *Call) processSystemCall(payload *message.CallMessage, clientID string) { + c.logger.Trace("Got internal System call: %+v", payload) + callName := strings.TrimPrefix(payload.Name, ".wails.") + switch callName { + case "IsDarkMode": + darkModeEnabled := c.runtime.System.IsDarkMode() + c.sendResult(darkModeEnabled, payload, clientID) + } +} + func (c *Call) sendResult(result interface{}, payload *message.CallMessage, clientID string) { c.logger.Trace("Sending success result with CallbackID '%s' : %+v\n", payload.CallbackID, result) message := &CallbackMessage{