WIP drag-and-drop

This commit is contained in:
Ian Douglas Scott 2023-07-10 13:55:32 -07:00
parent 33a1578eb0
commit f8a3c4ba55
2 changed files with 133 additions and 49 deletions

65
Cargo.lock generated
View file

@ -586,7 +586,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config" name = "cosmic-config"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"atomicwrites", "atomicwrites",
"cosmic-config-derive", "cosmic-config-derive",
@ -600,7 +600,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config-derive" name = "cosmic-config-derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"quote", "quote",
"syn 1.0.109", "syn 1.0.109",
@ -641,7 +641,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-theme" name = "cosmic-theme"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cosmic-config", "cosmic-config",
@ -1506,7 +1506,7 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]] [[package]]
name = "iced" name = "iced"
version = "0.9.0" version = "0.9.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"iced_accessibility", "iced_accessibility",
"iced_core", "iced_core",
@ -1521,7 +1521,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_accessibility" name = "iced_accessibility"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"accesskit", "accesskit",
"accesskit_unix", "accesskit_unix",
@ -1530,7 +1530,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_core" name = "iced_core"
version = "0.9.0" version = "0.9.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"iced_accessibility", "iced_accessibility",
@ -1545,7 +1545,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_futures" name = "iced_futures"
version = "0.6.0" version = "0.6.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"futures", "futures",
"iced_core", "iced_core",
@ -1558,7 +1558,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_graphics" name = "iced_graphics"
version = "0.8.0" version = "0.8.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"bytemuck", "bytemuck",
@ -1575,7 +1575,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_renderer" name = "iced_renderer"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_tiny_skia", "iced_tiny_skia",
@ -1587,7 +1587,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_runtime" name = "iced_runtime"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"iced_accessibility", "iced_accessibility",
"iced_core", "iced_core",
@ -1599,7 +1599,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_sctk" name = "iced_sctk"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"enum-repr", "enum-repr",
"float-cmp", "float-cmp",
@ -1621,7 +1621,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_style" name = "iced_style"
version = "0.8.0" version = "0.8.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"iced_core", "iced_core",
"once_cell", "once_cell",
@ -1631,7 +1631,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_tiny_skia" name = "iced_tiny_skia"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"cosmic-text", "cosmic-text",
@ -1649,7 +1649,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_wgpu" name = "iced_wgpu"
version = "0.10.0" version = "0.10.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"bytemuck", "bytemuck",
@ -1670,7 +1670,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_widget" name = "iced_widget"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"iced_renderer", "iced_renderer",
"iced_runtime", "iced_runtime",
@ -1881,7 +1881,7 @@ checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
[[package]] [[package]]
name = "libcosmic" name = "libcosmic"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#598bfaa6111c38633cbcd9d875ef8384108fb40d" source = "git+https://github.com/pop-os/libcosmic#56d24b2372ed699115fee777b4811c60419e2f66"
dependencies = [ dependencies = [
"apply", "apply",
"cosmic-config", "cosmic-config",
@ -2395,17 +2395,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
dependencies = [ dependencies = [
"instant", "instant",
"lock_api", "lock_api",
"parking_lot_core 0.8.6", "parking_lot_core",
]
[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core 0.9.8",
] ]
[[package]] [[package]]
@ -2422,19 +2412,6 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "parking_lot_core"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.3.5",
"smallvec",
"windows-targets 0.48.1",
]
[[package]] [[package]]
name = "phf" name = "phf"
version = "0.11.2" version = "0.11.2"
@ -3647,7 +3624,7 @@ checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f"
dependencies = [ dependencies = [
"futures", "futures",
"js-sys", "js-sys",
"parking_lot 0.11.2", "parking_lot",
"pin-utils", "pin-utils",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
@ -3856,7 +3833,7 @@ dependencies = [
"js-sys", "js-sys",
"log", "log",
"naga", "naga",
"parking_lot 0.12.1", "parking_lot",
"profiling", "profiling",
"raw-window-handle", "raw-window-handle",
"smallvec", "smallvec",
@ -3881,7 +3858,7 @@ dependencies = [
"codespan-reporting", "codespan-reporting",
"log", "log",
"naga", "naga",
"parking_lot 0.12.1", "parking_lot",
"profiling", "profiling",
"raw-window-handle", "raw-window-handle",
"rustc-hash", "rustc-hash",
@ -3920,7 +3897,7 @@ dependencies = [
"metal", "metal",
"naga", "naga",
"objc", "objc",
"parking_lot 0.12.1", "parking_lot",
"profiling", "profiling",
"range-alloc", "range-alloc",
"raw-window-handle", "raw-window-handle",

View file

@ -9,7 +9,7 @@ use cctk::{
sctk::shell::wlr_layer::{Anchor, KeyboardInteractivity, Layer}, sctk::shell::wlr_layer::{Anchor, KeyboardInteractivity, Layer},
toplevel_info::ToplevelInfo, toplevel_info::ToplevelInfo,
wayland_client::{ wayland_client::{
protocol::{wl_output, wl_seat}, protocol::{wl_data_device_manager::DndAction, wl_output, wl_seat},
Connection, WEnum, Connection, WEnum,
}, },
}; };
@ -18,6 +18,10 @@ use cosmic::{
self, self,
event::wayland::{Event as WaylandEvent, OutputEvent}, event::wayland::{Event as WaylandEvent, OutputEvent},
keyboard::KeyCode, keyboard::KeyCode,
wayland::{
actions::data_device::{DataFromMimeType, DndIcon},
data_device::start_drag,
},
widget, Application, Command, Subscription, widget, Application, Command, Subscription,
}, },
iced_runtime::{ iced_runtime::{
@ -36,6 +40,20 @@ use std::{collections::HashMap, mem};
mod toggle_dbus; mod toggle_dbus;
mod wayland; mod wayland;
static WORKSPACE_MIME: &str = "text/x.cosmic-workspace-id";
struct WorkspaceDndId(String);
impl DataFromMimeType for WorkspaceDndId {
fn from_mime_type(&self, mime_type: &str) -> Option<Vec<u8>> {
if mime_type == WORKSPACE_MIME {
Some(self.0.as_bytes().to_vec())
} else {
None
}
}
}
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
enum Msg { enum Msg {
WaylandEvent(WaylandEvent), WaylandEvent(WaylandEvent),
@ -47,6 +65,8 @@ enum Msg {
ActivateToplevel(zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1), ActivateToplevel(zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1),
CloseToplevel(zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1), CloseToplevel(zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1),
DBus(toggle_dbus::Event), DBus(toggle_dbus::Event),
StartDrag(DragSurface),
SourceFinished,
} }
#[derive(Debug)] #[derive(Debug)]
@ -83,6 +103,11 @@ struct LayerSurface {
// them all the time every frame. // them all the time every frame.
} }
#[derive(Clone, Debug)]
enum DragSurface {
Workspace { name: String, output_name: String },
}
#[derive(Default)] #[derive(Default)]
struct App { struct App {
max_surface_id: u128, max_surface_id: u128,
@ -96,6 +121,7 @@ struct App {
seats: Vec<wl_seat::WlSeat>, seats: Vec<wl_seat::WlSeat>,
visible: bool, visible: bool,
wayland_cmd_sender: Option<calloop::channel::Sender<wayland::Cmd>>, wayland_cmd_sender: Option<calloop::channel::Sender<wayland::Cmd>>,
drag_surface: Option<(SurfaceId, DragSurface)>,
} }
impl App { impl App {
@ -391,6 +417,34 @@ impl Application for App {
Msg::DBus(toggle_dbus::Event::Toggle) => { Msg::DBus(toggle_dbus::Event::Toggle) => {
return self.toggle(); return self.toggle();
} }
Msg::StartDrag(drag_surface) => {
match &drag_surface {
DragSurface::Workspace {
output_name,
name: _,
} => {
let id = self.next_surface_id();
if let Some((parent_id, _)) = self
.layer_surfaces
.iter()
.find(|(_, x)| &x.output_name == output_name)
{
println!("\n\n\nSTART DRAG");
self.drag_surface = Some((id, drag_surface));
return start_drag(
vec![WORKSPACE_MIME.to_string()],
DndAction::Move,
*parent_id,
Some(DndIcon::Custom(id)), // TODO store
Box::new(WorkspaceDndId(String::new())),
);
}
}
}
}
Msg::SourceFinished => {
println!("finish");
}
} }
Command::none() Command::none()
@ -423,7 +477,23 @@ impl Application for App {
if let Some(surface) = self.layer_surfaces.get(&id) { if let Some(surface) = self.layer_surfaces.get(&id) {
return layer_surface(self, surface); return layer_surface(self, surface);
} }
if let Some((drag_id, drag_surface)) = &self.drag_surface {
if drag_id == &id {
println!("DRAG VIEW");
match drag_surface {
DragSurface::Workspace { output_name, name } => {
if let Some(workspace) = self.workspaces.iter().find(|x| &x.name == name) {
return workspace_item2(workspace, &output_name);
}
}
}
}
}
println!("NO VIEW");
text("workspaces").into() text("workspaces").into()
//
// workspace_sidebar_entry(&self.workspaces[0], "eDP-1").into()
//text("FOO BAR BAZ FOO BAR BAZ").into()
} }
fn close_requested(&self, id: SurfaceId) -> Msg { fn close_requested(&self, id: SurfaceId) -> Msg {
@ -465,10 +535,7 @@ fn close_button(on_press: Msg) -> cosmic::Element<'static, Msg> {
.into() .into()
} }
fn workspace_sidebar_entry<'a>( fn workspace_item<'a>(workspace: &'a Workspace, output_name: &'a str) -> cosmic::Element<'a, Msg> {
workspace: &'a Workspace,
output_name: &'a str,
) -> cosmic::Element<'a, Msg> {
// TODO style // TODO style
let theme = if workspace.is_active { let theme = if workspace.is_active {
cosmic::theme::Button::Primary cosmic::theme::Button::Primary
@ -498,6 +565,46 @@ fn workspace_sidebar_entry<'a>(
.into() .into()
} }
fn workspace_item2<'a>(workspace: &'a Workspace, output_name: &'a str) -> cosmic::Element<'a, Msg> {
println!("{:?}", workspace);
println!("{:?}", output_name);
/*
widget::column![
widget::Image::new(
workspace
.img_for_output
.get(output_name)
.cloned()
.unwrap_or_else(|| widget::image::Handle::from_pixels(
1,
1,
vec![0, 0, 0, 255]
))
),
widget::text(&workspace.name)
]
.into()
*/
//widget::text(&workspace.name).into()
widget::Image::new(workspace.img_for_output.get(output_name).cloned().unwrap()).into()
//widget::text(&format!("WORKSPACE: {}", workspace.name)).into()
//widget::text("ABC").into()
}
fn workspace_sidebar_entry<'a>(
workspace: &'a Workspace,
output_name: &'a str,
) -> cosmic::Element<'a, Msg> {
widget::dnd_source(workspace_item(workspace, output_name))
.on_drag(Msg::StartDrag(DragSurface::Workspace {
name: workspace.name.to_string(),
output_name: output_name.to_string(),
}))
.on_finished(Msg::SourceFinished)
.on_cancelled(Msg::SourceFinished)
.into()
}
fn workspaces_sidebar<'a>( fn workspaces_sidebar<'a>(
workspaces: impl Iterator<Item = &'a Workspace>, workspaces: impl Iterator<Item = &'a Workspace>,
output_name: &'a str, output_name: &'a str,