refactor: use icon type when starting dnd

This commit is contained in:
Ashley Wulber 2024-03-27 18:28:59 -04:00
parent 5bfbaae180
commit 42a888736b
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
5 changed files with 43 additions and 9 deletions

View file

@ -119,6 +119,18 @@ pub struct DndDestinationRectangle {
pub preferred: DndAction,
}
#[derive(Clone)]
pub enum Icon {
Surface(DndSurface),
/// Xrgb8888 or Argb8888 image data with premultiplied alpha
Buffer {
data: Arc<Vec<u8>>,
width: u32,
height: u32,
transparent: bool,
},
}
#[derive(Clone)]
pub struct DndSurface(pub Arc<Box<dyn RawSurface + 'static + Send + Sync>>);

View file

@ -1,6 +1,6 @@
use std::{borrow::Cow, ffi::c_void, sync::Arc};
use crate::{DataWrapper, DndAction, DndSurface};
use crate::{DataWrapper, DndAction, DndSurface, Icon};
use smithay_clipboard::mime::{AllowedMimeTypes, AsMimeTypes, MimeType};
impl<
@ -87,3 +87,25 @@ impl From<DndAction>
a
}
}
impl From<Icon> for smithay_clipboard::dnd::Icon<DndSurface> {
fn from(icon: Icon) -> Self {
match icon {
Icon::Surface(surface) => {
smithay_clipboard::dnd::Icon::Surface(surface)
}
Icon::Buffer {
data,
width,
height,
transparent,
} => smithay_clipboard::dnd::Icon::Buf {
data: Arc::try_unwrap(data)
.unwrap_or_else(|d| d.as_ref().clone()),
width,
height,
transparent,
},
}
}
}

View file

@ -1,7 +1,7 @@
use std::borrow::Cow;
use ::dnd::{DndAction, DndDestinationRectangle, Sender};
use dnd::DndSurface;
use dnd::{DndSurface, Icon};
use mime::{AllowedMimeTypes, AsMimeTypes};
pub trait DndProvider {
@ -17,7 +17,7 @@ pub trait DndProvider {
&self,
_internal: bool,
_source_surface: DndSurface,
_icon_surface: Option<DndSurface>,
_icon_surface: Option<Icon>,
_content: D,
_actions: DndAction,
) {
@ -64,7 +64,7 @@ impl<C: DndProvider> DndProvider for crate::PlatformClipboard<C> {
&self,
internal: bool,
source_surface: DndSurface,
icon_surface: Option<DndSurface>,
icon_surface: Option<Icon>,
content: D,
actions: DndAction,
) {

View file

@ -4,7 +4,7 @@ use crate::{
ClipboardProvider,
};
use dnd::{DndAction, DndDestinationRectangle, DndSurface};
use dnd::{DndAction, DndDestinationRectangle, DndSurface, Icon};
use mime::{AllowedMimeTypes, AsMimeTypes};
use raw_window_handle::{HasDisplayHandle, RawDisplayHandle};
use std::{borrow::Cow, error::Error, sync::Arc};
@ -144,7 +144,7 @@ impl DndProvider for Clipboard {
&self,
internal: bool,
source_surface: DndSurface,
icon_surface: Option<DndSurface>,
icon_surface: Option<Icon>,
content: D,
actions: DndAction,
) {

View file

@ -23,7 +23,7 @@ use dnd::{
DataWrapper, DndAction, DndDestinationRectangle, DndSurface, Sender,
};
use mime::ClipboardData;
use smithay_clipboard::dnd::Rectangle;
use smithay_clipboard::dnd::{Icon, Rectangle};
pub use smithay_clipboard::mime::{AllowedMimeTypes, AsMimeTypes, MimeType};
#[derive(Clone)]
@ -214,14 +214,14 @@ impl Clipboard {
&self,
internal: bool,
source_surface: DndSurface,
icon_surface: Option<DndSurface>,
icon_surface: Option<dnd::Icon>,
content: D,
actions: DndAction,
) {
_ = self.context.lock().unwrap().start_dnd(
internal,
source_surface,
icon_surface,
icon_surface.map(|i| Icon::<DndSurface>::from(i)),
DataWrapper(content),
actions.into(),
);