Skip to content

Commit 0c07b79

Browse files
committed
wip: dnd actions can be completed again
1 parent 0971022 commit 0c07b79

3 files changed

Lines changed: 68 additions & 9 deletions

File tree

cosmic-panel-bin/src/xdg_shell_wrapper/client/handlers/data_device/data_device.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ impl DataDeviceHandler for GlobalState {
134134
} else if c_action.contains(ClientDndAction::Ask) {
135135
dnd_actions.push(DndAction::Ask);
136136
}
137+
dbg!(&dnd_actions);
137138

138139
let metadata = SourceMetadata { mime_types, dnd_actions };
139140
let (x, y) = (offer.x, offer.y);
@@ -147,6 +148,7 @@ impl DataDeviceHandler for GlobalState {
147148
offer.surface.clone(),
148149
&ptr,
149150
);
151+
dbg!(seat.client.next_dnd_offer_is_mine);
150152

151153
// TODO: touch vs pointer start data
152154
if !seat.client.next_dnd_offer_is_mine {
@@ -177,6 +179,7 @@ impl DataDeviceHandler for GlobalState {
177179
use smithay::input::dnd::DnDGrab;
178180
use smithay::input::pointer::Focus;
179181
let source = ServerGrabSource { metadata, dnd_offer: offer };
182+
dbg!("START DND GRAB");
180183
let dnd_grab = DnDGrab::new_pointer(
181184
&self.server_state.display_handle,
182185
pointer_start_data,
@@ -185,6 +188,8 @@ impl DataDeviceHandler for GlobalState {
185188
);
186189
pointer.set_grab(self, dnd_grab, SERIAL_COUNTER.next_serial(), Focus::Keep);
187190
}
191+
} else {
192+
dbg!("Internal DND not starting server drag");
188193
}
189194
}
190195

