stacks icon indicating copy to clipboard operation
stacks copied to clipboard

feat: ability to paste directly from Stacks

Open cablehead opened this issue 1 year ago • 3 comments

Stacks will need to request System Settings -> Privacy & Security -> Accessibility access on macOS.

We'll also need the platform specific code to perform the actual paste.

This should be configurable in settings as either the default when you hit enter, or as a hot key combo for users who want to keep the default of copy to clipboard on enter.

cablehead avatar Feb 12 '24 18:02 cablehead

Spent some time exploring how to implement this. TL;DR: There are two ways:

  • Simulate cmd+v keypress using a crate like enigo or rdev
  • Create a Swift module and then interop with it using swift-rs

Interop with Swift is likely more robust solution than simulating keyboard events, so I explored that further.

Implementation sketch:

  • Setup swift-rs (Create new Xcode module, integrate swift-rs into the Swift module, and install swift-rs rust crate)
  • Expose 3 functions from Swift
    • Getter isAccessibilityGranted
    • showGrantAccessibilityAlert
    • pasteIntoFrontmostApp
  • Implement settings UI for "Paste on Enter"
    • When you try to enable "Paste on Enter", invoke exposed Swift getter isAccessibilityGranted & then invoke showGrantAccessibilityAlert if required
  • Change Enter press logic to check if "Paste on Enter" is enabled
    • Normally it copies first and then closes the window (correct me if I'm wrong @cablehead)
    • If enabled, instead of copying, close the window first and then invoke pasteIntoFrontmostApp in the background to paste when focus is restored on the app where Stacks was opened from.

arn4v avatar Feb 13 '24 15:02 arn4v

This is great, thank you @arn4v!

Interoping with Swift does look more robust. It'd also open up additional improvements:

1/ Currently Stacks spawns a tiny Swift CLI binary as a subprocess. The CLI monitors the system clipboard and writes updates to stdout: https://github.com/cablehead/workspace/tree/x-macos-pasteboard -- we could pull this directly into the Stacks' binary / process

2/ Stacks' makes a bunch of platform calls to configure its window as a spotlight-like window: https://github.com/cablehead/stacks/blob/main/src-tauri/src/spotlight.rs -- it'd be nicer if this was in native Swift.

Change Enter press logic to check if "Paste on Enter" is enabled, Normally it copies first and then closes the window

Yep, this is right:

  • https://github.com/cablehead/stacks/blob/main/src/app.tsx#L55-L57
  • https://github.com/cablehead/stacks/blob/main/src/types.ts#L223-L230

I'm asking in the extism discord if there's anything in their ecosystem for Swift. It'd be interesting to bridge Rust and Swift using wasm. Otherwise swift-rs looks great.

cablehead avatar Feb 13 '24 19:02 cablehead

Just capturing that it currently looks best to integrate with swift-rs directly.

cablehead avatar Feb 15 '24 14:02 cablehead