1
0
Fork 0
forked from wry/wry

seat: ignore duplicate set_selection request

This works around [1] and [2].

[1]: https://gitlab.gnome.org/GNOME/gtk/-/issues/5097
[2]: https://github.com/mahkoh/jay/issues/47
This commit is contained in:
Julian Orth 2022-08-13 12:57:42 +02:00
parent a8f627f15c
commit 0fe59effe2
4 changed files with 14 additions and 0 deletions

View file

@ -63,6 +63,7 @@ pub trait IpcVtable: Sized {
fn send_send(src: &Rc<Self::Source>, mime_type: &str, fd: Rc<OwnedFd>);
fn remove_from_seat(device: &Self::Device);
fn get_offer_seat(offer: &Self::Offer) -> Rc<WlSeatGlobal>;
fn source_eq(left: &Self::Source, right: &Self::Source) -> bool;
}
pub struct DeviceData<T: IpcVtable> {

View file

@ -280,6 +280,10 @@ impl IpcVtable for ClipboardIpc {
fn get_offer_seat(offer: &Self::Offer) -> Rc<WlSeatGlobal> {
offer.device.seat.clone()
}
fn source_eq(left: &Self::Source, right: &Self::Source) -> bool {
left as *const _ == right as *const _
}
}
object_base! {

View file

@ -224,6 +224,10 @@ impl IpcVtable for PrimarySelectionIpc {
fn get_offer_seat(offer: &Self::Offer) -> Rc<WlSeatGlobal> {
offer.seat.clone()
}
fn source_eq(left: &Self::Source, right: &Self::Source) -> bool {
left as *const _ == right as *const _
}
}
object_base! {

View file

@ -673,6 +673,11 @@ impl WlSeatGlobal {
field: &CloneCell<Option<Rc<T::Source>>>,
src: Option<Rc<T::Source>>,
) -> Result<(), WlSeatError> {
if let (Some(new), Some(old)) = (&src, &field.get()) {
if T::source_eq(old, new) {
return Ok(());
}
}
if let Some(new) = &src {
ipc::attach_seat::<T>(new, self, ipc::Role::Selection)?;
}