Initial commit

This commit is contained in:
Alex E. Tafoya
2026-09-17 15:15:45 -05:00
commit 87fe7927c4
36 changed files with 5113 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
// Capture.swift
// GreenshotMac
//
// Equivalent of Greenshot's ICapture / ICaptureDetails.
import AppKit
enum CaptureMode: String {
case region
case fullscreen
case window
case lastRegion
case importedFile
}
/// Metadata that travels with a capture; used by the filename pattern engine.
struct CaptureDetails {
var captureMode: CaptureMode = .region
var dateTime: Date = Date()
/// Title of the captured window, or the screen name for a full screen capture.
var title: String = ""
/// Bundle identifier of the captured application, when known.
var applicationBundleID: String?
/// Application name of the captured window, when known.
var applicationName: String?
/// Screen rectangle the capture was taken from, in global (top-left origin) coordinates.
var screenBounds: CGRect = .zero
/// Scale factor of the display the capture came from.
var scaleFactor: CGFloat = 2.0
/// Set once the capture has been written to disk.
var filePath: String?
}
/// A screenshot plus its metadata.
final class Capture {
var image: CGImage
var details: CaptureDetails
init(image: CGImage, details: CaptureDetails) {
self.image = image
self.details = details
}
var pixelSize: CGSize {
CGSize(width: image.width, height: image.height)
}
/// Size in points, i.e. pixels divided by the capture's backing scale factor.
var pointSize: CGSize {
CGSize(width: CGFloat(image.width) / details.scaleFactor,
height: CGFloat(image.height) / details.scaleFactor)
}
var nsImage: NSImage {
NSImage(cgImage: image, size: pointSize)
}
}
enum CaptureError: LocalizedError {
case permissionDenied
case noContent
case cancelled
case captureFailed(String)
var errorDescription: String? {
switch self {
case .permissionDenied:
return "GreenshotMac needs Screen Recording permission. Open System Settings › Privacy & Security › Screen Recording and enable GreenshotMac."
case .noContent:
return "Nothing was available to capture."
case .cancelled:
return "Capture cancelled."
case .captureFailed(let message):
return message
}
}
}