chore: refactor dnd offer mimes

This commit is contained in:
Ashley Wulber 2024-03-22 19:08:47 -04:00
parent 1063256706
commit f5384a32c0
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
3 changed files with 11 additions and 15 deletions

View file

@ -78,7 +78,10 @@ fn main() {
DndDestinationRectangle { DndDestinationRectangle {
id: 0, id: 0,
rectangle: Rectangle { x: 0., y: 0., width: 256., height: 256. }, rectangle: Rectangle { x: 0., y: 0., width: 256., height: 256. },
mime_types: ALLOWED_TEXT_MIME_TYPES.iter().map(|m| Cow::from(m.to_string())).collect(), mime_types: ALLOWED_TEXT_MIME_TYPES
.iter()
.map(|m| MimeType::from(Cow::from(m.to_string())))
.collect(),
actions: DndAction::all(), actions: DndAction::all(),
preferred: DndAction::Copy, preferred: DndAction::Copy,
}, },

View file

@ -1,4 +1,3 @@
use std::borrow::Cow;
use std::ffi::c_void; use std::ffi::c_void;
use std::fmt::Debug; use std::fmt::Debug;
use std::sync::mpsc::SendError; use std::sync::mpsc::SendError;
@ -9,7 +8,7 @@ use sctk::reexports::client::protocol::wl_surface::WlSurface;
use sctk::reexports::client::{Connection, Proxy}; use sctk::reexports::client::{Connection, Proxy};
use wayland_backend::client::{InvalidId, ObjectId}; use wayland_backend::client::{InvalidId, ObjectId};
use crate::mime::AsMimeTypes; use crate::mime::{AsMimeTypes, MimeType};
use crate::Clipboard; use crate::Clipboard;
pub mod state; pub mod state;
@ -118,7 +117,7 @@ pub struct DndDestinationRectangle {
/// The rectangle representing this destination. /// The rectangle representing this destination.
pub rectangle: Rectangle, pub rectangle: Rectangle,
/// Accepted mime types in this rectangle /// Accepted mime types in this rectangle
pub mime_types: Vec<Cow<'static, str>>, pub mime_types: Vec<MimeType>,
/// Accepted actions in this rectangle /// Accepted actions in this rectangle
pub actions: DndAction, pub actions: DndAction,
/// Prefered action in this rectangle /// Prefered action in this rectangle

View file

@ -27,7 +27,7 @@ pub(crate) struct DndState<T> {
active_surface: Option<(DndSurface<T>, Option<DndDestinationRectangle>)>, active_surface: Option<(DndSurface<T>, Option<DndDestinationRectangle>)>,
source_actions: DndAction, source_actions: DndAction,
selected_action: DndAction, selected_action: DndAction,
selected_mime: Option<String>, selected_mime: Option<MimeType>,
pub(crate) source_content: Box<dyn AsMimeTypes>, pub(crate) source_content: Box<dyn AsMimeTypes>,
pub(crate) source_mime_types: Rc<Cow<'static, [MimeType]>>, pub(crate) source_mime_types: Rc<Cow<'static, [MimeType]>>,
} }
@ -82,13 +82,10 @@ where
}); });
let mime = dnd_state.as_ref().and_then(|dnd_state| { let mime = dnd_state.as_ref().and_then(|dnd_state| {
r.mime_types.iter().find(|m| { r.mime_types.iter().find(|m| {
dnd_state.with_mime_types(|mimes| mimes.iter().any(|a| &a == m)) dnd_state.with_mime_types(|mimes| mimes.iter().any(|a| a == m.as_ref()))
}) })
}); });
dbg!(actions);
dbg!(mime);
(r.rectangle.contains(x, y) (r.rectangle.contains(x, y)
&& (r.mime_types.is_empty() || mime.is_some()) && (r.mime_types.is_empty() || mime.is_some())
&& (r.actions.is_all() && (r.actions.is_all()
@ -118,7 +115,7 @@ where
(actions, mime, dnd_state.as_ref()) (actions, mime, dnd_state.as_ref())
{ {
dnd_state.set_actions(action, preferred_action); dnd_state.set_actions(action, preferred_action);
self.dnd_state.selected_mime = Some(mime_type.to_string()); self.dnd_state.selected_mime = Some(mime_type.clone());
dnd_state.accept_mime_type(dnd_state.serial, Some(mime_type.to_string())) dnd_state.accept_mime_type(dnd_state.serial, Some(mime_type.to_string()))
} }
(s.clone(), Some(dest)) (s.clone(), Some(dest))
@ -162,9 +159,9 @@ where
}; };
dnd_state.set_actions(self.dnd_state.selected_action, self.dnd_state.selected_action); dnd_state.set_actions(self.dnd_state.selected_action, self.dnd_state.selected_action);
dnd_state.accept_mime_type(dnd_state.serial, Some(mime.clone())); dnd_state.accept_mime_type(dnd_state.serial, Some(mime.to_string()));
_ = self.load_dnd(MimeType::Other(mime.into())); _ = self.load_dnd(mime);
} }
pub(crate) fn offer_enter( pub(crate) fn offer_enter(
@ -267,9 +264,6 @@ where
.get_mut(latest) .get_mut(latest)
.ok_or_else(|| Error::new(ErrorKind::Other, "active seat lost"))?; .ok_or_else(|| Error::new(ErrorKind::Other, "active seat lost"))?;
if !seat.has_focus {
return Err(Error::new(ErrorKind::Other, "client doesn't have focus"));
}
let offer = seat let offer = seat
.data_device .data_device
.as_ref() .as_ref()