Skip to content

Instantly share code, notes, and snippets.

@joelekstrom
Last active October 25, 2025 06:30
Show Gist options
  • Save joelekstrom/91dad79ebdba409556dce663d28e8297 to your computer and use it in GitHub Desktop.
Save joelekstrom/91dad79ebdba409556dce663d28e8297 to your computer and use it in GitHub Desktop.
A view modifier that can reliably detect double clicks on macOS, even in List
extension View {
/// Adds a double click handler this view (macOS only)
///
/// Example
/// ```
/// Text("Hello")
/// .onDoubleClick { print("Double click detected") }
/// ```
/// - Parameters:
/// - handler: Block invoked when a double click is detected
func onDoubleClick(handler: @escaping () -> Void) -> some View {
modifier(DoubleClickHandler(handler: handler))
}
}
struct DoubleClickHandler: ViewModifier {
let handler: () -> Void
func body(content: Content) -> some View {
content.overlay {
DoubleClickListeningViewRepresentable(handler: handler)
}
}
}
struct DoubleClickListeningViewRepresentable: NSViewRepresentable {
let handler: () -> Void
func makeNSView(context: Context) -> DoubleClickListeningView {
DoubleClickListeningView(handler: handler)
}
func updateNSView(_ nsView: DoubleClickListeningView, context: Context) {}
}
class DoubleClickListeningView: NSView {
let handler: () -> Void
init(handler: @escaping () -> Void) {
self.handler = handler
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
if event.clickCount == 2 {
handler()
}
}
}
@erichfin
Copy link

Joel, this was a super-handy piece of code, thank you! May I ask what licensing you're applying to it?

@joelekstrom
Copy link
Author

@erichfin None, feel free to copy/modify/whatever. (I hope this comment can be legally binding 😀)

@erichfin
Copy link

Ha, I'll take it! Thank you for the prompt response, and, again, for sharing the code Joel!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment