fix: feature gates

This commit is contained in:
Ashley Wulber 2026-07-15 12:34:42 -04:00 • committed by Ashley Wulber
parent f6daee14ac
commit b3b0ab1cd5
26 changed files with 176 additions and 101 deletions

13
Cargo.lock generated
View file

@ -787,6 +787,13 @@ dependencies = [
"cfg_aliases", "cfg_aliases",
] ]
[[package]]
name = "build_helpers"
version = "0.14.0"
dependencies = [
"cfg_aliases",
]
[[package]] [[package]]
name = "built" name = "built"
version = "0.8.0" version = "0.8.0"
@ -2957,6 +2964,7 @@ dependencies = [
name = "iced" name = "iced"
version = "0.14.0" version = "0.14.0"
dependencies = [ dependencies = [
"build_helpers",
"criterion", "criterion",
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -3008,6 +3016,7 @@ version = "0.14.0"
dependencies = [ dependencies = [
"approx", "approx",
"bitflags 2.11.0", "bitflags 2.11.0",
"build_helpers",
"bytes", "bytes",
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
@ -3114,6 +3123,7 @@ dependencies = [
name = "iced_runtime" name = "iced_runtime"
version = "0.14.0" version = "0.14.0"
dependencies = [ dependencies = [
"build_helpers",
"bytes", "bytes",
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
@ -3181,6 +3191,7 @@ version = "0.14.0"
dependencies = [ dependencies = [
"as-raw-xcb-connection", "as-raw-xcb-connection",
"bitflags 2.11.0", "bitflags 2.11.0",
"build_helpers",
"bytemuck", "bytemuck",
"cosmic-client-toolkit", "cosmic-client-toolkit",
"cryoglyph", "cryoglyph",
@ -3210,6 +3221,7 @@ dependencies = [
name = "iced_widget" name = "iced_widget"
version = "0.14.2" version = "0.14.2"
dependencies = [ dependencies = [
"build_helpers",
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -3231,6 +3243,7 @@ dependencies = [
name = "iced_winit" name = "iced_winit"
version = "0.14.0" version = "0.14.0"
dependencies = [ dependencies = [
"build_helpers",
"cosmic-client-toolkit", "cosmic-client-toolkit",
"cursor-icon", "cursor-icon",
"dnd", "dnd",

View file

@ -118,13 +118,17 @@ winit = [
"iced_accessibility?/accesskit_winit", "iced_accessibility?/accesskit_winit",
"iced_program/winit", "iced_program/winit",
] ]
wayland = ["iced_renderer/wayland", "iced_winit/wayland"] wayland = [
cctk = ["iced_winit/cctk", "iced_widget/cctk", "iced_core/cctk", "wayland"] "iced_renderer/wayland",
# Enables the sctk shell. "iced_winit/wayland",
"iced_runtime/wayland",
"iced_widget/wayland",
"iced_core/wayland",
]
[dependencies] [dependencies]
iced_devtools.workspace = true iced_devtools.workspace = true
iced_devtools.optional = true
iced_debug.workspace = true iced_debug.workspace = true
iced_program.workspace = true iced_program.workspace = true
@ -134,10 +138,9 @@ iced_renderer.workspace = true
iced_runtime.workspace = true iced_runtime.workspace = true
iced_widget.workspace = true iced_widget.workspace = true
iced_winit.workspace = true iced_winit.workspace = true
iced_devtools.optional = true iced_winit.optional = true
iced_tester.workspace = true iced_tester.workspace = true
iced_tester.optional = true iced_tester.optional = true
iced_winit.optional = true
iced_highlighter.workspace = true iced_highlighter.workspace = true
iced_highlighter.optional = true iced_highlighter.optional = true
iced_accessibility.workspace = true iced_accessibility.workspace = true
@ -190,6 +193,7 @@ members = [
"winit", "winit",
"examples/*", "examples/*",
"accessibility", "accessibility",
"build_helpers",
] ]
exclude = ["examples/integration"] exclude = ["examples/integration"]
@ -308,8 +312,6 @@ winit = { git = "https://github.com/pop-os/winit.git", tag = "cosmic-0.14" }
winit-core = { git = "https://github.com/pop-os/winit.git", tag = "cosmic-0.14" } winit-core = { git = "https://github.com/pop-os/winit.git", tag = "cosmic-0.14" }
cursor-icon = "1.1.0" cursor-icon = "1.1.0"
sctk = { package = "smithay-client-toolkit", version = "0.20.0" }
[workspace.lints.rust] [workspace.lints.rust]
rust_2018_idioms = { level = "deny", priority = -1 } rust_2018_idioms = { level = "deny", priority = -1 }
unused_results = "deny" unused_results = "deny"
@ -334,3 +336,6 @@ useless_conversion = "deny"
[workspace.lints.rustdoc] [workspace.lints.rustdoc]
broken_intra_doc_links = "forbid" broken_intra_doc_links = "forbid"
[build-dependencies]
build_helpers = { path = "./build_helpers" }

3
build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
build_helpers::cfg_aliases_setup();
}

17
build_helpers/Cargo.toml Normal file
View file

@ -0,0 +1,17 @@
[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

23
build_helpers/src/lib.rs Normal file
View file

@ -0,0 +1,23 @@
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)) },
orbital_platform: { redox },
}
}

View file

@ -19,6 +19,7 @@ crisp = []
basic-shaping = [] basic-shaping = []
advanced-shaping = [] advanced-shaping = []
a11y = ["iced_accessibility"] a11y = ["iced_accessibility"]
wayland = ["cctk"]
[dependencies] [dependencies]
palette = "0.7" palette = "0.7"
@ -43,8 +44,6 @@ window_clipboard.workspace = true
dnd.workspace = true dnd.workspace = true
mime.workspace = true mime.workspace = true
cctk.workspace = true
cctk.optional = true
# /TODO(POP) # /TODO(POP)
[dependencies.iced_accessibility] [dependencies.iced_accessibility]
version = "0.1.0" version = "0.1.0"
@ -56,3 +55,10 @@ raw-window-handle.workspace = true
[dev-dependencies] [dev-dependencies]
approx = "0.5" 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" }

3
core/build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
build_helpers::cfg_aliases_setup();
}

View file

@ -7,7 +7,8 @@ use crate::keyboard;
use crate::mouse; use crate::mouse;
use crate::touch; use crate::touch;
use crate::window; use crate::window;
#[cfg(all(feature = "cctk", target_os = "linux"))]
#[cfg(wayland_platform)]
/// A platform specific event for wayland /// A platform specific event for wayland
pub mod wayland; pub mod wayland;
/// A user interface event. /// A user interface event.
@ -49,7 +50,7 @@ pub enum Event {
/// A platform specific event /// A platform specific event
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub enum PlatformSpecific { pub enum PlatformSpecific {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
/// A Wayland specific event /// A Wayland specific event
Wayland(wayland::Event), Wayland(wayland::Event),
} }

View file

@ -17,7 +17,7 @@ workspace = true
debug = [] debug = []
selector = ["dep:iced_selector"] selector = ["dep:iced_selector"]
a11y = ["iced_accessibility", "iced_core/a11y"] a11y = ["iced_accessibility", "iced_core/a11y"]
cctk = ["iced_core/cctk", "dep:cctk"] wayland = ["iced_core/wayland", "dep:cctk"]
[dependencies] [dependencies]
bytes.workspace = true bytes.workspace = true
@ -33,9 +33,14 @@ sipper.optional = true
iced_selector.workspace = true iced_selector.workspace = true
iced_selector.optional = true iced_selector.optional = true
iced_futures.features = ["thread-pool"] iced_futures.features = ["thread-pool"]
cctk.workspace = true
cctk.optional = true
iced_accessibility.workspace = true iced_accessibility.workspace = true
iced_accessibility.optional = true iced_accessibility.optional = true
window_clipboard.workspace = true window_clipboard.workspace = true
dnd.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" }

3
runtime/build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
build_helpers::cfg_aliases_setup();
}

View file

@ -2,23 +2,23 @@
use std::fmt; use std::fmt;
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
/// Platform specific actions defined for wayland /// Platform specific actions defined for wayland
pub mod wayland; pub mod wayland;
/// Platform specific actions defined for wayland /// Platform specific actions defined for wayland
pub enum Action { pub enum Action {
/// Wayland Specific Actions /// Wayland Specific Actions
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
Wayland(wayland::Action), Wayland(wayland::Action),
} }
impl fmt::Debug for Action { impl fmt::Debug for Action {
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
Action::Wayland(action) => action.fmt(_f), Action::Wayland(action) => action.fmt(_f),
#[cfg(not(all(feature = "cctk", target_os = "linux")))] #[cfg(not(wayland_platform))]
_ => Ok(()), _ => Ok(()),
} }
} }

View file

@ -222,7 +222,7 @@ pub fn frames() -> Subscription<(Id, Instant)> {
_ => None, _ => None,
}) })
} }
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
/// Subscribes to the frames of the window of the running application. /// Subscribes to the frames of the window of the running application.
/// ///
/// The resulting [`Subscription`] will produce items at a rate equal to the /// The resulting [`Subscription`] will produce items at a rate equal to the

View file

@ -606,7 +606,7 @@ pub mod font {
pub mod event { pub mod event {
//! Handle events of a user interface. //! Handle events of a user interface.
pub use crate::core::event::PlatformSpecific; pub use crate::core::event::PlatformSpecific;
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
pub use crate::core::event::wayland; pub use crate::core::event::wayland;
pub use crate::core::event::{Event, Status}; pub use crate::core::event::{Event, Status};
pub use iced_futures::event::{listen, listen_raw, listen_with}; pub use iced_futures::event::{listen, listen_raw, listen_with};

View file

@ -25,6 +25,7 @@ svg = ["iced_graphics/svg", "resvg/text"]
web-colors = ["iced_graphics/web-colors"] web-colors = ["iced_graphics/web-colors"]
webgl = ["wgpu/webgl"] webgl = ["wgpu/webgl"]
strict-assertions = [] strict-assertions = []
wayland = ["cctk"]
[dependencies] [dependencies]
iced_debug.workspace = true iced_debug.workspace = true
@ -65,4 +66,6 @@ x11rb = { version = "0.13.1", features = [
"dri3", "dri3",
"randr", "randr",
] } ] }
sctk.workspace = true
[build-dependencies]
build_helpers = { path = "../build_helpers" }

3
wgpu/build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
build_helpers::cfg_aliases_setup();
}

View file

@ -1,10 +1,6 @@
//! Display rendering results on windows. //! Display rendering results on windows.
pub mod compositor; pub mod compositor;
#[cfg(all( #[cfg(wayland_platform)]
unix,
not(target_os = "macos"),
not(target_os = "redox")
))]
mod wayland; mod wayland;
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))] #[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))]
mod x11; mod x11;

