feat(app): implement basic function
General - 配置界面支持配置对象存储桶 - 快捷键进入截图 - 一键上传截图 & 复制截图链接 MacOS - 状态栏指示器和应用图标
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
//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
|
||||
}
|
||||
Reference in New Issue
Block a user