diff --git a/src/platform_impl/linux/wayland/dnd.rs b/src/platform_impl/linux/wayland/dnd.rs new file mode 100644 index 00000000..d4405650 --- /dev/null +++ b/src/platform_impl/linux/wayland/dnd.rs @@ -0,0 +1,135 @@ +use sctk::data_device_manager::{ + data_device::DataDeviceHandler, data_offer::DataOfferHandler, data_source::DataSourceHandler, +}; + +use crate::platform_impl::wayland::state::WinitState; + +impl DataDeviceHandler for WinitState { + fn enter( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + data_device: &wayland_client::protocol::wl_data_device::WlDataDevice, + x: f64, + y: f64, + wl_surface: &wayland_client::protocol::wl_surface::WlSurface, + ) { + todo!() + } + + fn leave( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + data_device: &wayland_client::protocol::wl_data_device::WlDataDevice, + ) { + todo!() + } + + fn motion( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + data_device: &wayland_client::protocol::wl_data_device::WlDataDevice, + x: f64, + y: f64, + ) { + todo!() + } + + fn selection( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + data_device: &wayland_client::protocol::wl_data_device::WlDataDevice, + ) { + todo!() + } + + fn drop_performed( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + data_device: &wayland_client::protocol::wl_data_device::WlDataDevice, + ) { + todo!() + } +} + +impl DataOfferHandler for WinitState { + fn source_actions( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + offer: &mut sctk::data_device_manager::data_offer::DragOffer, + actions: wayland_client::protocol::wl_data_device_manager::DndAction, + ) { + todo!() + } + + fn selected_action( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + offer: &mut sctk::data_device_manager::data_offer::DragOffer, + actions: wayland_client::protocol::wl_data_device_manager::DndAction, + ) { + todo!() + } +} + +impl DataSourceHandler for WinitState { + fn accept_mime( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + source: &wayland_client::protocol::wl_data_source::WlDataSource, + mime: Option, + ) { + } + + fn send_request( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + source: &wayland_client::protocol::wl_data_source::WlDataSource, + mime: String, + fd: sctk::data_device_manager::WritePipe, + ) { + } + + fn cancelled( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + source: &wayland_client::protocol::wl_data_source::WlDataSource, + ) { + } + + fn dnd_dropped( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + source: &wayland_client::protocol::wl_data_source::WlDataSource, + ) { + } + + fn dnd_finished( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + source: &wayland_client::protocol::wl_data_source::WlDataSource, + ) { + } + + fn action( + &mut self, + conn: &wayland_client::Connection, + qh: &wayland_client::QueueHandle, + source: &wayland_client::protocol::wl_data_source::WlDataSource, + action: wayland_client::protocol::wl_data_device_manager::DndAction, + ) { + } +} + +sctk::delegate_data_device!(WinitState); diff --git a/winit-wayland/src/lib.rs b/winit-wayland/src/lib.rs index 0c89e972..937a7df7 100644 --- a/winit-wayland/src/lib.rs +++ b/winit-wayland/src/lib.rs @@ -23,6 +23,7 @@ use dpi::{LogicalSize, PhysicalSize}; use rwh_06::HandleError; use sctk::reexports::client::Proxy; use sctk::reexports::client::protocol::wl_surface::WlSurface; +use sctk::reexports::csd_frame::WindowState; use sctk::shm::slot::{Buffer, CreateBufferError, SlotPool}; use wayland_client::protocol::wl_shm::Format; use winit_core::event_loop::ActiveEventLoop as CoreActiveEventLoop; @@ -104,6 +105,8 @@ pub trait WindowExtWayland { fn xdg_toplevel(&self) -> Option>; fn xdg_surface_handle<'a>(&'a self) -> Option<&dyn HasXdgSurfaceHandle>; + + fn window_state(&self) -> Option; } impl WindowExtWayland for dyn CoreWindow + '_ { @@ -113,10 +116,13 @@ impl WindowExtWayland for dyn CoreWindow + '_ { } #[inline] - fn xdg_surface_handle(&self) -> Option<&dyn HasXdgSurfaceHandle> { Some(self.cast_ref::()? as &dyn HasXdgSurfaceHandle) } + + fn window_state(&self) -> Option { + self.cast_ref::()?.xdg_window_state() + } } #[derive(Debug, Clone, PartialEq, Eq)]