View file

@ -9,15 +9,10 @@ use crate::graphics::{self, Shell, Viewport};
use crate::settings::{self, Settings}; use crate::settings::{self, Settings};
use crate::{Engine, Renderer}; use crate::{Engine, Renderer};
#[cfg(all( #[cfg(wayland_platform)]
unix,
not(target_os = "macos"),
not(target_os = "redox")
))]
use super::wayland::get_wayland_device_ids; use super::wayland::get_wayland_device_ids;
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))] #[cfg(wayland_platform)]
use super::x11::get_x11_device_ids; use super::x11::get_x11_device_ids;
use std::future::Future;
/// A window graphics backend for iced powered by `wgpu`. /// A window graphics backend for iced powered by `wgpu`.
pub struct Compositor { pub struct Compositor {
@ -64,11 +59,7 @@ impl Compositor {
compatible_window: Option<W>, compatible_window: Option<W>,
shell: Shell, shell: Shell,
) -> Result<Self, Error> { ) -> Result<Self, Error> {
#[cfg(all( #[cfg(wayland_platform)]
unix,
not(target_os = "macos"),
not(target_os = "redox")
))]
let ids = compatible_window.as_ref().and_then(|window| { let ids = compatible_window.as_ref().and_then(|window| {
get_wayland_device_ids(window) get_wayland_device_ids(window)
.or_else(|| get_x11_device_ids(window)) .or_else(|| get_x11_device_ids(window))
@ -80,7 +71,7 @@ impl Compositor {
// 3. and the user didn't set an adapter name, // 3. and the user didn't set an adapter name,
// 4. and the user didn't request the high power pref // 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 // => don't load the nvidia icd, as it might power on the gpu in hybrid setups causing severe delays
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))] #[cfg(wayland_platform)]
if !matches!(ids, Some((0x10de, _))) if !matches!(ids, Some((0x10de, _)))
&& std::env::var_os("__NV_PRIME_RENDER_OFFLOAD") && std::env::var_os("__NV_PRIME_RENDER_OFFLOAD")
.is_none_or(|var| var == "0") .is_none_or(|var| var == "0")
@ -140,11 +131,7 @@ impl Compositor {
let mut adapter = None; let mut adapter = None;
#[cfg_attr(not(unix), allow(dead_code))] #[cfg_attr(not(unix), allow(dead_code))]
if std::env::var_os("WGPU_ADAPTER_NAME").is_none() { if std::env::var_os("WGPU_ADAPTER_NAME").is_none() {
#[cfg(all( #[cfg(wayland_platform)]
unix,
not(target_os = "macos"),
not(target_os = "redox")
))]
if let Some((vendor_id, device_id)) = ids { if let Some((vendor_id, device_id)) = ids {
adapter = instance adapter = instance
.enumerate_adapters(settings.backends) .enumerate_adapters(settings.backends)

View file

@ -1,5 +1,5 @@
use crate::graphics::compositor::Window; use crate::graphics::compositor::Window;
use sctk::{ use cctk::sctk::{
dmabuf::{DmabufFeedback, DmabufHandler, DmabufState}, dmabuf::{DmabufFeedback, DmabufHandler, DmabufState},
registry::{ProvidesRegistryState, RegistryState}, registry::{ProvidesRegistryState, RegistryState},
registry_handlers, registry_handlers,
@ -111,5 +111,5 @@ pub fn get_wayland_device_ids<W: Window>(window: &W) -> Option<(u16, u16)> {
} }
} }
sctk::delegate_dmabuf!(AppData); cctk::sctk::delegate_dmabuf!(AppData);
sctk::delegate_registry!(AppData); cctk::sctk::delegate_registry!(AppData);

View file

@ -29,15 +29,13 @@ highlighter = ["dep:iced_highlighter"]
advanced = [] advanced = []
crisp = [] crisp = []
a11y = ["iced_accessibility"] a11y = ["iced_accessibility"]
cctk = ["iced_runtime/cctk", "dep:cctk"] wayland = ["iced_runtime/wayland", "dep:cctk"]
[dependencies] [dependencies]
iced_renderer.workspace = true iced_renderer.workspace = true
iced_runtime.workspace = true iced_runtime.workspace = true
iced_accessibility.workspace = true iced_accessibility.workspace = true
iced_accessibility.optional = true iced_accessibility.optional = true
cctk.workspace = true
cctk.optional = true
num-traits.workspace = true num-traits.workspace = true
log.workspace = true log.workspace = true
rustc-hash.workspace = true rustc-hash.workspace = true
@ -57,3 +55,10 @@ pulldown-cmark.optional = true
iced_highlighter.workspace = true iced_highlighter.workspace = true
iced_highlighter.optional = 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" }

3
widget/build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
build_helpers::cfg_aliases_setup();
}

View file

@ -14,7 +14,18 @@ keywords.workspace = true
workspace = true workspace = true
[features] [features]
wayland = ["winit/wayland", "wayland-csd-adwaita"] wayland = [
"winit/wayland",
"wayland-csd-adwaita",
"wayland-protocols",
"raw-window-handle",
"iced_runtime/wayland",
"wayland-backend",
"xkbcommon",
"xkbcommon-dl",
"xkeysym",
"dep:cctk",
]
default = ["x11", "wayland-dlopen"] default = ["x11", "wayland-dlopen"]
debug = ["iced_debug/enable"] debug = ["iced_debug/enable"]
sysinfo = ["dep:sysinfo"] sysinfo = ["dep:sysinfo"]
@ -26,17 +37,6 @@ program = []
wayland-dlopen = ["winit/wayland-dlopen"] wayland-dlopen = ["winit/wayland-dlopen"]
wayland-csd-adwaita = ["winit/wayland-csd-adwaita"] wayland-csd-adwaita = ["winit/wayland-csd-adwaita"]
a11y = ["iced_accessibility", "iced_runtime/a11y"] 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. # Prevents multiple separate process instances.
single-instance = [] single-instance = []
@ -64,7 +64,8 @@ iced_debug.workspace = true
iced_program.workspace = true iced_program.workspace = true
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_vendor = "apple"))))'.dependencies]
mundy.workspace = true mundy.workspace = true
mundy.optional = true mundy.optional = true
@ -89,3 +90,6 @@ winapi.workspace = true
web-sys.workspace = true web-sys.workspace = true
web-sys.features = ["Document", "Window", "HtmlCanvasElement"] web-sys.features = ["Document", "Window", "HtmlCanvasElement"]
wasm-bindgen-futures.workspace = true wasm-bindgen-futures.workspace = true
[build-dependencies]
build_helpers = { path = "../build_helpers" }

