Files
SnapGo/internal/infrastructure/screencapture/capturer_other.go
T
mamamiyear ceecbb6af4 feat(app): implement basic function
General
- 配置界面支持配置对象存储桶
- 快捷键进入截图
- 一键上传截图 & 复制截图链接

MacOS
- 状态栏指示器和应用图标
2026-06-01 21:17:29 +08:00

72 lines
2.1 KiB
Go

//go:build !darwin
package screencapture
import (
"bytes"
"fmt"
"image"
"image/png"
"github.com/kbinani/screenshot"
)
// kbinaniCapturer is the default non-darwin Capturer.
type kbinaniCapturer struct{}
// New returns the default cross-platform Capturer for non-macOS systems.
func New() Capturer { return &kbinaniCapturer{} }
func (c *kbinaniCapturer) VirtualBounds() image.Rectangle {
n := screenshot.NumActiveDisplays()
if n == 0 {
return image.Rect(0, 0, 0, 0)
}
bounds := screenshot.GetDisplayBounds(0)
for i := 1; i < n; i++ {
bounds = bounds.Union(screenshot.GetDisplayBounds(i))
}
return bounds
}
func (c *kbinaniCapturer) CaptureRegion(rect image.Rectangle) ([]byte, error) {
if rect.Dx() <= 0 || rect.Dy() <= 0 {
return nil, fmt.Errorf("invalid capture rectangle: %v", rect)
}
img, err := screenshot.CaptureRect(rect)
if err != nil {
return nil, fmt.Errorf("capture: %w", err)
}
var buf bytes.Buffer
if err := png.Encode(&buf, img); err != nil {
return nil, fmt.Errorf("encode png: %w", err)
}
return buf.Bytes(), nil
}
// CaptureInteractive on non-darwin platforms is not yet implemented. The
// frontend overlay still works there. We surface a clear error so callers
// can decide whether to fall back to the WebView overlay.
func (c *kbinaniCapturer) CaptureInteractive() ([]byte, error) {
return nil, fmt.Errorf("interactive capture is not implemented on this platform yet")
}
// CaptureFullScreen grabs the primary display via kbinani/screenshot and
// PNG-encodes the result. Multi-display extension is deliberately deferred
// to keep parity with the macOS "primary only" UX.
func (c *kbinaniCapturer) CaptureFullScreen() ([]byte, error) {
if screenshot.NumActiveDisplays() == 0 {
return nil, fmt.Errorf("no active display detected")
}
bounds := screenshot.GetDisplayBounds(0)
img, err := screenshot.CaptureRect(bounds)
if err != nil {
return nil, fmt.Errorf("capture full screen: %w", err)
}
var buf bytes.Buffer
if err := png.Encode(&buf, img); err != nil {
return nil, fmt.Errorf("encode png: %w", err)
}
return buf.Bytes(), nil
}