diff --git a/Cargo.lock b/Cargo.lock index b309db1d..b5d874b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -787,13 +787,6 @@ dependencies = [ "cfg_aliases", ] -[[package]] -name = "build_helpers" -version = "0.14.0" -dependencies = [ - "cfg_aliases", -] - [[package]] name = "built" version = "0.8.0" @@ -1083,7 +1076,6 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "objc", "objc-foundation", @@ -1093,22 +1085,12 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "dnd", "mime 0.1.0", "smithay-clipboard", ] -[[package]] -name = "clipboard_x11" -version = "0.4.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" -dependencies = [ - "thiserror 1.0.69", - "x11rb", -] - [[package]] name = "clock" version = "0.1.0" @@ -1301,7 +1283,6 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ "bitflags 2.11.0", "cosmic-protocols", @@ -1314,7 +1295,6 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ "bitflags 2.11.0", "wayland-backend", @@ -1328,8 +1308,6 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ "bitflags 2.11.0", "fontdb", @@ -1347,6 +1325,7 @@ dependencies = [ "unicode-linebreak", "unicode-script", "unicode-segmentation", + "unicode-width", ] [[package]] @@ -1453,7 +1432,6 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" -source = "git+https://github.com/iced-rs/cryoglyph.git?rev=e429a025df36ab8145708acb309080ae3deec17a#e429a025df36ab8145708acb309080ae3deec17a" dependencies = [ "cosmic-text", "etagere", @@ -1630,7 +1608,6 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "bitflags 2.11.0", "mime 0.1.0", @@ -1665,30 +1642,6 @@ dependencies = [ [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" - -[[package]] -name = "drm" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" -dependencies = [ - "bitflags 2.11.0", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "rustix 0.38.44", -] - -[[package]] -name = "drm-ffi" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6" -dependencies = [ - "drm-sys", - "rustix 0.38.44", -] [[package]] name = "drm-fourcc" @@ -1696,16 +1649,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" -[[package]] -name = "drm-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d09ff881f92f118b11105ba5e34ff8f4adf27b30dae8f12e28c193af1c83176" -dependencies = [ - "libc", - "linux-raw-sys 0.6.5", -] - [[package]] name = "editor" version = "0.1.0" @@ -2428,7 +2371,7 @@ dependencies = [ "log", "presser", "thiserror 2.0.18", - "windows 0.57.0", + "windows 0.62.2", ] [[package]] @@ -2964,7 +2907,6 @@ dependencies = [ name = "iced" version = "0.14.0" dependencies = [ - "build_helpers", "criterion", "dnd", "iced_accessibility", @@ -3016,7 +2958,6 @@ version = "0.14.0" dependencies = [ "approx", "bitflags 2.11.0", - "build_helpers", "bytes", "cosmic-client-toolkit", "dnd", @@ -3123,7 +3064,6 @@ dependencies = [ name = "iced_runtime" version = "0.14.0" dependencies = [ - "build_helpers", "bytes", "cosmic-client-toolkit", "dnd", @@ -3191,7 +3131,6 @@ version = "0.14.0" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.0", - "build_helpers", "bytemuck", "cosmic-client-toolkit", "cryoglyph", @@ -3206,7 +3145,6 @@ dependencies = [ "resvg", "rustc-hash 2.1.2", "rustix 0.38.44", - "smithay-client-toolkit 0.20.0", "thiserror 2.0.18", "tiny-xlib", "wayland-backend", @@ -3221,7 +3159,6 @@ dependencies = [ name = "iced_widget" version = "0.14.2" dependencies = [ - "build_helpers", "cosmic-client-toolkit", "dnd", "iced_accessibility", @@ -3243,7 +3180,6 @@ dependencies = [ name = "iced_winit" version = "0.14.0" dependencies = [ - "build_helpers", "cosmic-client-toolkit", "cursor-icon", "dnd", @@ -3800,14 +3736,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "bitflags 2.11.0", "libc", "plain", - "redox_syscall 0.7.4", + "redox_syscall 0.9.0", ] [[package]] @@ -3837,12 +3773,6 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" -[[package]] -name = "linux-raw-sys" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -4068,7 +3998,6 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "smithay-clipboard", ] @@ -5494,6 +5423,16 @@ dependencies = [ "font-types", ] +[[package]] +name = "redox_event" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5018d583d6d2f5499352aea8d177e9067d1eb03ab17c78169d5ba7a30001b15" +dependencies = [ + "bitflags 2.11.0", + "libredox", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -5505,9 +5444,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.4" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" dependencies = [ "bitflags 2.11.0", ] @@ -6289,7 +6228,6 @@ dependencies = [ [[package]] name = "smithay-clipboard" version = "0.8.0" -source = "git+https://github.com/pop-os/smithay-clipboard?tag=sctk-0.20#859b02c88f45c554049a67c6ddeec1692ce0e20b" dependencies = [ "libc", "raw-window-handle", @@ -6347,14 +6285,12 @@ dependencies = [ [[package]] name = "softbuffer" version = "0.4.1" -source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#a3f77e251e7422803f693df6e3fc313c010c4dcb" dependencies = [ "as-raw-xcb-connection", "bytemuck", "cfg_aliases", "cocoa", "core-graphics", - "drm", "fastrand", "foreign-types 0.5.0", "js-sys", @@ -8022,12 +7958,10 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", - "clipboard_x11", "dnd", "mime 0.1.0", "raw-window-handle", @@ -8531,7 +8465,6 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "cfg_aliases", @@ -8557,7 +8490,6 @@ dependencies = [ [[package]] name = "winit-android" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "android-activity", "bitflags 2.11.0", @@ -8572,7 +8504,6 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "block2 0.6.2", @@ -8594,7 +8525,6 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "memmap2 0.9.10", "objc2 0.6.4", @@ -8609,7 +8539,6 @@ dependencies = [ [[package]] name = "winit-core" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "cursor-icon", @@ -8623,14 +8552,13 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "dpi", "libredox", "orbclient", "raw-window-handle", - "redox_syscall 0.7.4", + "redox_event", "smol_str", "tracing", "winit-core", @@ -8639,7 +8567,6 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "block2 0.6.2", @@ -8659,7 +8586,6 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "ahash", "bitflags 2.11.0", @@ -8685,7 +8611,6 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "atomic-waker", "bitflags 2.11.0", @@ -8707,7 +8632,6 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "cursor-icon", @@ -8723,7 +8647,6 @@ dependencies = [ [[package]] name = "winit-x11" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "bitflags 2.11.0", "bytemuck", @@ -9268,3 +9191,7 @@ dependencies = [ "syn", "winnow 0.7.15", ] + +[[patch.unused]] +name = "cosmic-freedesktop-icons" +version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index a1498ba6..c49fcf92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -118,17 +118,13 @@ winit = [ "iced_accessibility?/accesskit_winit", "iced_program/winit", ] -wayland = [ - "iced_renderer/wayland", - "iced_winit/wayland", - "iced_runtime/wayland", - "iced_widget/wayland", - "iced_core/wayland", -] - +wayland = ["iced_renderer/wayland", "iced_winit/wayland"] +cctk = ["iced_winit/cctk", "iced_widget/cctk", "iced_core/cctk", "wayland"] +# Enables the sctk shell. [dependencies] + + iced_devtools.workspace = true -iced_devtools.optional = true iced_debug.workspace = true iced_program.workspace = true @@ -138,9 +134,10 @@ iced_renderer.workspace = true iced_runtime.workspace = true iced_widget.workspace = true iced_winit.workspace = true -iced_winit.optional = true +iced_devtools.optional = true iced_tester.workspace = true iced_tester.optional = true +iced_winit.optional = true iced_highlighter.workspace = true iced_highlighter.optional = true iced_accessibility.workspace = true @@ -193,7 +190,6 @@ members = [ "winit", "examples/*", "accessibility", - "build_helpers", ] exclude = ["examples/integration"] @@ -367,6 +363,3 @@ useless_conversion = "deny" [workspace.lints.rustdoc] broken_intra_doc_links = "forbid" - -[build-dependencies] -build_helpers = { path = "./build_helpers" } diff --git a/build.rs b/build.rs deleted file mode 100644 index db00a773..00000000 --- a/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - build_helpers::cfg_aliases_setup(); -} diff --git a/build_helpers/Cargo.toml b/build_helpers/Cargo.toml deleted file mode 100644 index ff319f69..00000000 --- a/build_helpers/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "build_helpers" -version.workspace = true -authors.workspace = true -edition.workspace = true -license.workspace = true -repository.workspace = true -homepage.workspace = true -categories.workspace = true -keywords.workspace = true -rust-version.workspace = true - -[dependencies] -cfg_aliases = { version = "0.2.1" } - -[lints] -workspace = true diff --git a/build_helpers/src/lib.rs b/build_helpers/src/lib.rs deleted file mode 100644 index 364b6ed8..00000000 --- a/build_helpers/src/lib.rs +++ /dev/null @@ -1,24 +0,0 @@ -use cfg_aliases::cfg_aliases; - -pub fn cfg_aliases_setup() { - // The script doesn't depend on our code - println!("cargo:rerun-if-changed=build.rs"); - - // Setup cfg aliases - cfg_aliases! { - // Systems. - android_platform: { target_os = "android" }, - wasm_platform: { all(target_family = "wasm", not(target_os = "emscripten")) }, - macos_platform: { target_os = "macos" }, - ios_platform: { target_os = "ios" }, - windows_platform: { target_os = "windows" }, - apple: { any(target_os = "ios", target_os = "macos") }, - free_unix: { all(unix, not(apple), not(android_platform), not(target_os = "emscripten")) }, - redox: { target_os = "redox" }, - - // Native displays. - wayland_platform: { all(feature = "wayland", free_unix, not(wasm), not(redox)) }, - xdg_portal: { all(feature = "xdg-portal", free_unix, not(wasm), not(redox)) }, - orbital_platform: { redox }, - } -} diff --git a/core/Cargo.toml b/core/Cargo.toml index f3136a87..0a376b7c 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -19,7 +19,6 @@ crisp = [] basic-shaping = [] advanced-shaping = [] a11y = ["iced_accessibility"] -wayland = ["cctk"] [dependencies] palette = "0.7" @@ -44,6 +43,8 @@ window_clipboard.workspace = true dnd.workspace = true mime.workspace = true +cctk.workspace = true +cctk.optional = true # /TODO(POP) [dependencies.iced_accessibility] version = "0.1.0" @@ -55,10 +56,3 @@ raw-window-handle.workspace = true [dev-dependencies] approx = "0.5" - -[target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_vendor = "apple"))))'.dependencies] -cctk.workspace = true -cctk.optional = true - -[build-dependencies] -build_helpers = { path = "../build_helpers" } diff --git a/core/build.rs b/core/build.rs deleted file mode 100644 index db00a773..00000000 --- a/core/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - build_helpers::cfg_aliases_setup(); -} diff --git a/core/src/event.rs b/core/src/event.rs index b4a28a29..1aaf4ff4 100644 --- a/core/src/event.rs +++ b/core/src/event.rs @@ -7,8 +7,7 @@ use crate::keyboard; use crate::mouse; use crate::touch; use crate::window; - -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] /// A platform specific event for wayland pub mod wayland; /// A user interface event. @@ -50,7 +49,7 @@ pub enum Event { /// A platform specific event #[derive(Debug, Clone, PartialEq)] pub enum PlatformSpecific { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] /// A Wayland specific event Wayland(wayland::Event), } diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index 2598b74e..2ba0ada4 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -446,22 +446,11 @@ where | Event::Touch(touch::Event::FingerPressed { .. }) ) { if cursor.position_over(bounds).is_none() { - let was_visible = state.focused - || state.keyboard_focused - || state - .selection - .as_ref() - .is_some_and(|sel| sel.anchor != sel.end); - state.focused = false; state.keyboard_focused = false; if let Some(sel) = &mut state.selection { sel.clear(); } - - if was_visible { - shell.request_redraw(); - } } } @@ -522,7 +511,6 @@ where state.focused = true; state.keyboard_focused = false; shell.capture_event(); - shell.request_redraw(); } } @@ -532,7 +520,6 @@ where state.focused = true; state.keyboard_focused = false; shell.capture_event(); - shell.request_redraw(); } } @@ -557,15 +544,7 @@ where position.y - anchor.y, ); - let end = hit_to_grapheme(paragraph, relative, content); - - // Only the drag reaching a new grapheme changes what - // is drawn; plain motion inside one does not. - if end != sel.end { - sel.end = end; - shell.request_redraw(); - } - + sel.end = hit_to_grapheme(paragraph, relative, content); shell.capture_event(); } } @@ -608,7 +587,6 @@ where sel.anchor = 0; sel.end = grapheme_count; shell.capture_event(); - shell.request_redraw(); return; } _ => {} @@ -635,7 +613,6 @@ where sel.end = pos; } shell.capture_event(); - shell.request_redraw(); } keyboard::Key::Named(keyboard::key::Named::ArrowRight) => { let by_word = is_jump_modifier(*modifiers); @@ -656,7 +633,6 @@ where sel.end = pos; } shell.capture_event(); - shell.request_redraw(); } keyboard::Key::Named(keyboard::key::Named::Home) => { if modifiers.shift() { @@ -666,7 +642,6 @@ where sel.end = 0; } shell.capture_event(); - shell.request_redraw(); } keyboard::Key::Named(keyboard::key::Named::End) => { if modifiers.shift() { @@ -676,7 +651,6 @@ where sel.end = grapheme_count; } shell.capture_event(); - shell.request_redraw(); } _ => {} } diff --git a/graphics/src/layer.rs b/graphics/src/layer.rs index 210b8309..31cfe68a 100644 --- a/graphics/src/layer.rs +++ b/graphics/src/layer.rs @@ -83,20 +83,13 @@ impl Stack { /// Pushes a new clipping region in the [`Stack`]; creating a new layer in the /// process. pub fn push_clip(&mut self, bounds: Rectangle) { - let bounds = bounds * self.transformation(); - let bounds = bounds - .intersection(&self.layers[self.current].bounds()) - .unwrap_or(Rectangle { - width: 0.0, - height: 0.0, - ..bounds - }); - self.previous.push(self.current); self.current = self.active_count; self.active_count += 1; + let bounds = bounds * self.transformation(); + if self.current == self.layers.len() { self.layers.push(T::with_bounds(bounds)); } else { diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 1cb23e23..ea4741d1 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -17,7 +17,7 @@ workspace = true debug = [] selector = ["dep:iced_selector"] a11y = ["iced_accessibility", "iced_core/a11y"] -wayland = ["iced_core/wayland", "dep:cctk"] +cctk = ["iced_core/cctk", "dep:cctk"] [dependencies] bytes.workspace = true @@ -33,14 +33,9 @@ sipper.optional = true iced_selector.workspace = true iced_selector.optional = true iced_futures.features = ["thread-pool"] +cctk.workspace = true +cctk.optional = true iced_accessibility.workspace = true iced_accessibility.optional = true window_clipboard.workspace = true dnd.workspace = true - -[target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_vendor = "apple"))))'.dependencies] -cctk.workspace = true -cctk.optional = true - -[build-dependencies] -build_helpers = { path = "../build_helpers" } diff --git a/runtime/build.rs b/runtime/build.rs deleted file mode 100644 index db00a773..00000000 --- a/runtime/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - build_helpers::cfg_aliases_setup(); -} diff --git a/runtime/src/platform_specific/mod.rs b/runtime/src/platform_specific/mod.rs index 9cc66ddd..4ef5ad9f 100644 --- a/runtime/src/platform_specific/mod.rs +++ b/runtime/src/platform_specific/mod.rs @@ -2,23 +2,23 @@ use std::fmt; -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] /// Platform specific actions defined for wayland pub mod wayland; /// Platform specific actions defined for wayland pub enum Action { /// Wayland Specific Actions - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] Wayland(wayland::Action), } impl fmt::Debug for Action { fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] Action::Wayland(action) => action.fmt(_f), - #[cfg(not(wayland_platform))] + #[cfg(not(all(feature = "cctk", target_os = "linux")))] _ => Ok(()), } } diff --git a/runtime/src/window.rs b/runtime/src/window.rs index ae6445ec..4d2f5650 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -222,7 +222,7 @@ pub fn frames() -> Subscription<(Id, Instant)> { _ => None, }) } -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] /// Subscribes to the frames of the window of the running application. /// /// The resulting [`Subscription`] will produce items at a rate equal to the diff --git a/src/lib.rs b/src/lib.rs index 28870ee2..6e57128b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -606,7 +606,7 @@ pub mod font { pub mod event { //! Handle events of a user interface. pub use crate::core::event::PlatformSpecific; - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] pub use crate::core::event::wayland; pub use crate::core::event::{Event, Status}; pub use iced_futures::event::{listen, listen_raw, listen_with}; diff --git a/tiny_skia/src/engine.rs b/tiny_skia/src/engine.rs index 9f0b54f2..61323f04 100644 --- a/tiny_skia/src/engine.rs +++ b/tiny_skia/src/engine.rs @@ -263,10 +263,6 @@ impl Engine { } else { // Draw corners that have too small border radii as having no border radius, // but mask them with the rounded rectangle with the correct border radius. - if path_bounds.width < 1.0 || path_bounds.height < 1.0 { - return; - } - let mut temp_pixmap = tiny_skia::Pixmap::new( path_bounds.width as u32, path_bounds.height as u32, diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml index c278fb17..ffbcd293 100644 --- a/wgpu/Cargo.toml +++ b/wgpu/Cargo.toml @@ -30,7 +30,6 @@ strict-assertions = [] # builds just leave this off — window/x11.rs and the DRI3 device-id # fallback in window/compositor.rs are cfg-gated on it. x11 = ["dep:as-raw-xcb-connection", "dep:tiny-xlib", "dep:x11rb"] -wayland = ["cctk"] [dependencies] iced_debug.workspace = true @@ -71,6 +70,3 @@ x11rb = { version = "0.13.1", optional = true, features = [ "dri3", "randr", ] } - -[build-dependencies] -build_helpers = { path = "../build_helpers" } diff --git a/wgpu/build.rs b/wgpu/build.rs deleted file mode 100644 index db00a773..00000000 --- a/wgpu/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - build_helpers::cfg_aliases_setup(); -} diff --git a/wgpu/src/window.rs b/wgpu/src/window.rs index 61be2187..f71b7d3f 100644 --- a/wgpu/src/window.rs +++ b/wgpu/src/window.rs @@ -1,6 +1,11 @@ //! Display rendering results on windows. pub mod compositor; -#[cfg(wayland_platform)] +#[cfg(all( + unix, + feature = "cctk", + not(target_os = "macos"), + not(target_os = "redox") +))] mod wayland; #[cfg(all(unix, feature = "x11", not(target_os = "macos"), not(target_os = "redox")))] mod x11; diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index fef87b39..d6186ab5 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -9,10 +9,16 @@ use crate::graphics::{self, Shell, Viewport}; use crate::settings::{self, Settings}; use crate::{Engine, Renderer}; -#[cfg(wayland_platform)] +#[cfg(all( + unix, + feature = "cctk", + not(target_os = "macos"), + not(target_os = "redox") +))] use super::wayland::get_wayland_device_ids; #[cfg(all(unix, feature = "x11", not(target_os = "macos"), not(target_os = "redox")))] use super::x11::get_x11_device_ids; +use std::future::Future; /// A window graphics backend for iced powered by `wgpu`. pub struct Compositor { @@ -59,7 +65,12 @@ impl Compositor { compatible_window: Option, shell: Shell, ) -> Result { - #[cfg(wayland_platform)] + #[cfg(all( + unix, + feature = "cctk", + not(target_os = "macos"), + not(target_os = "redox") + ))] let ids = compatible_window.as_ref().and_then(|window| { let w = get_wayland_device_ids(window); #[cfg(feature = "x11")] @@ -67,13 +78,23 @@ impl Compositor { w }); + #[cfg(all( + unix, + not(feature = "cctk"), + not(target_os = "macos"), + not(target_os = "redox") + ))] + let ids = compatible_window + .as_ref() + .and_then(|window| get_x11_device_ids(window)); + // HACK: // 1. If we specifically didn't select an nvidia gpu // 2. and the user didn't specifically request an nvidia gpu // 3. and the user didn't set an adapter name, // 4. and the user didn't request the high power pref // => don't load the nvidia icd, as it might power on the gpu in hybrid setups causing severe delays - #[cfg(wayland_platform)] + #[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))] if !matches!(ids, Some((0x10de, _))) && std::env::var_os("__NV_PRIME_RENDER_OFFLOAD") .is_none_or(|var| var == "0") @@ -133,7 +154,11 @@ impl Compositor { let mut adapter = None; #[cfg_attr(not(unix), allow(dead_code))] if std::env::var_os("WGPU_ADAPTER_NAME").is_none() { - #[cfg(wayland_platform)] + #[cfg(all( + unix, + not(target_os = "macos"), + not(target_os = "redox") + ))] if let Some((vendor_id, device_id)) = ids { adapter = instance .enumerate_adapters(settings.backends) diff --git a/wgpu/src/window/x11.rs b/wgpu/src/window/x11.rs index a1508134..58da401a 100644 --- a/wgpu/src/window/x11.rs +++ b/wgpu/src/window/x11.rs @@ -1,5 +1,3 @@ -#![allow(unexpected_cfgs)] - use std::{ fs, io::{BufRead, BufReader}, @@ -146,9 +144,7 @@ pub fn get_x11_device_ids(window: &W) -> Option<(u16, u16)> { { let stat = stat(Path::new("/dev/dri").join(device)).ok()?; - // Hack (u64 as u64) for E2K CPU architecture - #[allow(clippy::unnecessary_cast)] - let dev = stat.st_rdev as u64; + let dev = stat.st_rdev; return super::ids_from_dev(dev); } } @@ -169,9 +165,7 @@ pub fn get_x11_device_ids(window: &W) -> Option<(u16, u16)> { let dri3 = conn.dri3_open(root, x11rb::NONE).ok()?.reply().ok()?; let device_fd = dri3.device_fd; let stat = fstat(device_fd).ok()?; - // Hack (u64 as u64) for E2K CPU architecture - #[allow(clippy::unnecessary_cast)] - let dev = stat.st_rdev as u64; + let dev = stat.st_rdev; super::ids_from_dev(dev) } } diff --git a/widget/Cargo.toml b/widget/Cargo.toml index 0726ae40..ab34819b 100644 --- a/widget/Cargo.toml +++ b/widget/Cargo.toml @@ -29,13 +29,15 @@ highlighter = ["dep:iced_highlighter"] advanced = [] crisp = [] a11y = ["iced_accessibility"] -wayland = ["iced_runtime/wayland", "dep:cctk"] +cctk = ["iced_runtime/cctk", "dep:cctk"] [dependencies] iced_renderer.workspace = true iced_runtime.workspace = true iced_accessibility.workspace = true iced_accessibility.optional = true +cctk.workspace = true +cctk.optional = true num-traits.workspace = true log.workspace = true rustc-hash.workspace = true @@ -55,10 +57,3 @@ pulldown-cmark.optional = true iced_highlighter.workspace = true iced_highlighter.optional = true - -[target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_vendor = "apple"))))'.dependencies] -cctk.workspace = true -cctk.optional = true - -[build-dependencies] -build_helpers = { path = "../build_helpers" } diff --git a/widget/build.rs b/widget/build.rs deleted file mode 100644 index db00a773..00000000 --- a/widget/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - build_helpers::cfg_aliases_setup(); -} diff --git a/widget/src/pin.rs b/widget/src/pin.rs index cef75944..8eb5906e 100644 --- a/widget/src/pin.rs +++ b/widget/src/pin.rs @@ -60,7 +60,6 @@ where width: Length, height: Length, position: Point, - overflow: bool, } impl<'a, Message, Theme, Renderer> Pin<'a, Message, Theme, Renderer> @@ -76,7 +75,6 @@ where width: Length::Fill, height: Length::Fill, position: Point::ORIGIN, - overflow: false, } } @@ -109,12 +107,6 @@ where self.position.y = y.into().0; self } - - /// Sets whether the [`Pin`] can overflow its boundaries. - pub fn overflow(mut self, overflow: bool) -> Self { - self.overflow = overflow; - self - } } impl Widget @@ -153,12 +145,8 @@ where ) -> layout::Node { let limits = limits.width(self.width).height(self.height); - let available = - if self.overflow { - limits.max() - } else { - limits.max() - Size::new(self.position.x, self.position.y) - }; + let available = + limits.max() - Size::new(self.position.x, self.position.y); let node = self .content diff --git a/widget/src/slider.rs b/widget/src/slider.rs index 70cfc9e4..ff32f417 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -110,8 +110,6 @@ where height: f32, class: Theme::Class<'a>, status: Option, - handle_width: f32, - handle_height: f32, } impl<'a, T, Message, Theme> Slider<'a, T, Message, Theme> @@ -121,13 +119,7 @@ where Theme: Catalog, { /// The default height of a [`Slider`]. - pub const DEFAULT_HEIGHT: f32 = 26.0; - - /// The default max height of a [`Handle`]. - pub const DEFAULT_MAX_HANDLE_HEIGHT: f32 = 26.0; - - /// The default max width of a [`Handle`]. - pub const DEFAULT_MAX_HANDLE_WIDTH: f32 = 26.0; + pub const DEFAULT_HEIGHT: f32 = 16.0; /// Creates a new [`Slider`]. /// @@ -173,8 +165,6 @@ where height: Self::DEFAULT_HEIGHT, class: Theme::default(), status: None, - handle_width: Self::DEFAULT_MAX_HANDLE_WIDTH, - handle_height: Self::DEFAULT_MAX_HANDLE_HEIGHT, } } @@ -217,24 +207,6 @@ where self } - /// Sets the max width of the [`Handle`]. - /// - /// Theme can be used to change the size and shape of handle - /// but width of handle defined in theme will not exceed this width - pub fn handle_width(mut self, width: impl Into) -> Self { - self.handle_width = width.into().0; - self - } - - /// Sets the max height of the [`Handle`]. - /// - /// Theme can be used to change the size and shape of handle - /// but height of handle defined in theme will not exceed this height - pub fn handle_height(mut self, height: impl Into) -> Self { - self.handle_height = height.into().0; - self - } - /// Sets the step size of the [`Slider`]. pub fn step(mut self, step: impl Into) -> Self { self.step = step.into(); @@ -351,15 +323,8 @@ where let mut update = || { let current_value = self.value; - self.handle_width = self.handle_width.min(layout.bounds().width); - self.handle_height = self.handle_height.min(layout.bounds().height); - let locate = |cursor_position: Point| -> Option { - let bounds = Rectangle { - x: layout.bounds().x + self.handle_width / 2.0, - width: layout.bounds().width - self.handle_width, - ..layout.bounds() - }; + let bounds = layout.bounds(); if cursor_position.x <= bounds.x { Some(*self.range.start()) @@ -544,29 +509,53 @@ where _cursor: mouse::Cursor, _viewport: &Rectangle, ) { - let bounds = Rectangle { - x: layout.bounds().x + self.handle_width / 2.0, - width: layout.bounds().width - self.handle_width, - ..layout.bounds() - }; + let bounds = layout.bounds(); let style = theme.style(&self.class, self.status.unwrap_or(Status::Active)); - let (mut handle_width, mut handle_height, handle_border_radius) = + let border_width = style + .handle + .border_width + .min(bounds.height / 2.0) + .min(bounds.width / 2.0); + + let (handle_width, handle_height, handle_border_radius) = match style.handle.shape { HandleShape::Circle { radius } => { + let radius = (radius) + .max(2.0 * border_width) + .min(bounds.height / 2.0) + .min(bounds.width / 2.0 + 2.0 * border_width); (radius * 2.0, radius * 2.0, Radius::from(radius)) } HandleShape::Rectangle { height, width, border_radius, - } => (f32::from(width), f32::from(height), border_radius), - }; + } => { + let width = (f32::from(width)).max(2.0 * border_width); + let height = (f32::from(height)).max(2.0 * border_width); + let mut border_radius: [f32; 4] = border_radius.into(); + for r in &mut border_radius { + *r = (*r) + .min(height / 2.0) + .min(width / 2.0) + .max(*r * (width + border_width * 2.0) / width); + } - handle_width = handle_width.min(self.handle_width); - handle_height = handle_height.min(self.handle_height); + ( + width, + height, + Radius { + top_left: border_radius[0], + top_right: border_radius[1], + bottom_right: border_radius[2], + bottom_left: border_radius[3], + }, + ) + } + }; let value = self.value.into() as f32; let (range_start, range_end) = { @@ -578,7 +567,8 @@ where let offset = if range_start >= range_end { 0.0 } else { - bounds.width * (value - range_start) / (range_end - range_start) + (bounds.width - handle_width) * (value - range_start) + / (range_end - range_start) }; let rail_y = bounds.y + bounds.height / 2.0; @@ -600,8 +590,7 @@ where x: bounds.x + offset, y: rail_y + 6.0, width: BREAKPOINT_WIDTH, - height: 8.0_f32 - .min(bounds.y + bounds.height - (rail_y + 6.0)), + height: 8.0, }, border: Border { radius: 0.0.into(), @@ -618,9 +607,9 @@ where renderer::Quad { bounds: Rectangle { x: bounds.x, - y: rail_y - (style.rail.width).min(bounds.height) / 2.0, - width: offset, - height: (style.rail.width).min(bounds.height), + y: rail_y - style.rail.width / 2.0, + width: offset + handle_width / 2.0, + height: style.rail.width, }, border: style.rail.border, ..renderer::Quad::default() @@ -633,10 +622,10 @@ where renderer.fill_quad( renderer::Quad { bounds: Rectangle { - x: bounds.x + offset, - y: rail_y - (style.rail.width).min(bounds.height) / 2.0, - width: bounds.width - offset, - height: (style.rail.width).min(bounds.height), + x: bounds.x + offset + handle_width / 2.0, + y: rail_y - style.rail.width / 2.0, + width: bounds.width - offset - handle_width / 2.0, + height: style.rail.width, }, border: style.rail.border, ..renderer::Quad::default() @@ -648,7 +637,7 @@ where renderer.fill_quad( renderer::Quad { bounds: Rectangle { - x: bounds.x + offset - handle_width / 2.0, + x: bounds.x + offset, y: rail_y - (handle_height / 2.0), width: handle_width, height: handle_height, diff --git a/winit/Cargo.toml b/winit/Cargo.toml index 741528b5..41e4a582 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -14,18 +14,7 @@ keywords.workspace = true workspace = true [features] -wayland = [ - "winit/wayland", - "wayland-csd-adwaita", - "wayland-protocols", - "raw-window-handle", - "iced_runtime/wayland", - "wayland-backend", - "xkbcommon", - "xkbcommon-dl", - "xkeysym", - "dep:cctk", -] +wayland = ["winit/wayland", "wayland-csd-adwaita"] default = ["x11", "wayland-dlopen"] debug = ["iced_debug/enable"] sysinfo = ["dep:sysinfo"] @@ -37,6 +26,17 @@ program = [] wayland-dlopen = ["winit/wayland-dlopen"] wayland-csd-adwaita = ["winit/wayland-csd-adwaita"] a11y = ["iced_accessibility", "iced_runtime/a11y"] +cctk = [ + "wayland", + "wayland-protocols", + "raw-window-handle", + "iced_runtime/cctk", + "wayland-backend", + "xkbcommon", + "xkbcommon-dl", + "xkeysym", + "dep:cctk", +] # Prevents multiple separate process instances. single-instance = [] @@ -64,8 +64,7 @@ iced_debug.workspace = true iced_program.workspace = true -[target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_vendor = "apple"))))'.dependencies] - +[target.'cfg(target_os = "linux")'.dependencies] mundy.workspace = true mundy.optional = true @@ -90,6 +89,3 @@ winapi.workspace = true web-sys.workspace = true web-sys.features = ["Document", "Window", "HtmlCanvasElement"] wasm-bindgen-futures.workspace = true - -[build-dependencies] -build_helpers = { path = "../build_helpers" } diff --git a/winit/build.rs b/winit/build.rs deleted file mode 100644 index db00a773..00000000 --- a/winit/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - build_helpers::cfg_aliases_setup(); -} diff --git a/winit/src/application/drag_resize.rs b/winit/src/application/drag_resize.rs index 29fa10da..6d575b52 100644 --- a/winit/src/application/drag_resize.rs +++ b/winit/src/application/drag_resize.rs @@ -49,10 +49,7 @@ pub fn event_func( position, .. } => { - let resizable = !window.is_decorated() - && !window.is_maximized() - && window.fullscreen().is_none(); - if resizable { + if !window.is_decorated() { let location = cursor_resize_direction( window.surface_size(), *position, diff --git a/winit/src/clipboard.rs b/winit/src/clipboard.rs index 2c9e4a32..d302ac36 100644 --- a/winit/src/clipboard.rs +++ b/winit/src/clipboard.rs @@ -92,7 +92,7 @@ impl Clipboard { }) .unwrap_or(State::Unavailable); - #[cfg(wayland_platform)] + #[cfg(target_os = "linux")] if let State::Connected { clipboard, .. } = &state { clipboard.init_dnd(Box::new(sender)); } diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 8ce3ed66..97cc97a6 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -23,33 +23,6 @@ use winit::event::Force; use winit::icon::IconProvider; use winit::keyboard::SmolStr; -/// Returns the activation token provided by the compositor, if any. -/// -/// The token is single-use, so it is only ever handed out to the first window. -#[cfg(target_os = "linux")] -fn take_activation_token() -> Option { - use std::sync::Mutex; - use std::sync::OnceLock; - use winit::platform::startup_notify::reset_activation_token_env; - - static TOKEN: OnceLock>> = - OnceLock::new(); - - TOKEN - .get_or_init(|| { - let token = std::env::var("XDG_ACTIVATION_TOKEN") - .ok() - .map(winit::window::ActivationToken::from_raw); - - reset_activation_token_env(); - - Mutex::new(token) - }) - .lock() - .ok() - .and_then(|mut token| token.take()) -} - /// Converts some [`window::Settings`] into some `WindowAttributes` from `winit`. pub fn window_attributes( settings: window::Settings, @@ -209,19 +182,12 @@ pub fn window_attributes( { use winit::platform::wayland::WindowAttributesWayland; - let mut wayland_attributes = WindowAttributesWayland::default() - .with_name( + attributes = attributes.with_platform_attributes(Box::new( + WindowAttributesWayland::default().with_name( &settings.platform_specific.application_id, &settings.platform_specific.application_id, - ); - - if let Some(token) = take_activation_token() { - wayland_attributes = - wayland_attributes.with_activation_token(token); - } - - attributes = attributes - .with_platform_attributes(Box::new(wayland_attributes)); + ), + )); } } @@ -458,7 +424,7 @@ pub fn window_event( WindowEvent::ScaleFactorChanged { scale_factor, .. } => { Some(Event::Window(window::Event::Rescaled(scale_factor as f32))) } - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] WindowEvent::SuggestedBounds(bounds) => { let size = bounds.map(|bounds| { let size = bounds.to_logical(scale_factor); @@ -471,7 +437,7 @@ pub fn window_event( ), ))) } - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] WindowEvent::WindowStateChanged => { use cctk::sctk::reexports::csd_frame::WindowState; use winit::platform::wayland::WindowExtWayland; @@ -1525,7 +1491,7 @@ pub fn winit_key_code( }) } -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] fn winit_native_key_code( keycode: keyboard::key::NativeCode, ) -> winit::keyboard::NativeKeyCode { @@ -1549,7 +1515,7 @@ fn winit_native_key_code( } /// Reconstruct the raw keycode -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] pub fn physical_to_scancode(physical: keyboard::key::Physical) -> Option { let Some(physical_key) = (match physical { keyboard::key::Physical::Code(code) => { diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 38457840..918f6c2a 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -47,6 +47,7 @@ mod window; pub use clipboard::Clipboard; pub use error::Error; pub use proxy::Proxy; +use winit::dpi::LogicalSize; use winit::dpi::PhysicalPosition; use winit::dpi::PhysicalSize; @@ -91,10 +92,10 @@ where let event_loop = EventLoop::new().expect("Create event loop"); - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] let is_wayland = winit::platform::wayland::EventLoopExtWayland::is_wayland(&event_loop); - #[cfg(not(wayland_platform))] + #[cfg(not(all(feature = "cctk", target_os = "linux")))] let is_wayland = false; // TODO this is new.. @@ -261,7 +262,7 @@ where | winit::event::WindowEvent::Moved(_) ); - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] { if matches!(event, WindowEvent::RedrawRequested) { for id in @@ -576,7 +577,10 @@ where .expect("Send event"); } Control::Winit(id, e) => { - #[cfg(wayland_platform)] + #[cfg(all( + feature = "cctk", + target_os = "linux" + ))] { if matches!(e, WindowEvent::RedrawRequested) { @@ -772,7 +776,7 @@ async fn run_instance