3
winit/build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
build_helpers::cfg_aliases_setup();
}

View file

@ -92,7 +92,7 @@ impl Clipboard {
}) })
.unwrap_or(State::Unavailable); .unwrap_or(State::Unavailable);
#[cfg(target_os = "linux")] #[cfg(wayland_platform)]
if let State::Connected { clipboard, .. } = &state { if let State::Connected { clipboard, .. } = &state {
clipboard.init_dnd(Box::new(sender)); clipboard.init_dnd(Box::new(sender));
} }

View file

@ -424,7 +424,7 @@ pub fn window_event(
WindowEvent::ScaleFactorChanged { scale_factor, .. } => { WindowEvent::ScaleFactorChanged { scale_factor, .. } => {
Some(Event::Window(window::Event::Rescaled(scale_factor as f32))) Some(Event::Window(window::Event::Rescaled(scale_factor as f32)))
} }
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
WindowEvent::SuggestedBounds(bounds) => { WindowEvent::SuggestedBounds(bounds) => {
let size = bounds.map(|bounds| { let size = bounds.map(|bounds| {
let size = bounds.to_logical(scale_factor); let size = bounds.to_logical(scale_factor);
@ -437,7 +437,7 @@ pub fn window_event(
), ),
))) )))
} }
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
WindowEvent::WindowStateChanged => { WindowEvent::WindowStateChanged => {
use cctk::sctk::reexports::csd_frame::WindowState; use cctk::sctk::reexports::csd_frame::WindowState;
use winit::platform::wayland::WindowExtWayland; use winit::platform::wayland::WindowExtWayland;
@ -1491,7 +1491,7 @@ pub fn winit_key_code(
}) })
} }
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
fn winit_native_key_code( fn winit_native_key_code(
keycode: keyboard::key::NativeCode, keycode: keyboard::key::NativeCode,
) -> winit::keyboard::NativeKeyCode { ) -> winit::keyboard::NativeKeyCode {
@ -1515,7 +1515,7 @@ fn winit_native_key_code(
} }
/// Reconstruct the raw keycode /// Reconstruct the raw keycode
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
pub fn physical_to_scancode(physical: keyboard::key::Physical) -> Option<u32> { pub fn physical_to_scancode(physical: keyboard::key::Physical) -> Option<u32> {
let Some(physical_key) = (match physical { let Some(physical_key) = (match physical {
keyboard::key::Physical::Code(code) => { keyboard::key::Physical::Code(code) => {

View file

@ -47,7 +47,6 @@ mod window;
pub use clipboard::Clipboard; pub use clipboard::Clipboard;
pub use error::Error; pub use error::Error;
pub use proxy::Proxy; pub use proxy::Proxy;
use winit::dpi::LogicalSize;
use winit::dpi::PhysicalPosition; use winit::dpi::PhysicalPosition;
use winit::dpi::PhysicalSize; use winit::dpi::PhysicalSize;
@ -92,10 +91,10 @@ where
let event_loop = EventLoop::new().expect("Create event loop"); let event_loop = EventLoop::new().expect("Create event loop");
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
let is_wayland = let is_wayland =
winit::platform::wayland::EventLoopExtWayland::is_wayland(&event_loop); winit::platform::wayland::EventLoopExtWayland::is_wayland(&event_loop);
#[cfg(not(all(feature = "cctk", target_os = "linux")))] #[cfg(not(wayland_platform))]
let is_wayland = false; let is_wayland = false;
// TODO this is new.. // TODO this is new..
@ -260,7 +259,7 @@ where
| winit::event::WindowEvent::Moved(_) | winit::event::WindowEvent::Moved(_)
); );
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
{ {
if matches!(event, WindowEvent::RedrawRequested) { if matches!(event, WindowEvent::RedrawRequested) {
for id in for id in
@ -575,10 +574,7 @@ where
.expect("Send event"); .expect("Send event");
} }
Control::Winit(id, e) => { Control::Winit(id, e) => {
#[cfg(all( #[cfg(wayland_platform)]
feature = "cctk",
target_os = "linux"
))]
{ {
if matches!(e, WindowEvent::RedrawRequested) if matches!(e, WindowEvent::RedrawRequested)
{ {
@ -774,7 +770,7 @@ async fn run_instance<P>(
let mut platform_specific_handler = let mut platform_specific_handler =
crate::platform_specific::PlatformSpecific::default(); crate::platform_specific::PlatformSpecific::default();
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
if is_wayland { if is_wayland {
platform_specific_handler = platform_specific_handler.with_wayland( platform_specific_handler = platform_specific_handler.with_wayland(
control_sender.clone(), control_sender.clone(),
@ -885,7 +881,7 @@ async fn run_instance<P>(
on_open, on_open,
resize_border, resize_border,
} => { } => {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
platform_specific_handler.send_wayland( platform_specific_handler.send_wayland(
platform_specific::Action::TrackWindow(window.clone(), id), platform_specific::Action::TrackWindow(window.clone(), id),
); );
@ -1054,7 +1050,7 @@ async fn run_instance<P>(
continue; continue;
} }
// XX must force update to corner radius before the surface is committed. // XX must force update to corner radius before the surface is committed.
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
if (window.surface_version != window.state.surface_version() if (window.surface_version != window.state.surface_version()
|| window.logical_size() != window.state.logical_size()) || window.logical_size() != window.state.logical_size())
&& !crate::subsurface_widget::is_subsurface(window_id) && !crate::subsurface_widget::is_subsurface(window_id)
@ -1394,7 +1390,7 @@ async fn run_instance<P>(
} }
}); });
let no_window_events = window_events.is_empty(); let no_window_events = window_events.is_empty();
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
window_events.push(core::Event::PlatformSpecific( window_events.push(core::Event::PlatformSpecific(
core::event::PlatformSpecific::Wayland( core::event::PlatformSpecific::Wayland(
core::event::wayland::Event::RequestResize, core::event::wayland::Event::RequestResize,
@ -2126,7 +2122,7 @@ where
_ = control_sender.start_send(Control::Cleanup(id)).ok(); _ = control_sender.start_send(Control::Cleanup(id)).ok();
} }
let proxy = clipboard.proxy(); let proxy = clipboard.proxy();
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
platform_specific platform_specific
.send_wayland(platform_specific::Action::RemoveWindow(id)); .send_wayland(platform_specific::Action::RemoveWindow(id));
if let Some(window) = window_manager.remove(id) { if let Some(window) = window_manager.remove(id) {

View file

@ -1,24 +1,20 @@
//! Wayland specific shell //! Wayland specific shell
//! //!
use std::{borrow::Cow, collections::HashMap, sync::Arc}; use std::collections::HashMap;
#[cfg(all(feature = "cctk", target_os = "linux"))] use iced_graphics::compositor;
use cctk::sctk::reexports::client::Connection;
use iced_graphics::{Compositor, compositor};
use iced_runtime::{ use iced_runtime::{
core::{Vector, window}, core::{Vector, window},
platform_specific, user_interface, user_interface,
}; };
use winit::raw_window_handle::HasWindowHandle; use winit::raw_window_handle::HasWindowHandle;
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
pub mod wayland; pub mod wayland;
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
pub use wayland::*; pub use wayland::*;
#[cfg(all(feature = "cctk", target_os = "linux"))]
use wayland_backend::client::Backend;
use crate::{CreateCompositor, Program, WindowManager}; use crate::{CreateCompositor, Program, WindowManager};
@ -35,7 +31,7 @@ pub type UserInterfaces<'a, P> = HashMap<
#[derive(Debug)] #[derive(Debug)]
pub enum Event { pub enum Event {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
Wayland(sctk_event::SctkEvent), Wayland(sctk_event::SctkEvent),
} }
@ -61,7 +57,7 @@ impl SurfaceIdWrapper {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct PlatformSpecific { pub struct PlatformSpecific {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
wayland: WaylandSpecific, wayland: WaylandSpecific,
} }
@ -71,7 +67,7 @@ impl PlatformSpecific {
action: iced_runtime::platform_specific::Action, action: iced_runtime::platform_specific::Action,
) { ) {
match action { match action {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
iced_runtime::platform_specific::Action::Wayland(a) => { iced_runtime::platform_specific::Action::Wayland(a) => {
self.send_wayland(wayland::Action::Action(a)); self.send_wayland(wayland::Action::Action(a));
} }
@ -82,14 +78,14 @@ impl PlatformSpecific {
&mut self, &mut self,
keep: F, keep: F,
) { ) {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
{ {
self.wayland.retain_subsurfaces(keep); self.wayland.retain_subsurfaces(keep);
} }
} }
pub(crate) fn clear_subsurface_list(&mut self) { pub(crate) fn clear_subsurface_list(&mut self) {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
{ {
self.wayland.clear_subsurface_list(); self.wayland.clear_subsurface_list();
} }
@ -100,7 +96,7 @@ impl PlatformSpecific {
id: window::Id, id: window::Id,
window: &dyn HasWindowHandle, window: &dyn HasWindowHandle,
) { ) {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
{ {
use cctk::sctk::reexports::client::{ use cctk::sctk::reexports::client::{
Proxy, protocol::wl_surface::WlSurface, Proxy, protocol::wl_surface::WlSurface,
@ -151,7 +147,7 @@ impl PlatformSpecific {
pub(crate) fn create_surface( pub(crate) fn create_surface(
&mut self, &mut self,
) -> Option<Box<dyn HasWindowHandle + Send + Sync + 'static>> { ) -> Option<Box<dyn HasWindowHandle + Send + Sync + 'static>> {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
{ {
return self.wayland.create_surface(); return self.wayland.create_surface();
} }
@ -167,7 +163,7 @@ impl PlatformSpecific {
data: &[u8], data: &[u8],
offset: Vector, offset: Vector,
) { ) {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
{ {
return self.wayland.update_surface_shm( return self.wayland.update_surface_shm(
surface, width, height, scale, data, offset, surface, width, height, scale, data, offset,
@ -195,7 +191,7 @@ pub(crate) async fn handle_event<'a, 'b, P>(
P: Program, P: Program,
{ {
match e { match e {
#[cfg(all(feature = "cctk", target_os = "linux"))] #[cfg(wayland_platform)]
Event::Wayland(e) => { Event::Wayland(e) => {
platform_specific platform_specific
.wayland .wayland