bd44b5aa08
Test / build-libghostty-vt (x86_64-windows-gnu) (push) Has been cancelled
Test / build-libghostty-vt-macos (aarch64-ios) (push) Has been cancelled
Test / build-libghostty-vt-macos (aarch64-macos) (push) Has been cancelled
Test / build-libghostty-vt-macos (x86_64-macos) (push) Has been cancelled
Test / build-nix (namespace-profile-ghostty-md-arm64) (push) Has been cancelled
Test / build-dist (push) Has been cancelled
Test / GTK x11=true wayland=true (push) Has been cancelled
Test / Build -Dsimd=false (push) Has been cancelled
Test / Build -Dsimd=true (push) Has been cancelled
Test / Build -Dsentry=false (push) Has been cancelled
Test / Build -Dsentry=true (push) Has been cancelled
Test / zig-fmt (push) Has been cancelled
Test / GitHub Actions Pins (push) Has been cancelled
Test / prettier (push) Has been cancelled
Test / swiftlint (push) Has been cancelled
Test / alejandra (push) Has been cancelled
Test / typos (push) Has been cancelled
Nix / Required Checks: Nix (push) Has been cancelled
Nix / check-zig-cache-hash (push) Has been cancelled
Test / skip (push) Has been cancelled
Test / Required Checks: Test (push) Has been cancelled
Test / build-bench (push) Has been cancelled
Test / list-examples (push) Has been cancelled
Test / Example ${{ matrix.dir }} (Windows) (push) Has been cancelled
Test / build-cmake (push) Has been cancelled
Test / test-lib-vt-pkgconfig (push) Has been cancelled
Test / build-flatpak (push) Has been cancelled
Test / build-snap (push) Has been cancelled
Test / build-libghostty-vt (aarch64-linux) (push) Has been cancelled
Test / build-libghostty-vt (aarch64-macos) (push) Has been cancelled
Test / build-libghostty-vt (wasm32-freestanding) (push) Has been cancelled
Test / build-libghostty-vt (x86_64-linux) (push) Has been cancelled
Test / build-libghostty-vt (x86_64-linux-musl) (push) Has been cancelled
Test / build-libghostty-vt (x86_64-macos) (push) Has been cancelled
Test / build-libghostty-vt-android (aarch64-linux-android) (push) Has been cancelled
Test / build-libghostty-vt-android (arm-linux-androideabi) (push) Has been cancelled
Test / build-libghostty-vt-android (x86_64-linux-android) (push) Has been cancelled
Test / build-libghostty-vt-windows (push) Has been cancelled
Test / build-libghostty-windows-gnu (push) Has been cancelled
Test / build-linux (namespace-profile-ghostty-md) (push) Has been cancelled
Test / build-linux (namespace-profile-ghostty-md-arm64) (push) Has been cancelled
Test / build-linux-libghostty (push) Has been cancelled
Test / build-nix (namespace-profile-ghostty-md) (push) Has been cancelled
Test / build-dist-lib-vt (push) Has been cancelled
Test / trigger-snap (push) Has been cancelled
Test / trigger-flatpak (push) Has been cancelled
Test / build-macos (push) Has been cancelled
Test / build-macos-freetype (push) Has been cancelled
Test / test (push) Has been cancelled
Test / test-lib-vt (push) Has been cancelled
Test / GTK x11=false wayland=false (push) Has been cancelled
Test / GTK x11=true wayland=false (push) Has been cancelled
Test / GTK x11=false wayland=true (push) Has been cancelled
Test / test-macos (push) Has been cancelled
Test / test-windows (push) Has been cancelled
Test / Build -Di18n=false (push) Has been cancelled
Test / Build -Di18n=true (push) Has been cancelled
Test / Build test/fuzz-libghostty (push) Has been cancelled
Test / shellcheck (push) Has been cancelled
Test / translations (push) Has been cancelled
Test / blueprint-compiler (push) Has been cancelled
Test / Test pkg/wuffs (push) Has been cancelled
Test / Test build on Debian 13 (push) Has been cancelled
Test / valgrind (push) Has been cancelled
Test / Example ${{ matrix.dir }} (push) Has been cancelled
97 lines
3.3 KiB
Swift
97 lines
3.3 KiB
Swift
import SwiftUI
|
|
|
|
/// This delegate is notified of the completion result of the clipboard confirmation dialog.
|
|
protocol ClipboardConfirmationViewDelegate: AnyObject {
|
|
func clipboardConfirmationComplete(_ action: ClipboardConfirmationView.Action, _ request: Ghostty.ClipboardRequest)
|
|
}
|
|
|
|
/// The SwiftUI view for showing a clipboard confirmation dialog.
|
|
struct ClipboardConfirmationView: View {
|
|
enum Action: String {
|
|
case cancel
|
|
case confirm
|
|
|
|
static func text(_ action: Action, _ reason: Ghostty.ClipboardRequest) -> String {
|
|
switch (action, reason) {
|
|
case (.cancel, .paste):
|
|
return "Cancel"
|
|
case (.cancel, .osc_52_read), (.cancel, .osc_52_write):
|
|
return "Deny"
|
|
case (.confirm, .paste):
|
|
return "Paste"
|
|
case (.confirm, .osc_52_read), (.confirm, .osc_52_write):
|
|
return "Allow"
|
|
}
|
|
}
|
|
}
|
|
|
|
/// The contents of the paste.
|
|
let contents: String
|
|
|
|
/// The type of the clipboard request
|
|
let request: Ghostty.ClipboardRequest
|
|
|
|
/// Optional delegate to get results. If this is nil, then this view will never close on its own.
|
|
weak var delegate: ClipboardConfirmationViewDelegate?
|
|
|
|
/// Used to track if we should rehide on disappear
|
|
@State private var cursorHiddenCount: UInt = 0
|
|
|
|
var body: some View {
|
|
VStack {
|
|
HStack {
|
|
Image(systemName: "exclamationmark.triangle.fill")
|
|
.foregroundColor(.yellow)
|
|
.font(.system(size: 42))
|
|
.padding()
|
|
.frame(alignment: .center)
|
|
|
|
Text(request.text())
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding()
|
|
}
|
|
|
|
TextEditor(text: .constant(contents))
|
|
.focusable(false)
|
|
.font(.system(.body, design: .monospaced))
|
|
|
|
HStack {
|
|
Spacer()
|
|
Button(Action.text(.cancel, request)) { onCancel() }
|
|
.keyboardShortcut(.cancelAction)
|
|
Button(Action.text(.confirm, request)) { onPaste() }
|
|
.keyboardShortcut(.defaultAction)
|
|
Spacer()
|
|
}
|
|
.padding(.bottom)
|
|
}
|
|
.onAppear {
|
|
// I can't find a better way to handle this. There is no API to detect
|
|
// if the cursor is hidden and OTHER THINGS do unhide the cursor. So we
|
|
// try to unhide it completely here and hope for the best. Issue #1516.
|
|
cursorHiddenCount = Cursor.unhideCompletely()
|
|
|
|
// If we didn't unhide anything, we just send an unhide to be safe.
|
|
// I don't think the count can go negative on NSCursor so this handles
|
|
// scenarios cursor is hidden outside of our own NSCursor usage.
|
|
if cursorHiddenCount == 0 {
|
|
_ = Cursor.unhide()
|
|
}
|
|
}
|
|
.onDisappear {
|
|
// Rehide if we unhid
|
|
for _ in 0..<cursorHiddenCount {
|
|
Cursor.hide()
|
|
}
|
|
}
|
|
}
|
|
|
|
private func onCancel() {
|
|
delegate?.clipboardConfirmationComplete(.cancel, request)
|
|
}
|
|
|
|
private func onPaste() {
|
|
delegate?.clipboardConfirmationComplete(.confirm, request)
|
|
}
|
|
}
|