From 304e2612abf9779ce486313580c10b334b2e81be Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 27 Dec 2025 13:01:49 -0800 Subject: [PATCH] macOS: work on drop destination --- .../Splits/TerminalSplitTreeView.swift | 10 ++++-- .../SurfaceView+Transferable.swift | 33 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index 103413c70..44123de6d 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -32,8 +32,14 @@ struct TerminalSplitSubtreeView: View { Ghostty.InspectableSurface( surfaceView: leafView, isSplit: !isRoot) - .accessibilityElement(children: .contain) - .accessibilityLabel("Terminal pane") + .dropDestination(for: Ghostty.SurfaceView.self) { views, point in + Ghostty.logger.warning("BABY WHAT!") + return false + } isTargeted: { targeted in + Ghostty.logger.warning("BABY TARGETED=\(targeted)") + } + .accessibilityElement(children: .contain) + .accessibilityLabel("Terminal pane") case .split(let split): let splitViewDirection: SplitViewDirection = switch (split.direction) { diff --git a/macos/Sources/Ghostty/Surface View/SurfaceView+Transferable.swift b/macos/Sources/Ghostty/Surface View/SurfaceView+Transferable.swift index af20c9f37..da4b420d5 100644 --- a/macos/Sources/Ghostty/Surface View/SurfaceView+Transferable.swift +++ b/macos/Sources/Ghostty/Surface View/SurfaceView+Transferable.swift @@ -1,3 +1,4 @@ +import AppKit import CoreTransferable import UniformTypeIdentifiers @@ -6,12 +7,40 @@ extension Ghostty.SurfaceView: Transferable { DataRepresentation(contentType: .ghosttySurfaceId) { surface in withUnsafeBytes(of: surface.id.uuid) { Data($0) } } importing: { data in - throw TransferError.importNotSupported + guard data.count == 16 else { + throw TransferError.invalidData + } + + let uuid = data.withUnsafeBytes { + $0.load(as: UUID.self) + } + + guard let imported = await Self.find(uuid: uuid) else { + throw TransferError.invalidData + } + + return imported } } enum TransferError: Error { - case importNotSupported + case invalidData + } + + @MainActor + static func find(uuid: UUID) -> Self? { + for window in NSApp.windows { + guard let controller = window.windowController as? BaseTerminalController else { + continue + } + for surface in controller.surfaceTree { + if surface.id == uuid { + return surface as? Self + } + } + } + + return nil } }