feat: ability to paste directly from Stacks
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.
Spent some time exploring how to implement this. TL;DR: There are two ways:
- Simulate
cmd+vkeypress using a crate likeenigoorrdevenigodoesn't work well with Tauri right now. It causes a crash, so it rules itself out.
- 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 showGrantAccessibilityAlertpasteIntoFrontmostApp
- Getter
- Implement settings UI for "Paste on Enter"
- When you try to enable "Paste on Enter", invoke exposed Swift getter
isAccessibilityGranted& then invokeshowGrantAccessibilityAlertif required
- When you try to enable "Paste on Enter", invoke exposed Swift getter
- 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
pasteIntoFrontmostAppin the background to paste when focus is restored on the app where Stacks was opened from.
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.
Just capturing that it currently looks best to integrate with swift-rs directly.