@@ -194,6 +199,7 @@ impl DataDeviceHandler for GlobalState {
194199
qh: &sctk::reexports::client::QueueHandle<Self>,
195200
data_device: &WlDataDevice,
196201
) {
202+
println!("Leave");
197203
let seat = match self
198204
.server_state
199205
.seats
@@ -245,6 +251,7 @@ impl DataDeviceHandler for GlobalState {
245251
_x: f64,
246252
_y: f64,
247253
) {
254+
// println!("Motion");
248255
// treat it as pointer motion
249256
let seat = match self
250257
.server_state
@@ -296,6 +303,7 @@ impl DataDeviceHandler for GlobalState {
296303
qh: &sctk::reexports::client::QueueHandle<Self>,
297304
data_device: &WlDataDevice,
298305
) {
306+
println!("Drop performed");
299307
// treat it as pointer button release
300308
let seat = match self
301309
.server_state

cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/compositor.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ impl CompositorHandler for GlobalState {
259259
},
260260
};
261261
if let Some(c_icon) = seat.client.dnd_icon.as_mut() {
262+
dbg!("Committing DND icon");
262263
let size = bbox_from_surface_tree(surface, (0, 0)).size;
263264

264265
if let Some(renderer) = self.space.renderer() {

cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/mod.rs

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::os::fd::OwnedFd;
33
use std::sync::Mutex;
44

55
use itertools::Itertools;
6-
use sctk::data_device_manager::data_offer::receive_to_fd;
6+
use sctk::data_device_manager::{data_device::DataDeviceData, data_offer::receive_to_fd};
77
use sctk::delegate_subcompositor;
88
use sctk::reexports::client::protocol::wl_data_device_manager::DndAction as ClientDndAction;
99
use sctk::shm::multi::MultiPool;
@@ -192,6 +192,48 @@ impl DataDeviceHandler for GlobalState {
192192
) -> &mut smithay::wayland::selection::data_device::DataDeviceState {
193193
&mut self.server_state.data_device_state
194194
}
195+
196+
fn action_choice(
197+
&mut self,
198+
available: smithay::reexports::wayland_server::protocol::wl_data_device_manager::DndAction,
199+
preferred: smithay::reexports::wayland_server::protocol::wl_data_device_manager::DndAction,
200+
) -> smithay::reexports::wayland_server::protocol::wl_data_device_manager::DndAction {
201+
use smithay::reexports::wayland_server::protocol::wl_data_device_manager::DndAction as WlDndAction;
202+
let dnd_seat =
203+
match self.server_state.seats.iter_mut().find(|s| s.client.dnd_source.is_some()) {
204+
Some(s) => s,
205+
None => return preferred,
206+
};
207+
208+
let offer = match dnd_seat.client.data_device.data().drag_offer() {
209+
Some(offer) => offer,
210+
None => return preferred,
211+
};
212+
213+
let mut client_actions = ClientDndAction::empty();
214+
if available.contains(WlDndAction::Copy) {
215+
client_actions |= ClientDndAction::Copy;
216+
}
217+
if available.contains(WlDndAction::Move) {
218+
client_actions |= ClientDndAction::Move;
219+
}
220+
if available.contains(WlDndAction::Ask) {
221+
client_actions |= ClientDndAction::Ask;
222+
}
223+
let mut client_preferred = ClientDndAction::empty();
224+
if preferred.contains(WlDndAction::Copy) {
225+
client_preferred |= ClientDndAction::Copy;
226+
}
227+
if preferred.contains(WlDndAction::Move) {
228+
client_preferred |= ClientDndAction::Move;
229+
}
230+
if preferred.contains(WlDndAction::Ask) {
231+
client_preferred |= ClientDndAction::Ask;
232+
}
233+
offer.set_actions(client_actions, client_preferred);
234+
dbg!("set actions", client_actions, client_preferred);
235+
preferred
236+
}
195237
}
196238

197239
impl DndGrabHandler for GlobalState {
@@ -231,13 +273,15 @@ impl WaylandDndGrabHandler for GlobalState {
231273
) {
232274
// TODO icon
233275

234-
println!("dnd_requested");
276+
println!("FOO dnd_requested");
235277

236278
let seat = match self.server_state.seats.iter_mut().find(|s| s.server.seat == seat) {
237279
Some(s) => s,
238280
None => return,
239281
};
240282

283+
dbg!("FOO DND REQUESTED 2");
284+
241285
if let Some(metadata) = source.metadata() {
242286
seat.client.next_dnd_offer_is_mine = true;
243287
let mut actions = ClientDndAction::empty();
@@ -250,6 +294,7 @@ impl WaylandDndGrabHandler for GlobalState {
250294
if metadata.dnd_actions.contains(&DndAction::Ask) {
251295
actions |= ClientDndAction::Ask;
252296
}
297+
dbg!(&metadata.mime_types);
253298

254299
let dnd_source = self.client_state.data_device_manager.create_drag_and_drop_source(
255300
&self.client_state.queue_handle,
@@ -264,13 +309,16 @@ impl WaylandDndGrabHandler for GlobalState {
264309
.compositor_state
265310
.create_surface(&self.client_state.queue_handle)
266311
});
312+
313+
dbg!("FOO DND CLIENT START");
267314
dnd_source.start_drag(
268315
&seat.client.data_device,
269316
&focus.0,
270317
c_icon_surface.as_ref(),
271318
seat.client.get_serial_of_last_seat_event(),
272319
);
273320
if let Some(client_surface) = c_icon_surface.as_ref() {
321+
dbg!("FOO DND ICON SURFACE CREATED");
274322
client_surface.frame(&self.client_state.queue_handle, client_surface.clone());
275323
client_surface.commit();
276324

@@ -286,12 +334,14 @@ impl WaylandDndGrabHandler for GlobalState {
286334
seat.client.dnd_source = Some(dnd_source);
287335
}
288336

337+
dbg!("FOO DND REQUESTED 3");
289338
//seat.server.dnd_source = source;
290339
seat.server.dnd_icon = icon;
291340

292341
let seat = seat.server.seat.clone();
293342
match type_ {
294343
GrabType::Pointer => {
344+
dbg!("Starting server pointer grab for DND");
295345
let pointer = seat.get_pointer().unwrap();
296346
let start_data = pointer.grab_start_data().unwrap();
297347
pointer.set_grab(
@@ -384,19 +434,20 @@ pub(crate) struct ServerGrabSource {
384434

385435
impl smithay::utils::IsAlive for ServerGrabSource {
386436
fn alive(&self) -> bool {
387-
println!("FOO");
437+
println!("FOO ALIVE");
388438
//todo!()
389439
true
390440
}
391441
}
392442

393443
impl smithay::input::dnd::Source for ServerGrabSource {
394444
fn metadata(&self) -> Option<SourceMetadata> {
445+
println!("FOO METADATA");
395446
Some(self.metadata.clone())
396447
}
397448

398449
fn choose_action(&self, action: smithay::input::dnd::DndAction) {
399-
println!("CHOOSE_ACTION?");
450+
println!("FOO CHOOSE_ACTION?");
400451
// XXX actions?
401452
//
402453
let mut c_action = ClientDndAction::empty();
@@ -414,22 +465,21 @@ impl smithay::input::dnd::Source for ServerGrabSource {
414465
}
415466

416467
fn send(&self, mime_type: &str, fd: OwnedFd) {
417-
println!("FOO");
468+
println!("FOO SEND");
418469
receive_to_fd(self.dnd_offer.inner(), mime_type.to_owned(), fd)
419470
}
420471

421472
fn drop_performed(&self) {
422-
println!("FOO");
423-
println!("DROP_PERFORMED?");
473+
println!("FOO DROP_PERFORMED");
424474
}
425475

426476
fn cancel(&self) {
427-
println!("FOO");
477+
println!("FOO CANCEL");
428478
self.dnd_offer.destroy();
429479
}
430480

431481
fn finished(&self) {
432-
println!("FOO");
482+
println!("FOO FINISHED");
433483
self.dnd_offer.finish();
434484
}
435485
}

0 commit comments

Comments
 (0)