diff --git a/internal/screencapturer/interface.go b/internal/screencapturer/interface.go index 6045dcd..a0fb940 100644 --- a/internal/screencapturer/interface.go +++ b/internal/screencapturer/interface.go @@ -21,7 +21,5 @@ package screencapturer type ScreenCapturer interface { Init() error - Start() error - Stop() error Get() (filepath string, err error) } diff --git a/internal/screencapturer/wholescreencapturer.go b/internal/screencapturer/wholescreencapturer.go index 8b00a09..2e10a06 100644 --- a/internal/screencapturer/wholescreencapturer.go +++ b/internal/screencapturer/wholescreencapturer.go @@ -47,34 +47,36 @@ type wholeScreenCapturer struct { displayIndex int displayBounds image.Rectangle - interval int bufferCount int tempDirectory string initialized bool - running bool files []string - latest string - done chan struct{} - sync.WaitGroup - mu sync.RWMutex + mu sync.RWMutex } // Get implements ScreenCapturer. func (w *wholeScreenCapturer) Get() (filepath string, err error) { - w.mu.RLock() - defer w.mu.Unlock() - if !w.initialized { - return "", ErrNotInitialized - } - if w.latest == "" { - return "", errors.New("no screenshot captured yet") - } - return w.latest, nil + if !w.initialized { + return "", ErrNotInitialized + } + + fp, err := w.captureAndSave() + if err != nil { + w.log.Error("screenshot capture failed", "error", err) + return "", err + } + + w.addToBuffer(fp) + return fp, nil } // Init implements ScreenCapturer. func (w *wholeScreenCapturer) Init() (err error) { + if w.initialized { + w.log.Debug("wholescreencapturer already initialized, skipping initialization") + return nil + } displayCount := screenshot.NumActiveDisplays() w.displayIndex = w.config.Screenshot.ScreenIndex % displayCount @@ -87,9 +89,6 @@ func (w *wholeScreenCapturer) Init() (err error) { "dy", w.displayBounds.Dy(), ) - w.interval = w.config.Screenshot.Interval - w.log.Debug("screenshot interval set", "interval", w.interval) - w.bufferCount = w.config.Screenshot.BufferCount w.log.Debug("screenshot buffer count set", "count", w.bufferCount) @@ -100,65 +99,10 @@ func (w *wholeScreenCapturer) Init() (err error) { w.log.Debug("temporary directory created", "path", w.tempDirectory) w.files = make([]string, 0, w.bufferCount) - w.latest = "" w.initialized = true return nil } -// Start implements ScreenCapturer. -func (w *wholeScreenCapturer) Start() error { - if !w.initialized { - return ErrNotInitialized - } - if w.running { - w.log.Debug("wholescreencapturer is already running, ignoring start") - return nil - } - w.running = true - w.Go(func() { - w.captureLoop() - }) - w.log.Debug("wholescreencapturer started") - return nil -} - -// Stop implements ScreenCapturer. -func (w *wholeScreenCapturer) Stop() error { - if !w.initialized { - return ErrNotInitialized - } - if !w.running { - w.log.Debug("wholescreencapturer is not running, ignoring stop") - return nil - } - w.log.Debug("stopping wholescreencapturer") - close(w.done) - w.Wait() - w.running = false - w.log.Debug("wholescreencapturer stopped") - return nil -} - -func (w *wholeScreenCapturer) captureLoop() { - ticker := time.NewTicker(time.Duration(w.interval) * time.Second) - defer ticker.Stop() - - for { - select { - case <-w.done: - w.log.Debug("capture loop stopped") - return - case <-ticker.C: - fp, err := w.captureAndSave() - if err != nil { - w.log.Error("screenshot capture failed", "error", err) - continue - } - w.addToBuffer(fp) - } - } -} - func (w *wholeScreenCapturer) captureAndSave() (string, error) { img, err := screenshot.CaptureRect(w.displayBounds) if err != nil { @@ -191,7 +135,6 @@ func (w *wholeScreenCapturer) addToBuffer(fp string) { w.mu.Lock() defer w.mu.Unlock() w.files = append(w.files, fp) - w.latest = fp if len(w.files) > w.bufferCount { old := w.files[0] @@ -214,7 +157,6 @@ func NewWholeScreenCapturer( capturer := &wholeScreenCapturer{ config: config, log: log, - done: make(chan struct{}), } lc.Append(fx.StopHook(func(ctx context.Context) error { if !capturer.initialized { @@ -222,15 +164,18 @@ func NewWholeScreenCapturer( return nil } - log.Debug("stopping wholescreencapturer") + log.Debug("cleaning up wholescreencapturer") - err := capturer.Stop() - if err != nil { - log.Error("failed to stop wholescreencapturer gracefully") - return err + // Clean up all screenshot files + capturer.mu.Lock() + defer capturer.mu.Unlock() + for _, file := range capturer.files { + if err := os.Remove(file); err != nil { + log.Warn("failed to remove screenshot file during cleanup", "path", file, "error", err) + } } - err = os.RemoveAll(capturer.tempDirectory) + err := os.RemoveAll(capturer.tempDirectory) if err != nil { log.Error("failed to remove temp directory") return err