From e814eebcc00c221e0e82ef5c0ccbe73d4b863c5c Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 28 Oct 2025 14:13:05 -0700 Subject: [PATCH] Add `ext-data-control-v1` protocol This is identical to the wlr protocol, and Smithay has implementations for both. New clients should use the `ext` protocol where present. Not sure how widely used it is yet, but we probably should have both for now. --- src/state.rs | 19 ++++++++++++++----- src/wayland/handlers/data_control/ext.rs | 13 +++++++++++++ src/wayland/handlers/data_control/mod.rs | 4 ++++ .../{data_control.rs => data_control/wlr.rs} | 2 +- 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/wayland/handlers/data_control/ext.rs create mode 100644 src/wayland/handlers/data_control/mod.rs rename src/wayland/handlers/{data_control.rs => data_control/wlr.rs} (87%) diff --git a/src/state.rs b/src/state.rs index eb081db2..2e900845 100644 --- a/src/state.rs +++ b/src/state.rs @@ -88,8 +88,10 @@ use smithay::{ seat::WaylandFocus, security_context::{SecurityContext, SecurityContextState}, selection::{ - data_device::DataDeviceState, primary_selection::PrimarySelectionState, - wlr_data_control::DataControlState, + data_device::DataDeviceState, + ext_data_control::DataControlState as ExtDataControlState, + primary_selection::PrimarySelectionState, + wlr_data_control::DataControlState as WlrDataControlState, }, session_lock::SessionLockManagerState, shell::{ @@ -234,7 +236,8 @@ pub struct Common { pub output_power_state: OutputPowerState, pub presentation_state: PresentationState, pub primary_selection_state: PrimarySelectionState, - pub data_control_state: DataControlState, + pub ext_data_control_state: ExtDataControlState, + pub wlr_data_control_state: WlrDataControlState, pub image_capture_source_state: ImageCaptureSourceState, pub screencopy_state: ScreencopyState, pub seat_state: SeatState, @@ -651,7 +654,12 @@ impl State { let idle_inhibit_manager_state = IdleInhibitManagerState::new::(dh); let idle_inhibiting_surfaces = HashSet::new(); - let data_control_state = DataControlState::new::( + let ext_data_control_state = ExtDataControlState::new::( + dh, + Some(&primary_selection_state), + client_not_sandboxed, + ); + let wlr_data_control_state = WlrDataControlState::new::( dh, Some(&primary_selection_state), client_not_sandboxed, @@ -737,7 +745,8 @@ impl State { overlap_notify_state, presentation_state, primary_selection_state, - data_control_state, + ext_data_control_state, + wlr_data_control_state, viewporter_state, wl_drm_state, kde_decoration_state, diff --git a/src/wayland/handlers/data_control/ext.rs b/src/wayland/handlers/data_control/ext.rs new file mode 100644 index 00000000..e7ab8529 --- /dev/null +++ b/src/wayland/handlers/data_control/ext.rs @@ -0,0 +1,13 @@ +use crate::state::State; +use smithay::{ + delegate_ext_data_control, + wayland::selection::ext_data_control::{DataControlHandler, DataControlState}, +}; + +impl DataControlHandler for State { + fn data_control_state(&mut self) -> &mut DataControlState { + &mut self.common.ext_data_control_state + } +} + +delegate_ext_data_control!(State); diff --git a/src/wayland/handlers/data_control/mod.rs b/src/wayland/handlers/data_control/mod.rs new file mode 100644 index 00000000..e72efaf3 --- /dev/null +++ b/src/wayland/handlers/data_control/mod.rs @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-only + +mod ext; +mod wlr; diff --git a/src/wayland/handlers/data_control.rs b/src/wayland/handlers/data_control/wlr.rs similarity index 87% rename from src/wayland/handlers/data_control.rs rename to src/wayland/handlers/data_control/wlr.rs index c17d9279..d02c722e 100644 --- a/src/wayland/handlers/data_control.rs +++ b/src/wayland/handlers/data_control/wlr.rs @@ -8,7 +8,7 @@ use smithay::{ impl DataControlHandler for State { fn data_control_state(&mut self) -> &mut DataControlState { - &mut self.common.data_control_state + &mut self.common.wlr_data_control_state } }