1
0
Fork 0
forked from wry/wry

autocommit 2022-02-09 17:27:03 CET

This commit is contained in:
Julian Orth 2022-02-09 17:27:03 +01:00
parent 8faab3fe53
commit 84d89afbde
6 changed files with 104 additions and 48 deletions

View file

@ -1,16 +1,16 @@
use crate::client::{Client, ClientId, WaylandObject};
use crate::ifs::wl_seat::WlSeatGlobal;
use crate::object::ObjectId;
use crate::utils::bitflags::BitflagsExt;
use crate::utils::clonecell::CloneCell;
use crate::utils::smallmap::SmallMap;
use crate::NumCell;
use ahash::AHashSet;
use std::cell::{Cell, RefCell};
use std::ops::{Deref};
use std::ops::Deref;
use std::rc::Rc;
use thiserror::Error;
use uapi::OwnedFd;
use crate::NumCell;
use crate::utils::bitflags::BitflagsExt;
pub mod wl_data_device;
pub mod wl_data_device_manager;
@ -122,7 +122,7 @@ impl Default for SharedState {
role: Cell::new(Role::Selection),
receiver_actions: Cell::new(0),
receiver_preferred_action: Cell::new(0),
selected_action: Cell::new(0)
selected_action: Cell::new(0),
}
}
}
@ -272,7 +272,10 @@ fn destroy_offer<T: Vtable>(offer: &T::Offer) {
if let Some(src) = data.source.take() {
let src_data = T::get_source_data(&src);
src_data.offers.remove(&T::get_offer_id(offer));
if src_data.offers.is_empty() && src_data.role.get() == Role::Dnd && data.shared.state.get().contains(OFFER_STATE_DROPPED) {
if src_data.offers.is_empty()
&& src_data.role.get() == Role::Dnd
&& data.shared.state.get().contains(OFFER_STATE_DROPPED)
{
if let Some(seat) = src_data.seat.take() {
T::unset(&seat, data.shared.role.get());
}

View file

@ -1,15 +1,18 @@
use crate::client::{Client, ClientError};
use crate::ifs::ipc::wl_data_device::WlDataDevice;
use crate::ifs::ipc::{break_offer_loops, destroy_offer, receive, OfferData, Role, OFFER_STATE_FINISHED, OFFER_STATE_DROPPED, OFFER_STATE_ACCEPTED, SOURCE_STATE_FINISHED};
use crate::ifs::ipc::wl_data_device_manager::DND_ALL;
use crate::ifs::ipc::{
break_offer_loops, destroy_offer, receive, OfferData, Role, OFFER_STATE_ACCEPTED,
OFFER_STATE_DROPPED, OFFER_STATE_FINISHED, SOURCE_STATE_FINISHED,
};
use crate::object::Object;
use crate::utils::bitflags::BitflagsExt;
use crate::utils::buffd::MsgParser;
use crate::utils::buffd::MsgParserError;
use crate::wire::wl_data_offer::*;
use crate::wire::WlDataOfferId;
use std::rc::Rc;
use thiserror::Error;
use crate::ifs::ipc::wl_data_device_manager::{DND_ALL};
use crate::utils::bitflags::BitflagsExt;
#[allow(dead_code)]
const INVALID_FINISH: u32 = 0;
@ -126,7 +129,10 @@ impl WlDataOffer {
return Err(SetActionsError::MultiplePreferred);
}
self.data.shared.receiver_actions.set(req.dnd_actions);
self.data.shared.receiver_preferred_action.set(req.preferred_action);
self.data
.shared
.receiver_preferred_action
.set(req.preferred_action);
if let Some(src) = self.data.source.get() {
src.update_selected_action();
}

View file

@ -1,8 +1,13 @@
use crate::client::{Client, ClientError};
use crate::ifs::ipc::wl_data_device::WlDataDevice;
use crate::ifs::ipc::wl_data_device_manager::{DND_ALL, DND_NONE};
use crate::ifs::ipc::wl_data_offer::WlDataOffer;
use crate::ifs::ipc::{add_mime_type, break_source_loops, cancel_offers, destroy_source, OFFER_STATE_ACCEPTED, OFFER_STATE_DROPPED, SharedState, SourceData};
use crate::ifs::ipc::{
add_mime_type, break_source_loops, cancel_offers, destroy_source, SharedState, SourceData,
OFFER_STATE_ACCEPTED, OFFER_STATE_DROPPED,
};
use crate::object::Object;
use crate::utils::bitflags::BitflagsExt;
use crate::utils::buffd::MsgParser;
use crate::utils::buffd::MsgParserError;
use crate::wire::wl_data_source::*;
@ -10,8 +15,6 @@ use crate::wire::WlDataSourceId;
use std::rc::Rc;
use thiserror::Error;
use uapi::OwnedFd;
use crate::ifs::ipc::wl_data_device_manager::{DND_ALL, DND_NONE};
use crate::utils::bitflags::BitflagsExt;
#[allow(dead_code)]
const INVALID_ACTION_MASK: u32 = 0;
@ -32,7 +35,14 @@ impl WlDataSource {
}
pub fn on_leave(&self) {
if self.data.shared.get().state.get().contains(OFFER_STATE_DROPPED) {
if self
.data
.shared
.get()
.state
.get()
.contains(OFFER_STATE_DROPPED)
{
return;
}
self.data.shared.set(Rc::new(SharedState::default()));
@ -58,7 +68,12 @@ impl WlDataSource {
} else {
0
};
log::info!("sa = {}, ra = {}, action = {}", server_actions, shared.receiver_actions.get(), action);
log::info!(
"sa = {}, ra = {}, action = {}",
server_actions,
shared.receiver_actions.get(),
action
);
if shared.selected_action.replace(action) != action {
for (_, offer) in &self.data.offers {
offer.send_action(action);
@ -110,11 +125,16 @@ impl WlDataSource {
}
pub fn send_action(&self, dnd_action: u32) {
self.data.client.event(Action { self_id: self.id, dnd_action, })
self.data.client.event(Action {
self_id: self.id,
dnd_action,
})
}
pub fn send_dnd_drop_performed(&self) {
self.data.client.event(DndDropPerformed { self_id: self.id })
self.data
.client
.event(DndDropPerformed { self_id: self.id })
}
fn offer(&self, parser: MsgParser<'_, '_>) -> Result<(), OfferError> {