clipboard data transfer api - #4658
Conversation
ogoffart
left a comment
There was a problem hiding this comment.
Thanks a lot for working on this.
One problem with the API is that this doesn't support multiple clipboard like the middle-click paste vs ctrl+c/v.
I'm thinking the clipboard and set_clipboard functions should take an enum telling what keyboard we want.
Thank for the review. Isn't the primary selection just a Linux thing? If it should be part of the general API I would also suggest taking an enum with Clipboard::Selection and Clipboard::Primary. |
|
Yes, I meant clipboard. |
An you would prefer that being part of the cross platform api (would be easier to implement I guess)? If it should be a cross platform thing what should platforms that don't have the primary selection do? Return unsupported? |
1deca6f to
3d17417
Compare
|
I think one other point is that this API should be brought to every platform that is supported by other clipboard crates, so x11/wayland/windows/macOS at least, so users who rely on special crates for clipboard can just replace them with winit clipboard... And yeah, on linux we'd need an extra trait for |
|
I'm working on/thinking about the mac implementation, and I could also work on x11 (my testing would be limited to Xwayland) but not sure when I would be able to work on Windows, likely better if someone else with more Windows knowledge works on that. Personally I would prefer every platform being in it's own (stacked) PR but if maintainers prefer this being one giant PR sure. And I will add a trait for primary selection, definitely the shape I prefer. |
3d17417 to
a880dd6
Compare
a880dd6 to
eabee20
Compare
|
appkit implementation is now in shape I'm happy with, less complicated than initially anticipated. I'm not making good progress with x11 though and haven't looked much into the windows side. |
9006b1a to
2d95644
Compare
2d95644 to
01fea5a
Compare
01fea5a to
8d61b17
Compare
| Some(window_id) => state.events_sink.push_window_event(event, window_id), | ||
| None => { | ||
| // Clipboard is not tied to a window, dispatch to all. | ||
| for window_id in state.windows.borrow().keys() { |
There was a problem hiding this comment.
I think this is a bit silly. Maybe this should be an application-wide event? Or is that out of scope for this?
There was a problem hiding this comment.
The data transfer received event for DnD has associated window. I think that's the reason why it was originally designed like this.
So I have to associate the event with a window when using the preexisting event.
I could make the the Event not associated with a window but that makes using the DnD side worse.
Or I associate a window with the clipboard data transfer received events. In this case using the focused window instead of dipatching for all windows is an option (if desired).
Personally I would like to changed the DnD side to not have the window association with the recive event. Applications would be able to track that themselves via the data transfer id. But that requires adding a handler for application events. Is that a direction maintainers would be open to, or should I keep it window-scoped for this PR?
There was a problem hiding this comment.
Yes, this feels like the most sensible approach, to add a handler per application rather than per window.
|
Hi, I'm collaborating with Timon into adding the X11 backend. I have a mostly working implementation at timon-schelling#1. X11 requires an event to get the possible To avoid XFixes, it would be possible to poll to see where the selection changes. Alternatively the API could be adjusted so that users do not know the available types when issuing the paste request (although this would likely be annoying). I have not currently added support for the Also when the program ends and it owned the clipboard, it is not possible to paste. I think it is possible to send the data to a clipboard manager when closing. Is support for this desired? Unfortunately the X11 implementation is already quite long and complex. A lot of this is due to support for the |
Isn't this is the same as Wayland here? But besides, I think xfixes is available in a lot of places so maybe fine. |
I don't think so? The code in this PR does something like: let offer = seat.data_device()?.data().selection_offer()?;
offer.with_mime_types(|types| {
types.iter().map(|mime| MimeType::parse(mime.clone())).collect()
});Which appears inspects the mime types synchronously.
Sounds good; thanks for the input @kchibisov. |
741cf27 to
d4763cb
Compare
Add
ActiveEventLoop::clipboardandActiveEventLoop::set_clipboardforinteracting with the system clipboard through the data transfer API, implemented on Wayland, macOS and Windows.
changelogmodule if knowledge of this change could be valuable to usersFollow-up of #4571
Addition to public API consists of two new methods on
ActiveEventLoop, both defaulting toNotSupported:Works like the DnD API.
clipboard()gives you aDataTransferId, orNoneifthe clipboard is empty. Pass it to
data_transfer()for the types andfetch_data_transfer()for the data, which arrives asDataTransferReceived.set_clipboard()takes aDataTransferSend, encoded lazily when another appasks for a type, and dropped when someone else takes over the clipboard.
Tested with new
clipboardexample: press C to copy, V to paste, logs the advertised types etc.Tested with plaintext and images on Wayland (hyprland, niri and kwin), macOS 16 and Windows 11.
Also tested in Graphite's desktop app.
Changes to be aware of that are not strictly required for the feature but I think desirable:
dndmodules renamed todata_transfer, andDndStatetoDataTransferStatedispatched_events(wayland: mark dispatched events when a data transfer fetch completes)