From 98b226b737693690306b2d74190118a501d4457f Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 29 Apr 2019 16:07:16 +0200 Subject: ui: make IPC calls in go routines --- ui/confview.go | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) (limited to 'ui/confview.go') diff --git a/ui/confview.go b/ui/confview.go index 57d0b0bf..a8e92957 100644 --- a/ui/confview.go +++ b/ui/confview.go @@ -420,16 +420,20 @@ func (cv *ConfView) Dispose() { func (cv *ConfView) onToggleActiveClicked() { cv.interfaze.toggleActive.button.SetEnabled(false) - oldState, err := cv.tunnel.Toggle() - if err != nil { - if oldState == service.TunnelUnknown { - walk.MsgBox(cv.Form(), "Failed to determine tunnel state", err.Error(), walk.MsgBoxIconError) - } else if oldState == service.TunnelStopped { - walk.MsgBox(cv.Form(), "Failed to activate tunnel", err.Error(), walk.MsgBoxIconError) - } else if oldState == service.TunnelStarted { - walk.MsgBox(cv.Form(), "Failed to deactivate tunnel", err.Error(), walk.MsgBoxIconError) + go func() { + oldState, err := cv.tunnel.Toggle() + if err != nil { + cv.Synchronize(func() { + if oldState == service.TunnelUnknown { + walk.MsgBox(cv.Form(), "Failed to determine tunnel state", err.Error(), walk.MsgBoxIconError) + } else if oldState == service.TunnelStopped { + walk.MsgBox(cv.Form(), "Failed to activate tunnel", err.Error(), walk.MsgBoxIconError) + } else if oldState == service.TunnelStarted { + walk.MsgBox(cv.Form(), "Failed to deactivate tunnel", err.Error(), walk.MsgBoxIconError) + } + }) } - } + }() } func (cv *ConfView) onTunnelChanged(tunnel *service.Tunnel, state service.TunnelState, globalState service.TunnelState, err error) { @@ -448,14 +452,27 @@ func (cv *ConfView) SetTunnel(tunnel *service.Tunnel) { var config conf.Config var state service.TunnelState if tunnel != nil { - if state, _ = tunnel.State(); state == service.TunnelStarted { - config, _ = tunnel.RuntimeConfig() - } - if config.Name == "" { - config, _ = tunnel.StoredConfig() + title := "Interface: " + tunnel.Name + if title != cv.name.Title() { + //TODO: display some sort of loading screen here! } + go func() { + if state, _ = tunnel.State(); state == service.TunnelStarted { + config, _ = tunnel.RuntimeConfig() + } + if config.Name == "" { + config, _ = tunnel.StoredConfig() + } + cv.Synchronize(func() { + cv.setTunnel(tunnel, &config, state) + }) + }() + } else { + cv.setTunnel(tunnel, &config, state) } +} +func (cv *ConfView) setTunnel(tunnel *service.Tunnel, config *conf.Config, state service.TunnelState) { cv.name.SetVisible(tunnel != nil) hasSuspended := false -- cgit v1.2.3-59-g8ed1b