diff options
author | 2019-04-10 12:47:03 +0200 | |
---|---|---|
committer | 2019-04-23 11:04:59 +0200 | |
commit | 5b8d4ff0a3d0dabe620374c65e36c08b7f501cf2 (patch) | |
tree | b96b6dc4c0139d2d167d604abcdb6279cbf22167 /ui/confview.go | |
parent | ui: only allow a single tunnel to be selected at any time (diff) | |
download | wireguard-windows-5b8d4ff0a3d0dabe620374c65e36c08b7f501cf2.tar.xz wireguard-windows-5b8d4ff0a3d0dabe620374c65e36c08b7f501cf2.zip |
ui: only allow a single tunnel to be active at any time
Signed-off-by: Alexander Neumann <alexander.neumann@picos-software.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r-- | ui/confview.go | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/ui/confview.go b/ui/confview.go index b424720a..230d4dd7 100644 --- a/ui/confview.go +++ b/ui/confview.go @@ -42,8 +42,9 @@ type labelTextLine struct { } type toggleActiveLine struct { - composite *walk.Composite - button *walk.PushButton + composite *walk.Composite + button *walk.PushButton + tunnelTracker *TunnelTracker } type interfaceView struct { @@ -195,6 +196,10 @@ func (tal *toggleActiveLine) update(state service.TunnelState) { enabled, text = false, "" } + if tt := tal.tunnelTracker; tt != nil && tt.InTransition() { + enabled = false + } + tal.button.SetEnabled(enabled) tal.button.SetText(text) tal.button.SetVisible(state != service.TunnelUnknown) @@ -430,28 +435,30 @@ var crossThreadMessageHijack = windows.NewCallback(func(hwnd win.HWND, msg uint3 return win.CallWindowProc(cv.originalWndProc, hwnd, msg, wParam, lParam) }) -func (cv *ConfView) onToggleActiveClicked() { - state, err := cv.tunnel.State() - if err != nil { - walk.MsgBox(cv.Form(), "Failed to retrieve tunnel state", fmt.Sprintf("Error: %s", err.Error()), walk.MsgBoxIconError) - return - } - - cv.interfaze.toggleActive.button.SetEnabled(false) +func (cv *ConfView) TunnelTracker() *TunnelTracker { + return cv.interfaze.toggleActive.tunnelTracker +} - switch state { - case service.TunnelStarted: - if err := cv.tunnel.Stop(); err != nil { - walk.MsgBox(cv.Form(), "Failed to stop tunnel", fmt.Sprintf("Error: %s", err.Error()), walk.MsgBoxIconError) - } +func (cv *ConfView) SetTunnelTracker(tunnelTracker *TunnelTracker) { + cv.interfaze.toggleActive.tunnelTracker = tunnelTracker +} - case service.TunnelStopped: - if err := cv.tunnel.Start(); err != nil { - walk.MsgBox(cv.Form(), "Failed to start tunnel", fmt.Sprintf("Error: %s", err.Error()), walk.MsgBoxIconError) - } +func (cv *ConfView) onToggleActiveClicked() { + cv.interfaze.toggleActive.button.SetEnabled(false) - default: - panic("unexpected state") + var title string + var err error + tt := cv.TunnelTracker() + if activeTunnel := tt.ActiveTunnel(); activeTunnel != nil && activeTunnel.Name == cv.tunnel.Name { + title = "Failed to deactivate tunnel" + err = tt.DeactivateTunnel() + } else { + title = "Failed to activate tunnel" + err = tt.ActivateTunnel(cv.tunnel) + } + if err != nil { + walk.MsgBox(cv.Form(), title, err.Error(), walk.MsgBoxIconError) + return } cv.setTunnel(cv.tunnel) |