ceecbb6af4
General - 配置界面支持配置对象存储桶 - 快捷键进入截图 - 一键上传截图 & 复制截图链接 MacOS - 状态栏指示器和应用图标
72 lines
2.1 KiB
Go
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
|
|
}
|