diff --git a/anvil/src/main.rs b/anvil/src/main.rs index ee1c95f..ce4523e 100644 --- a/anvil/src/main.rs +++ b/anvil/src/main.rs @@ -16,7 +16,6 @@ use smithay::wayland_server::{calloop::EventLoop, Display}; mod shaders; mod glium_drawer; mod input_handler; -mod misc; #[cfg(feature = "tty_launch")] mod raw_drm; mod shell; diff --git a/anvil/src/misc.rs b/anvil/src/misc.rs index 5d26ee6..e69de29 100644 --- a/anvil/src/misc.rs +++ b/anvil/src/misc.rs @@ -1,19 +0,0 @@ -use smithay::wayland_server::protocol::wl_data_device_manager::DndAction; - -pub fn dnd_action_chooser(available: DndAction, preferred: DndAction) -> DndAction { - // if the preferred action is valid (a single action) and in the available actions, use it - // otherwise, follow a fallback stategy - if [DndAction::Move, DndAction::Copy, DndAction::Ask].contains(&preferred) - && available.contains(preferred) - { - preferred - } else if available.contains(DndAction::Ask) { - DndAction::Ask - } else if available.contains(DndAction::Copy) { - DndAction::Copy - } else if available.contains(DndAction::Move) { - DndAction::Move - } else { - DndAction::empty() - } -} diff --git a/anvil/src/udev.rs b/anvil/src/udev.rs index 4e6dacd..a3de2aa 100644 --- a/anvil/src/udev.rs +++ b/anvil/src/udev.rs @@ -42,7 +42,7 @@ use smithay::{ input::Libinput, wayland::{ compositor::CompositorToken, - data_device::{init_data_device, set_data_device_focus}, + data_device::{default_action_chooser, init_data_device, set_data_device_focus}, output::{Mode, Output, PhysicalProperties}, seat::{Seat, XkbConfig}, shm::init_shm_global, @@ -111,7 +111,7 @@ pub fn run_udev(mut display: Display, mut event_loop: EventLoop<()>, log: Logger init_data_device( &mut display.borrow_mut(), |_| {}, - ::misc::dnd_action_chooser, + default_action_chooser, log.clone(), ); diff --git a/anvil/src/winit.rs b/anvil/src/winit.rs index 0ef1b76..4d191bd 100644 --- a/anvil/src/winit.rs +++ b/anvil/src/winit.rs @@ -11,7 +11,7 @@ use smithay::{ winit, }, wayland::{ - data_device::{init_data_device, set_data_device_focus}, + data_device::{default_action_chooser, init_data_device, set_data_device_focus}, output::{Mode, Output, PhysicalProperties}, seat::{Seat, XkbConfig}, shm::init_shm_global, @@ -54,7 +54,7 @@ pub fn run_winit(display: &mut Display, event_loop: &mut EventLoop<()>, log: Log let (compositor_token, _, _, window_map) = init_shell(display, log.clone()); - init_data_device(display, |_| {}, ::misc::dnd_action_chooser, log.clone()); + init_data_device(display, |_| {}, default_action_chooser, log.clone()); let (mut seat, _) = Seat::new(display, "winit".into(), log.clone()); diff --git a/src/wayland/data_device/mod.rs b/src/wayland/data_device/mod.rs index 4f94281..0c2b84b 100644 --- a/src/wayland/data_device/mod.rs +++ b/src/wayland/data_device/mod.rs @@ -23,6 +23,27 @@ //! for your clients //! - the freestanding function `start_dnd` allows you to initiate a drag'n'drop event from the compositor //! itself and receive interactions of clients with it via an other dedicated callback. +//! +//! ## Initialization +//! +//! ``` +//! # extern crate wayland_server; +//! # #[macro_use] extern crate smithay; +//! use smithay::wayland::data_device::{init_data_device, default_action_chooser}; +//! +//! # fn main(){ +//! # let mut event_loop = wayland_server::calloop::EventLoop::<()>::new().unwrap(); +//! # let mut display = wayland_server::Display::new(event_loop.handle()); +//! // init the data device: +//! init_data_device( +//! &mut display, // the display +//! |dnd_event| { /* a callback to react to client DnD/selection actions */ }, +//! default_action_chooser, // a closure to choose the DnD action depending on clients +//! // negociation +//! None // insert a logger here +//! ); +//! # } +//! ``` use std::os::unix::io::RawFd; use std::sync::{Arc, Mutex}; @@ -423,3 +444,25 @@ where dd_data, ) } + +/// A simple action chooser for DnD negociation +/// +/// If the preferred action is available, it'll pick it. Otherwise, it'll pick the first +/// available in the following order: Ask, Copy, Move. +pub fn default_action_chooser(available: DndAction, preferred: DndAction) -> DndAction { + // if the preferred action is valid (a single action) and in the available actions, use it + // otherwise, follow a fallback stategy + if [DndAction::Move, DndAction::Copy, DndAction::Ask].contains(&preferred) + && available.contains(preferred) + { + preferred + } else if available.contains(DndAction::Ask) { + DndAction::Ask + } else if available.contains(DndAction::Copy) { + DndAction::Copy + } else if available.contains(DndAction::Move) { + DndAction::Move + } else { + DndAction::empty() + } +}