mirror of
https://github.com/taigrr/wails.git
synced 2026-04-14 19:01:09 -07:00
Support System calls in Go Runtime
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user