( let mut platform_specific_handler = crate::platform_specific::PlatformSpecific::default(); - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] if is_wayland { platform_specific_handler = platform_specific_handler.with_wayland( control_sender.clone(), @@ -857,8 +861,6 @@ async fn run_instance

( &mut is_window_opening, &mut system_theme, &mut platform_specific_handler, - &mut dnd_surface, - &mut dnd_surface_id, is_daemon, ) }; @@ -885,7 +887,7 @@ async fn run_instance

( on_open, resize_border, } => { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] platform_specific_handler.send_wayland( platform_specific::Action::TrackWindow(window.clone(), id), ); @@ -1054,7 +1056,7 @@ async fn run_instance

( continue; } // XX must force update to corner radius before the surface is committed. - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] if (window.surface_version != window.state.surface_version() || window.logical_size() != window.state.logical_size()) && !crate::subsurface_widget::is_subsurface(window_id) @@ -1393,7 +1395,8 @@ async fn run_instance

( true } }); - #[cfg(wayland_platform)] + let no_window_events = window_events.is_empty(); + #[cfg(all(feature = "cctk", target_os = "linux"))] window_events.push(core::Event::PlatformSpecific( core::event::PlatformSpecific::Wayland( core::event::wayland::Event::RequestResize, @@ -1410,7 +1413,8 @@ async fn run_instance

