diff --git a/client/ui/client_ui.go b/client/ui/client_ui.go index 8f99608e74d..326bf07ac53 100644 --- a/client/ui/client_ui.go +++ b/client/ui/client_ui.go @@ -320,6 +320,9 @@ type serviceClient struct { logFile string wLoginURL fyne.Window + sleepService *sleep.Service + sleepLock sync.Mutex + connectCancel context.CancelFunc } @@ -1165,6 +1168,14 @@ func (s *serviceClient) getSrvClient(timeout time.Duration) (proto.DaemonService // startSleepListener initializes the sleep detection service and listens for sleep events func (s *serviceClient) startSleepListener() { + s.sleepLock.Lock() + defer s.sleepLock.Unlock() + + if s.sleepService != nil { + log.Debug("sleep detection service already initialized") + return + } + sleepService, err := sleep.New() if err != nil { log.Warnf("%v", err) @@ -1176,18 +1187,32 @@ func (s *serviceClient) startSleepListener() { return } + s.sleepService = sleepService log.Info("sleep detection service initialized") // Cleanup on context cancellation go func() { <-s.ctx.Done() - log.Info("stopping sleep event listener") - if err := sleepService.Deregister(); err != nil { - log.Errorf("failed to deregister sleep detection: %v", err) - } + s.stopSleepListener() }() } +// stopSleepListener stops the sleep detection service +func (s *serviceClient) stopSleepListener() { + s.sleepLock.Lock() + defer s.sleepLock.Unlock() + + if s.sleepService == nil { + return + } + + log.Info("stopping sleep event listener") + if err := s.sleepService.Deregister(); err != nil { + log.Errorf("failed to deregister sleep detection: %v", err) + } + s.sleepService = nil +} + // handleSleepEvents sends a sleep notification to the daemon via gRPC func (s *serviceClient) handleSleepEvents(event sleep.EventType) { conn, err := s.getSrvClient(0) diff --git a/client/ui/event_handler.go b/client/ui/event_handler.go index e0b61941173..380d400eb51 100644 --- a/client/ui/event_handler.go +++ b/client/ui/event_handler.go @@ -79,6 +79,7 @@ func (h *eventHandler) handleConnectClick() { go func() { defer connectCancel() + defer h.client.startSleepListener() if err := h.client.menuUpClick(connectCtx); err != nil { st, ok := status.FromError(err) @@ -105,6 +106,8 @@ func (h *eventHandler) handleDisconnectClick() { h.client.connectCancel = nil } + h.client.stopSleepListener() + go func() { if err := h.client.menuDownClick(); err != nil { st, ok := status.FromError(err)