aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/confview.go
diff options
context:
space:
mode:
authorAlexander Neumann <alexander.neumann@picos-software.com>2019-04-10 12:47:03 +0200
committerAlexander Neumann <alexander.neumann@picos-software.com>2019-04-23 11:04:59 +0200
commit5b8d4ff0a3d0dabe620374c65e36c08b7f501cf2 (patch)
treeb96b6dc4c0139d2d167d604abcdb6279cbf22167 /ui/confview.go
parentui: only allow a single tunnel to be selected at any time (diff)
downloadwireguard-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.go49
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)