( &mut clipboard, &mut messages, ); - let mut needs_redraw = !messages.is_empty(); + let mut needs_redraw = + !no_window_events || !messages.is_empty(); if let Some(requested_size) = clipboard.requested_logical_size.lock().unwrap().take() { @@ -1466,17 +1470,8 @@ async fn run_instance

( mouse_interaction, .. } => { - let mouse_changed = - window.mouse_interaction != mouse_interaction; - window.update_mouse(mouse_interaction); - if mouse_changed { - window.request_redraw( - core::window::RedrawRequest::NextFrame, - ); - } - #[cfg(not(feature = "unconditional-rendering"))] window.request_redraw(_redraw_request); } @@ -2079,10 +2074,6 @@ fn run_action<'a, P, C>( is_window_opening: &mut bool, system_theme: &mut theme::Mode, platform_specific: &mut crate::platform_specific::PlatformSpecific, - dnd_surface: &mut Option< - Arc>, - >, - dnd_surface_id: &mut Option, is_daemon: bool, ) -> bool where @@ -2137,7 +2128,7 @@ where _ = control_sender.start_send(Control::Cleanup(id)).ok(); } let proxy = clipboard.proxy(); - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] platform_specific .send_wayland(platform_specific::Action::RemoveWindow(id)); if let Some(window) = window_manager.remove(id) { @@ -2598,10 +2589,6 @@ where } iced_runtime::dnd::DndAction::EndDnd => { clipboard.end_dnd(); - *dnd_surface = None; - if let Some(id) = dnd_surface_id.take() { - platform_specific.retain_subsurfaces(|other| other != id); - } } iced_runtime::dnd::DndAction::PeekDnd(m, channel) => { let data = clipboard.peek_dnd(m); diff --git a/winit/src/platform_specific/mod.rs b/winit/src/platform_specific/mod.rs index e1bfd9b9..5e84d16a 100644 --- a/winit/src/platform_specific/mod.rs +++ b/winit/src/platform_specific/mod.rs @@ -1,20 +1,24 @@ //! Wayland specific shell //! -use std::collections::HashMap; +use std::{borrow::Cow, collections::HashMap, sync::Arc}; -use iced_graphics::compositor; +#[cfg(all(feature = "cctk", target_os = "linux"))] +use cctk::sctk::reexports::client::Connection; +use iced_graphics::{Compositor, compositor}; use iced_runtime::{ core::{Vector, window}, - user_interface, + platform_specific, user_interface, }; use winit::raw_window_handle::HasWindowHandle; -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] pub mod wayland; -#[cfg(wayland_platform)] +#[cfg(all(feature = "cctk", target_os = "linux"))] pub use wayland::*; +#[cfg(all(feature = "cctk", target_os = "linux"))] +use wayland_backend::client::Backend; use crate::{CreateCompositor, Program, WindowManager}; @@ -31,7 +35,7 @@ pub type UserInterfaces<'a, P> = HashMap< #[derive(Debug)] pub enum Event { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] Wayland(sctk_event::SctkEvent), } @@ -57,7 +61,7 @@ impl SurfaceIdWrapper { #[derive(Debug, Default)] pub struct PlatformSpecific { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] wayland: WaylandSpecific, } @@ -67,7 +71,7 @@ impl PlatformSpecific { action: iced_runtime::platform_specific::Action, ) { match action { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] iced_runtime::platform_specific::Action::Wayland(a) => { self.send_wayland(wayland::Action::Action(a)); } @@ -78,14 +82,14 @@ impl PlatformSpecific { &mut self, keep: F, ) { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] { self.wayland.retain_subsurfaces(keep); } } pub(crate) fn clear_subsurface_list(&mut self) { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] { self.wayland.clear_subsurface_list(); } @@ -96,7 +100,7 @@ impl PlatformSpecific { id: window::Id, window: &dyn HasWindowHandle, ) { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] { use cctk::sctk::reexports::client::{ Proxy, protocol::wl_surface::WlSurface, @@ -147,11 +151,11 @@ impl PlatformSpecific { pub(crate) fn create_surface( &mut self, ) -> Option> { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] { self.wayland.create_surface() } - #[cfg(not(wayland_platform))] + #[cfg(not(all(feature = "cctk", target_os = "linux")))] { None } @@ -166,7 +170,7 @@ impl PlatformSpecific { data: &[u8], offset: Vector, ) { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] { return self.wayland.update_surface_shm( surface, width, height, scale, data, offset, @@ -194,7 +198,7 @@ pub(crate) async fn handle_event<'a, 'b, P>( P: Program, { match e { - #[cfg(wayland_platform)] + #[cfg(all(feature = "cctk", target_os = "linux"))] Event::Wayland(e) => { platform_specific .wayland diff --git a/winit/src/platform_specific/wayland/event_loop/state.rs b/winit/src/platform_specific/wayland/event_loop/state.rs index f4a8c5d7..b817e4d5 100644 --- a/winit/src/platform_specific/wayland/event_loop/state.rs +++ b/winit/src/platform_specific/wayland/event_loop/state.rs @@ -874,11 +874,6 @@ impl SctkState { _ = wl_surface.frame(&self.queue_handle, wl_surface.clone()); - if let Some(old) = self.blur_surfaces.remove(&settings.id) { - old.destroy(); - } - _ = self.corner_radii.remove(&settings.id); - if let Some(blur) = self.pending_blur.remove(&settings.id) { self.apply_blur(settings.id, Some(blur), &wl_surface); } @@ -1016,12 +1011,6 @@ impl SctkState { layer_surface.set_input_region(Some(®ion)); region.destroy(); } - - if let Some(old) = self.blur_surfaces.remove(&id) { - old.destroy(); - } - _ = self.corner_radii.remove(&id); - if let Some(blur) = self.pending_blur.remove(&id) { self.apply_blur(id, Some(blur), &wl_surface); } @@ -1279,11 +1268,11 @@ impl SctkState { || self.layer_surfaces.iter().any(|l| l.id == settings.parent && p.data.parent.wl_surface() == l.surface.wl_surface())) ) { let existing = &mut self.popups[existing]; - let size = if let Some(size) = settings.positioner.size { - size + let size = if settings.positioner.size.is_none() { + log::info!("No configured popup size"); + (1, 1) } else { - let guard = existing.common.lock().unwrap(); - (guard.size.width, guard.size.height) + settings.positioner.size.unwrap() }; let Ok(positioner) = XdgPositioner::new(&self.xdg_shell_state) .map_err(PopupCreationError::PositionerCreationFailed) else { @@ -1403,7 +1392,7 @@ impl SctkState { }, }; let mut to_destroy = vec![sctk_popup]; - + // TODO optionally destroy parents if they request to be destroyed with children while let Some(popup_to_destroy_last) = to_destroy.last().and_then(|popup| self .popups .iter() @@ -1850,7 +1839,6 @@ impl SctkState { s: &WlSurface, ) { let existing_blur = self.blur_surfaces.entry(id); - match (existing_blur, rectangles) { (Entry::Occupied(occupied_entry), None) => { let blur_surface = occupied_entry.remove(); @@ -2033,11 +2021,6 @@ impl SctkState { region.destroy(); } - if let Some(old) = self.blur_surfaces.remove(&settings.id) { - old.destroy(); - } - _ = self.corner_radii.remove(&settings.id); - if let Some(blur) = self.pending_blur.remove(&settings.id) { _ = self.apply_blur(settings.id, Some(blur), &wl_surface); } diff --git a/winit/src/platform_specific/wayland/handlers/seat/pointer.rs b/winit/src/platform_specific/wayland/handlers/seat/pointer.rs index b40912ec..8c962a4d 100644 --- a/winit/src/platform_specific/wayland/handlers/seat/pointer.rs +++ b/winit/src/platform_specific/wayland/handlers/seat/pointer.rs @@ -1,5 +1,8 @@ -use crate::platform_specific::wayland::{ - event_loop::state::SctkState, sctk_event::SctkEvent, +use crate::{ + event_loop::state::FrameStatus, + platform_specific::wayland::{ + event_loop::state::SctkState, sctk_event::SctkEvent, + }, }; use cctk::sctk::{ delegate_pointer, @@ -47,6 +50,14 @@ impl PointerHandler for SctkState { continue; } + let entry = self + .frame_status + .entry(e.surface.id()) + .or_insert(FrameStatus::RequestedRedraw); + if matches!(entry, FrameStatus::Received) { + *entry = FrameStatus::Ready; + } + self.sctk_events.push(SctkEvent::PointerEvent { variant: PointerEvent { surface: e.surface.clone(), diff --git a/winit/src/platform_specific/wayland/handlers/shell/layer.rs b/winit/src/platform_specific/wayland/handlers/shell/layer.rs index 5e6bad57..22fd6560 100644 --- a/winit/src/platform_specific/wayland/handlers/shell/layer.rs +++ b/winit/src/platform_specific/wayland/handlers/shell/layer.rs @@ -27,15 +27,6 @@ impl LayerShellHandler for SctkState { None => return, }; - if let Some(id) = self.id_map.remove(&layer.surface.wl_surface().id()) { - if let Some(blurred) = self.blur_surfaces.remove(&id) { - blurred.destroy(); - } - _ = self.corner_radii.remove(&id); - - _ = self.destroyed.insert(id); - } - self.sctk_events.push(SctkEvent::LayerSurfaceEvent { variant: LayerSurfaceEventVariant::Done, id: layer.surface.wl_surface().clone(), diff --git a/winit/src/platform_specific/wayland/handlers/shell/xdg_popup.rs b/winit/src/platform_specific/wayland/handlers/shell/xdg_popup.rs index 432f5bde..55bf2b87 100644 --- a/winit/src/platform_specific/wayland/handlers/shell/xdg_popup.rs +++ b/winit/src/platform_specific/wayland/handlers/shell/xdg_popup.rs @@ -84,11 +84,6 @@ impl PopupHandler for SctkState { for popup in to_destroy.into_iter().rev() { if let Some(id) = self.id_map.remove(&popup.popup.wl_surface().id()) { - if let Some(blurred) = self.blur_surfaces.remove(&id) { - blurred.destroy(); - } - _ = self.corner_radii.remove(&id); - _ = self.destroyed.insert(id); }