cosmic-comp/src/wayland/handlers/selection.rs
2024-04-16 18:50:54 +02:00

58 lines
1.6 KiB
Rust

// SPDX-License-Identifier: GPL-3.0-only
use crate::state::State;
use smithay::{
input::Seat,
wayland::selection::{SelectionHandler, SelectionSource, SelectionTarget},
xwayland::xwm::XwmId,
};
use std::os::unix::io::OwnedFd;
use tracing::warn;
impl SelectionHandler for State {
type SelectionUserData = XwmId;
fn new_selection(
&mut self,
target: SelectionTarget,
source: Option<SelectionSource>,
_seat: Seat<State>,
) {
if let Some(xwm) = self
.common
.xwayland_state
.as_mut()
.and_then(|xstate| xstate.xwm.as_mut())
{
if let Some(source) = &source {
if let Err(err) = xwm.new_selection(target, Some(source.mime_types())) {
warn!(?err, "Failed to set Xwayland clipboard selection.");
}
} else if let Err(err) = xwm.new_selection(target, None) {
warn!(?err, "Failed to clear Xwayland selection.");
}
}
}
fn send_selection(
&mut self,
target: SelectionTarget,
mime_type: String,
fd: OwnedFd,
_seat: Seat<State>,
_user_data: &Self::SelectionUserData,
) {
if let Some(xwm) = self
.common
.xwayland_state
.as_mut()
.and_then(|xstate| xstate.xwm.as_mut())
{
if let Err(err) =
xwm.send_selection(target, mime_type, fd, self.common.event_loop_handle.clone())
{
warn!(?err, "Failed to send selection (X11 -> Wayland).");
}
}
}
}