From 6d8f942cc79885d2c8d8cf3887473a610cd95595 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Thu, 26 Oct 2023 14:17:10 -0700 Subject: [PATCH] Update sctk --- core/Cargo.toml | 2 +- examples/sctk_drag/Cargo.toml | 2 +- examples/sctk_todos/Cargo.toml | 2 +- runtime/Cargo.toml | 2 +- sctk/Cargo.toml | 2 +- sctk/src/event_loop/mod.rs | 22 +-- sctk/src/handlers/data_device/data_source.rs | 174 +++++++++++-------- widget/Cargo.toml | 2 +- 8 files changed, 114 insertions(+), 94 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index cf183fb19b..5a872a29cc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -16,7 +16,7 @@ bitflags = "1.2" thiserror = "1" log = "0.4.17" twox-hash = { version = "1.5", default-features = false } -sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "dc8c4a0", optional = true } +sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "2e9bf9f", optional = true } [dependencies.palette] version = "0.7" diff --git a/examples/sctk_drag/Cargo.toml b/examples/sctk_drag/Cargo.toml index 49422ca62b..79b984f16d 100644 --- a/examples/sctk_drag/Cargo.toml +++ b/examples/sctk_drag/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "dc8c4a0" } +sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "2e9bf9f" } iced = { path = "../..", default-features = false, features = ["wayland", "debug", "a11y"] } iced_style = { path = "../../style" } env_logger = "0.10" diff --git a/examples/sctk_todos/Cargo.toml b/examples/sctk_todos/Cargo.toml index b779f6026e..ec6fa0437a 100644 --- a/examples/sctk_todos/Cargo.toml +++ b/examples/sctk_todos/Cargo.toml @@ -10,7 +10,7 @@ iced = { path = "../..", default-features=false, features = ["async-std", "wayla serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" once_cell = "1.15" -sctk = { package = "smithay-client-toolkit", git = "https://github.com/Smithay/client-toolkit", rev = "dc8c4a0" } +sctk = { package = "smithay-client-toolkit", git = "https://github.com/Smithay/client-toolkit", rev = "2e9bf9f" } iced_style = { path = "../../style" } log = "0.4.17" diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 861dd8f557..e92305a5ea 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -14,7 +14,7 @@ wayland = ["iced_accessibility?/accesskit_unix", "iced_core/wayland", "sctk"] [dependencies] thiserror = "1" -sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "dc8c4a0", optional = true } +sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "2e9bf9f", optional = true } [dependencies.iced_core] version = "0.10" diff --git a/sctk/Cargo.toml b/sctk/Cargo.toml index e462dc7a36..4325a2382c 100644 --- a/sctk/Cargo.toml +++ b/sctk/Cargo.toml @@ -15,7 +15,7 @@ a11y = ["iced_accessibility", "iced_runtime/a11y"] [dependencies] tracing = "0.1" thiserror = "1.0" -sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "dc8c4a0" } +sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "2e9bf9f" } wayland-protocols = { version = "0.31.0", features = [ "staging"]} # sctk = { package = "smithay-client-toolkit", path = "../../fork/client-toolkit/" } raw-window-handle = "0.5" diff --git a/sctk/src/event_loop/mod.rs b/sctk/src/event_loop/mod.rs index 46d1b83228..a8422d694b 100644 --- a/sctk/src/event_loop/mod.rs +++ b/sctk/src/event_loop/mod.rs @@ -34,7 +34,7 @@ use sctk::{ data_device_manager::DataDeviceManagerState, output::OutputState, reexports::{ - calloop::{self, EventLoop}, + calloop::{self, EventLoop, PostAction}, client::{ globals::registry_queue_init, protocol::wl_surface::WlSurface, ConnectError, Connection, DispatchError, Proxy, @@ -1157,11 +1157,11 @@ where match self.event_loop.handle().insert_source(read_pipe, move |_, f, state| { let mut dnd_offer = match state.dnd_offer.take() { Some(s) => s, - None => return, + None => return PostAction::Continue, }; let (mime_type, data, token) = match dnd_offer.cur_read.take() { Some(s) => s, - None => return, + None => return PostAction::Continue, }; let mut reader = BufReader::new(f.as_ref()); let consumed = match reader.fill_buf() { @@ -1185,18 +1185,18 @@ where Err(e) if matches!(e.kind(), std::io::ErrorKind::Interrupted) => { dnd_offer.cur_read = Some((mime_type, data, token)); state.dnd_offer = Some(dnd_offer); - return; + return PostAction::Continue; }, Err(e) => { error!("Error reading selection data: {}", e); - loop_handle.remove(token); if !dnd_offer.dropped { state.dnd_offer = Some(dnd_offer); } - return; + return PostAction::Remove; }, }; reader.consume(consumed); + PostAction::Continue }) { Ok(token) => { dnd_offer.cur_read = Some((mime_type.clone(), Vec::new(), token)); @@ -1215,11 +1215,11 @@ where match self.event_loop.handle().insert_source(read_pipe, move |_, f, state| { let selection_offer = match state.selection_offer.as_mut() { Some(s) => s, - None => return, + None => return PostAction::Continue, }; let (mime_type, data, token) = match selection_offer.cur_read.take() { Some(s) => s, - None => return, + None => return PostAction::Continue, }; let mut reader = BufReader::new(f.as_ref()); let consumed = match reader.fill_buf() { @@ -1236,15 +1236,15 @@ where }, Err(e) if matches!(e.kind(), std::io::ErrorKind::Interrupted) => { selection_offer.cur_read = Some((mime_type, data, token)); - return; + return PostAction::Continue; }, Err(e) => { error!("Error reading selection data: {}", e); - loop_handle.remove(token); - return; + return PostAction::Continue; }, }; reader.consume(consumed); + PostAction::Continue }) { Ok(token) => { selection_offer.cur_read = Some((mime_type.clone(), Vec::new(), token)); diff --git a/sctk/src/handlers/data_device/data_source.rs b/sctk/src/handlers/data_device/data_source.rs index 4de6343359..2ad4550218 100644 --- a/sctk/src/handlers/data_device/data_source.rs +++ b/sctk/src/handlers/data_device/data_source.rs @@ -3,11 +3,14 @@ use crate::sctk_event::{DataSourceEvent, SctkEvent}; use sctk::data_device_manager::WritePipe; use sctk::{ data_device_manager::data_source::DataSourceHandler, - reexports::client::{ - protocol::{ - wl_data_device_manager::DndAction, wl_data_source::WlDataSource, + reexports::{ + calloop::PostAction, + client::{ + protocol::{ + wl_data_device_manager::DndAction, wl_data_source::WlDataSource, + }, + Connection, QueueHandle, }, - Connection, QueueHandle, }, }; use std::io::{BufWriter, Write}; @@ -62,50 +65,62 @@ impl DataSourceHandler for SctkState { .as_mut() .filter(|s| s.source.inner() == source) { - match self.loop_handle.insert_source(pipe, move |_, f, state| { - let loop_handle = &state.loop_handle; - let selection_source = match state.selection_source.as_mut() { - Some(s) => s, - None => return, - }; - let (data, mut cur_index, token) = - match selection_source.cur_write.take() { + match self.loop_handle.insert_source( + pipe, + move |_, f, state| -> PostAction { + let selection_source = match state.selection_source.as_mut() + { Some(s) => s, - None => return, + None => { + return PostAction::Continue; + } }; - let mut writer = BufWriter::new(f.as_ref()); - let slice = &data.as_slice()[cur_index - ..(cur_index + writer.capacity()).min(data.len())]; - match writer.write(slice) { - Ok(num_written) => { - cur_index += num_written; - if cur_index == data.len() { - loop_handle.remove(token); - } else { + let (data, mut cur_index, token) = + match selection_source.cur_write.take() { + Some(s) => s, + None => { + return PostAction::Continue; + } + }; + let mut writer = BufWriter::new(f.as_ref()); + let slice = &data.as_slice()[cur_index + ..(cur_index + writer.capacity()).min(data.len())]; + match writer.write(slice) { + Ok(num_written) => { + cur_index += num_written; + let done = cur_index == data.len(); + if !done { + selection_source.cur_write = + Some((data, cur_index, token)); + } + if let Err(err) = writer.flush() { + error!("Failed to flush pipe: {}", err); + return PostAction::Remove; + } + if done { + PostAction::Remove + } else { + PostAction::Continue + } + } + Err(e) + if matches!( + e.kind(), + std::io::ErrorKind::Interrupted + ) => + { + // try again selection_source.cur_write = Some((data, cur_index, token)); + PostAction::Continue } - if let Err(err) = writer.flush() { - loop_handle.remove(token); - error!("Failed to flush pipe: {}", err); + Err(_) => { + error!("Failed to write to pipe"); + PostAction::Remove } } - Err(e) - if matches!( - e.kind(), - std::io::ErrorKind::Interrupted - ) => - { - // try again - selection_source.cur_write = - Some((data, cur_index, token)); - } - Err(_) => { - loop_handle.remove(token); - error!("Failed to write to pipe"); - } - }; - }) { + }, + ) { Ok(s) => { my_source.cur_write = Some(( my_source @@ -130,49 +145,54 @@ impl DataSourceHandler for SctkState { Some((source, data)) => (source, data), None => return, }; - match self.loop_handle.insert_source(pipe, move |_, f, state| { - let loop_handle = &state.loop_handle; - let dnd_source = match state.dnd_source.as_mut() { - Some(s) => s, - None => return, - }; - let (data, mut cur_index, token) = - match dnd_source.cur_write.take() { + match self.loop_handle.insert_source( + pipe, + move |_, f, state| -> PostAction { + let loop_handle = &state.loop_handle; + let dnd_source = match state.dnd_source.as_mut() { Some(s) => s, - None => return, + None => return PostAction::Continue, }; - let mut writer = BufWriter::new(f.as_ref()); - let slice = &data.as_slice()[cur_index - ..(cur_index + writer.capacity()).min(data.len())]; - match writer.write(slice) { - Ok(num_written) => { - cur_index += num_written; - if cur_index == data.len() { - loop_handle.remove(token); - } else { + let (data, mut cur_index, token) = + match dnd_source.cur_write.take() { + Some(s) => s, + None => return PostAction::Continue, + }; + let mut writer = BufWriter::new(f.as_ref()); + let slice = &data.as_slice()[cur_index + ..(cur_index + writer.capacity()).min(data.len())]; + match writer.write(slice) { + Ok(num_written) => { + cur_index += num_written; + if cur_index == data.len() { + loop_handle.remove(token); + } else { + dnd_source.cur_write = + Some((data, cur_index, token)); + } + if let Err(err) = writer.flush() { + loop_handle.remove(token); + error!("Failed to flush pipe: {}", err); + } + } + Err(e) + if matches!( + e.kind(), + std::io::ErrorKind::Interrupted + ) => + { + // try again dnd_source.cur_write = Some((data, cur_index, token)); } - if let Err(err) = writer.flush() { + Err(_) => { loop_handle.remove(token); - error!("Failed to flush pipe: {}", err); + error!("Failed to write to pipe"); } - } - Err(e) - if matches!( - e.kind(), - std::io::ErrorKind::Interrupted - ) => - { - // try again - dnd_source.cur_write = Some((data, cur_index, token)); - } - Err(_) => { - loop_handle.remove(token); - error!("Failed to write to pipe"); - } - }; - }) { + }; + PostAction::Continue + }, + ) { Ok(s) => { source.cur_write = Some(( data.from_mime_type(&mime).unwrap_or_default(), diff --git a/widget/Cargo.toml b/widget/Cargo.toml index 1170b18758..11f50a1bd5 100644 --- a/widget/Cargo.toml +++ b/widget/Cargo.toml @@ -22,7 +22,7 @@ wayland = ["sctk"] [dependencies] unicode-segmentation = "1.6" num-traits = "0.2" -sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "dc8c4a0", optional = true } +sctk = { package = "smithay-client-toolkit", git = "https://github.com/smithay/client-toolkit", rev = "2e9bf9f", optional = true } thiserror = "1" [dependencies.iced_runtime]