refactor: removed redundant loop mechanism in wholescreencapturer
This commit is contained in:
@@ -21,7 +21,5 @@ package screencapturer
|
||||
|
||||
type ScreenCapturer interface {
|
||||
Init() error
|
||||
Start() error
|
||||
Stop() error
|
||||
Get() (filepath string, err error)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user