diff --git a/Cargo.lock b/Cargo.lock index f6b1359f..805e6066 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1070,6 +1070,7 @@ 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", @@ -1079,12 +1080,22 @@ 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" @@ -1277,6 +1288,7 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=160b086#160b086abe03cd34a8a375d7fbe47b24308d1f38" dependencies = [ "bitflags 2.11.0", "cosmic-protocols", @@ -1289,6 +1301,7 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=160b086#160b086abe03cd34a8a375d7fbe47b24308d1f38" dependencies = [ "bitflags 2.11.0", "wayland-backend", @@ -1301,7 +1314,8 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.19.0" +version = "0.18.2" +source = "git+https://github.com/pop-os/cosmic-text.git#4d74f795cc771fdcc7ea0f9cacba63fcf036fad6" dependencies = [ "bitflags 2.11.0", "fontdb", @@ -1319,7 +1333,6 @@ dependencies = [ "unicode-linebreak", "unicode-script", "unicode-segmentation", - "unicode-width", ] [[package]] @@ -1426,6 +1439,7 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" +source = "git+https://github.com/pop-os/glyphon.git?tag=cosmic-0.14#c49de15bce4d8254ac136d1be9911960cc85ce12" dependencies = [ "cosmic-text", "etagere", @@ -1602,6 +1616,7 @@ 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", @@ -1636,6 +1651,30 @@ 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" @@ -1643,6 +1682,16 @@ 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" @@ -3781,6 +3830,12 @@ 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" @@ -4006,6 +4061,7 @@ 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", ] @@ -6226,6 +6282,7 @@ 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", @@ -6283,12 +6340,14 @@ 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", @@ -7957,10 +8016,12 @@ 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", @@ -8528,6 +8589,7 @@ 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", @@ -8553,6 +8615,7 @@ 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", @@ -8567,6 +8630,7 @@ 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", @@ -8588,6 +8652,7 @@ 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", @@ -8602,6 +8667,7 @@ 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", @@ -8615,6 +8681,7 @@ 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", @@ -8630,6 +8697,7 @@ 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", @@ -8649,6 +8717,7 @@ 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", @@ -8674,6 +8743,7 @@ 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", @@ -8695,6 +8765,7 @@ 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", @@ -8710,6 +8781,7 @@ 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", diff --git a/Cargo.toml b/Cargo.toml index 488eb21f..49b4b5d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -238,10 +238,10 @@ async-std = "1.0" bitflags = "2.5" bytemuck = { version = "1.0", features = ["derive"] } bytes = "1.6" -cosmic-text = { path = "../../cosmic-text" } +cosmic-text = { git = "https://github.com/pop-os/cosmic-text.git" } # cosmic-text = "0.10" dark-light = "1.0" -cryoglyph = { package = "cryoglyph", path = "../../glyphon" } +cryoglyph = { package = "cryoglyph", git = "https://github.com/pop-os/glyphon.git", tag = "cosmic-0.14" } resvg = "0.45" web-sys = "0.3.69" guillotiere = "0.6" @@ -275,11 +275,8 @@ tiny-skia = { version = "0.11", default-features = false, features = [ "std", "simd", ] } -cctk = { path = "../../cosmic-protocols/client-toolkit", package = "cosmic-client-toolkit" } -# Yoda: default-features=false drops softbuffer's x11 / x11-dlopen (pulled -# tiny-xlib + as-raw-xcb-connection). The wayland + wayland-dlopen features -# are re-activated via iced_tiny_skia's own `wayland` feature propagation. -softbuffer = { path = "../../softbuffer", default-features = false } +cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "160b086" } +softbuffer = { git = "https://github.com/pop-os/softbuffer", tag = "cosmic-4.0" } syntect = "5.2" tokio = "1.0" tracing = "0.1" @@ -305,40 +302,13 @@ wayland-client = { version = "0.31.5" } winapi = "0.3" # window_clipboard = "0.4.1" -# Yoda: window_clipboard pinned to our public fork that has x11 gated behind -# an opt-in feature. default-features=false + features=["wayland"] drops -# clipboard_x11 + x11rb from the build. Branch yoda-x11-optional on -# https://forge.aditua.com/leyoda/window_clipboard. -window_clipboard = { path = "../../window_clipboard", default-features = false, features = ["wayland"] } -dnd = { path = "../../window_clipboard/dnd" } -mime = { path = "../../window_clipboard/mime" } -# Yoda: default-features = false drops winit's x11 default, which otherwise -# pulls winit-x11, x11-dl, tiny-xlib, as-raw-xcb-connection. Our Wayland-only -# fork doesn't need any of that — the wayland + wayland-dlopen features are -# re-enabled via iced_winit's own feature propagation from libcosmic-yoda. -winit = { path = "../../winit/winit", default-features = false } -winit-core = { path = "../../winit/winit-core" } +window_clipboard = { git = "https://github.com/pop-os/window_clipboard.git", tag = "sctk-0.20" } +dnd = { git = "https://github.com/pop-os/window_clipboard.git", tag = "sctk-0.20" } +mime = { git = "https://github.com/pop-os/window_clipboard.git", tag = "sctk-0.20" } +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" } cursor-icon = "1.1.0" -[patch.'https://github.com/pop-os/softbuffer'] -softbuffer = { path = "../../softbuffer" } - -[patch.'https://github.com/pop-os/smithay-clipboard'] -smithay-clipboard = { path = "../../smithay-clipboard" } - -[patch.'https://github.com/pop-os/winit.git'] -dpi = { path = "../../winit/dpi" } -winit = { path = "../../winit/winit" } -winit-android = { path = "../../winit/winit-android" } -winit-appkit = { path = "../../winit/winit-appkit" } -winit-common = { path = "../../winit/winit-common" } -winit-core = { path = "../../winit/winit-core" } -winit-orbital = { path = "../../winit/winit-orbital" } -winit-uikit = { path = "../../winit/winit-uikit" } -winit-wayland = { path = "../../winit/winit-wayland" } -winit-web = { path = "../../winit/winit-web" } -winit-win32 = { path = "../../winit/winit-win32" } -winit-x11 = { path = "../../winit/winit-x11" } [workspace.lints.rust] rust_2018_idioms = { level = "deny", priority = -1 } diff --git a/core/src/element.rs b/core/src/element.rs index dbe449c5..f97ed6bc 100644 --- a/core/src/element.rs +++ b/core/src/element.rs @@ -1,4 +1,4 @@ -use crate::event::Event; +use crate::event::{self, Event}; use crate::id::Id; use crate::layout; use crate::mouse; diff --git a/core/src/overlay/group.rs b/core/src/overlay/group.rs index 1a4ce672..ec0906e7 100644 --- a/core/src/overlay/group.rs +++ b/core/src/overlay/group.rs @@ -3,7 +3,7 @@ use crate::mouse; use crate::overlay; use crate::renderer; use crate::widget; -use crate::{Clipboard, Event, Layout, Overlay, Shell, Size}; +use crate::{Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size}; /// An [`Overlay`] container that displays multiple overlay [`overlay::Element`] /// children. diff --git a/core/src/settings.rs b/core/src/settings.rs index 2ee1021d..be744b36 100644 --- a/core/src/settings.rs +++ b/core/src/settings.rs @@ -63,3 +63,13 @@ impl Default for Settings { } } +#[cfg(feature = "winit")] +impl From for iced_winit::Settings { + fn from(settings: Settings) -> iced_winit::Settings { + iced_winit::Settings { + id: settings.id, + fonts: settings.fonts, + is_daemon: settings.is_daemon, + } + } +} diff --git a/core/src/widget/operation/search_id.rs b/core/src/widget/operation/search_id.rs index e03fac8a..1286abaf 100644 --- a/core/src/widget/operation/search_id.rs +++ b/core/src/widget/operation/search_id.rs @@ -4,7 +4,7 @@ use super::Operation; use crate::{ Rectangle, id::Id, - widget::operation::Outcome, + widget::operation::{Outcome, focusable::Count}, }; /// Produces an [`Operation`] that searches for the Id diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index 19e76761..1e40bf9e 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -25,12 +25,13 @@ use crate::layout; use crate::mouse; use crate::renderer; use crate::text::paragraph::{self, Paragraph}; -use crate::text::{self}; +use crate::text::{self, Fragment}; use crate::widget::tree::{self, Tree}; use crate::{ Color, Element, Layout, Length, Pixels, Rectangle, Size, Theme, Widget, }; +use std::borrow::Cow; pub use text::{Alignment, Ellipsize, LineHeight, Shaping, Wrapping}; /// A bunch of text. diff --git a/graphics/src/image.rs b/graphics/src/image.rs index d9b23216..e5fe9281 100644 --- a/graphics/src/image.rs +++ b/graphics/src/image.rs @@ -2,6 +2,8 @@ #[cfg(feature = "image")] use crate::core::Bytes; +use crate::core::Color; +use crate::core::Radians; use crate::core::Rectangle; use crate::core::image; use crate::core::svg; diff --git a/runtime/src/dnd.rs b/runtime/src/dnd.rs index 446bee68..e6f2b267 100644 --- a/runtime/src/dnd.rs +++ b/runtime/src/dnd.rs @@ -1,8 +1,10 @@ //! Access the clipboard. +use std::any::Any; use dnd::{DndDestinationRectangle, DndSurface}; -use window_clipboard::mime::AllowedMimeTypes; +use iced_core::clipboard::DndSource; +use window_clipboard::mime::{AllowedMimeTypes, AsMimeTypes}; use crate::{oneshot, task, Action, Task}; diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 68034bfc..22da3d66 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -28,6 +28,7 @@ pub use task::Task; pub use user_interface::UserInterface; pub use window::Window; +use crate::core::Color; use crate::futures::futures::channel::oneshot; use std::borrow::Cow; diff --git a/runtime/src/platform_specific/wayland/popup.rs b/runtime/src/platform_specific/wayland/popup.rs index d186f5f0..e0475eb8 100644 --- a/runtime/src/platform_specific/wayland/popup.rs +++ b/runtime/src/platform_specific/wayland/popup.rs @@ -1,12 +1,14 @@ +use std::any::Any; use std::fmt; use std::hash::{Hash, Hasher}; +use std::sync::Arc; use cctk::sctk::reexports::protocols::xdg::shell::client::xdg_positioner::{ Anchor, Gravity, }; use iced_core::layout::Limits; use iced_core::window::Id; -use iced_core::Rectangle; +use iced_core::{Element, Rectangle}; /// Popup creation details #[derive(Debug, Clone)] diff --git a/runtime/src/platform_specific/wayland/subsurface.rs b/runtime/src/platform_specific/wayland/subsurface.rs index 13ae6da2..f174b0a5 100644 --- a/runtime/src/platform_specific/wayland/subsurface.rs +++ b/runtime/src/platform_specific/wayland/subsurface.rs @@ -1,9 +1,14 @@ +use std::any::Any; use std::fmt; use std::hash::{Hash, Hasher}; +use std::sync::Arc; -use cctk::sctk::reexports::protocols::xdg::shell::client::xdg_positioner::Gravity; +use cctk::sctk::reexports::protocols::xdg::shell::client::xdg_positioner::{ + Anchor, Gravity, +}; +use iced_core::layout::Limits; use iced_core::window::Id; -use iced_core::{Point, Rectangle, Size}; +use iced_core::{Element, Point, Rectangle, Size}; /// Subsurface creation details #[derive(Debug, Clone)] diff --git a/tiny_skia/src/raster.rs b/tiny_skia/src/raster.rs index cf508c9c..7c820917 100644 --- a/tiny_skia/src/raster.rs +++ b/tiny_skia/src/raster.rs @@ -57,7 +57,7 @@ impl Pipeline { let width_scale = bounds.width / image.width() as f32; let height_scale = bounds.height / image.height() as f32; - let _quality = match filter_method { + let quality = match filter_method { raster::FilterMethod::Linear => tiny_skia::FilterQuality::Bilinear, raster::FilterMethod::Nearest => tiny_skia::FilterQuality::Nearest, }; diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml index ffbcd293..48fca1b8 100644 --- a/wgpu/Cargo.toml +++ b/wgpu/Cargo.toml @@ -25,11 +25,6 @@ svg = ["iced_graphics/svg", "resvg/text"] web-colors = ["iced_graphics/web-colors"] webgl = ["wgpu/webgl"] strict-assertions = [] -# Yoda: opt-in X11 backend. Pulls tiny-xlib/as-raw-xcb-connection/x11rb -# (which otherwise were unconditional direct deps on unix). Wayland-only -# 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"] [dependencies] iced_debug.workspace = true @@ -62,9 +57,9 @@ wayland-protocols.workspace = true wayland-backend = { version = "0.3.3", features = ["client_system"] } wayland-client = { version = "0.31.2" } wayland-sys = { version = "0.31.1", features = ["dlopen"] } -as-raw-xcb-connection = { version = "1.0.1", optional = true } -tiny-xlib = { version = "0.2.3", optional = true } -x11rb = { version = "0.13.1", optional = true, features = [ +as-raw-xcb-connection = "1.0.1" +tiny-xlib = "0.2.3" +x11rb = { version = "0.13.1", features = [ "allow-unsafe-code", "dl-libxcb", "dri3", diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index c61730b6..d4a96ef8 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -1,3 +1,4 @@ +use crate::core::Radians; use crate::core::{ self, Background, Color, Point, Rectangle, Svg, Transformation, renderer, }; diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 4b22ad0a..4eb52cc8 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -64,8 +64,8 @@ pub use geometry::Geometry; use crate::core::renderer; use crate::core::{ - Background, Color, Font, Pixels, Point, Rectangle, Size, - Transformation, + Background, Color, Font, Pixels, Point, Radians, Rectangle, Size, + Transformation, Vector, image::FilterMethod, }; use crate::graphics::mesh; use crate::graphics::text::{Editor, Paragraph}; @@ -671,6 +671,50 @@ impl Renderer { }); } + fn draw_overlay( + &mut self, + overlay: &[impl AsRef], + viewport: &Viewport, + ) { + use crate::core::Renderer as _; + use crate::core::alignment; + use crate::core::text::Renderer as _; + + self.with_layer( + Rectangle::with_size(viewport.logical_size()), + |renderer| { + for (i, line) in overlay.iter().enumerate() { + let text = crate::core::Text { + content: line.as_ref().to_owned(), + bounds: viewport.logical_size(), + size: Pixels(20.0), + line_height: core::text::LineHeight::default(), + font: Font::MONOSPACE, + align_x: core::text::Alignment::Left, + align_y: alignment::Vertical::Top, + shaping: core::text::Shaping::Advanced, + wrapping: core::text::Wrapping::Word, + ellipsize: core::text::Ellipsize::None, + }; + + renderer.fill_text( + text.clone(), + Point::new(11.0, 11.0 + 25.0 * i as f32), + Color::from_rgba(0.9, 0.9, 0.9, 1.0), + Rectangle::with_size(Size::INFINITE), + ); + + renderer.fill_text( + text, + Point::new(11.0, 11.0 + 25.0 * i as f32) + + Vector::new(-1.0, -1.0), + Color::BLACK, + Rectangle::with_size(Size::INFINITE), + ); + } + }, + ); + } } impl core::Renderer for Renderer { diff --git a/wgpu/src/window.rs b/wgpu/src/window.rs index f71b7d3f..b9ec54bd 100644 --- a/wgpu/src/window.rs +++ b/wgpu/src/window.rs @@ -7,7 +7,7 @@ pub mod compositor; not(target_os = "redox") ))] mod wayland; -#[cfg(all(unix, feature = "x11", not(target_os = "macos"), not(target_os = "redox")))] +#[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))] mod x11; pub use compositor::Compositor; diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index a7009d14..833a642e 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -16,8 +16,9 @@ use crate::{Engine, Renderer}; not(target_os = "redox") ))] use super::wayland::get_wayland_device_ids; -#[cfg(all(unix, feature = "x11", not(target_os = "macos"), not(target_os = "redox")))] +#[cfg(all(unix, 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 { @@ -71,10 +72,8 @@ impl Compositor { not(target_os = "redox") ))] let ids = compatible_window.as_ref().and_then(|window| { - let w = get_wayland_device_ids(window); - #[cfg(feature = "x11")] - let w = w.or_else(|| get_x11_device_ids(window)); - w + get_wayland_device_ids(window) + .or_else(|| get_x11_device_ids(window)) }); // HACK: @@ -138,6 +137,12 @@ impl Compositor { .clone() .and_then(|window| instance.create_surface(window).ok()); + let mut adapter_options = wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::from_env() + .unwrap_or(wgpu::PowerPreference::HighPerformance), + compatible_surface: compatible_surface.as_ref(), + force_fallback_adapter: false, + }; let mut adapter = None; #[cfg_attr(not(unix), allow(dead_code))] if std::env::var_os("WGPU_ADAPTER_NAME").is_none() { @@ -199,7 +204,7 @@ impl Compositor { .await; compatible_surface = compatible_window .and_then(|window| instance.create_surface(window).ok()); - let adapter_options = wgpu::RequestAdapterOptions { + adapter_options = wgpu::RequestAdapterOptions { power_preference: wgpu::PowerPreference::from_env() .unwrap_or(wgpu::PowerPreference::HighPerformance), compatible_surface: compatible_surface.as_ref(), diff --git a/widget/src/button.rs b/widget/src/button.rs index ed7f6ea9..f137221e 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -599,7 +599,7 @@ where (x + width) as f64, (y + height) as f64, ); - let _is_hovered = state.state.downcast_ref::().is_hovered; + let is_hovered = state.state.downcast_ref::().is_hovered; let mut node = Node::new(Role::Button); node.add_action(Action::Focus); diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index 83960569..873a4541 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -536,7 +536,7 @@ where }; let bounds = layout.bounds(); - let _is_hovered = cursor.is_over(bounds); + let is_hovered = cursor.is_over(bounds); let Rectangle { x, y, diff --git a/widget/src/container.rs b/widget/src/container.rs index a264007a..c9a300c9 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -35,7 +35,7 @@ use crate::core::{ color, }; -use iced_runtime::{Task, task}; +use iced_runtime::{Action, Task, task}; /// A widget that aligns its contents inside of its boundaries. /// @@ -601,7 +601,7 @@ pub fn visible_bounds(id: Id) -> Task> { operate: &mut dyn FnMut(&mut dyn Operation>), ) { self.depth += 1; - operate(self); + self.traverse(operate); self.depth -= 1; } diff --git a/widget/src/image.rs b/widget/src/image.rs index d726eeec..4315709a 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -293,8 +293,8 @@ fn drawing_bounds( content_fit: ContentFit, rotation: Rotation, scale: f32, - _opacity: f32, - _border_radius: [f32; 4], + opacity: f32, + border_radius: [f32; 4], ) -> Rectangle where Renderer: image::Renderer, diff --git a/widget/src/keyed/column.rs b/widget/src/keyed/column.rs index f3e33142..baaee5c9 100644 --- a/widget/src/keyed/column.rs +++ b/widget/src/keyed/column.rs @@ -1,6 +1,7 @@ //! Keyed columns distribute content vertically while keeping continuity. //! Distribute content vertically. +use crate::core::event; use crate::core::layout; use crate::core::mouse; use crate::core::overlay; diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs index b4db46a5..7a1f8506 100644 --- a/widget/src/lazy.rs +++ b/widget/src/lazy.rs @@ -5,6 +5,7 @@ pub mod component; #[allow(deprecated)] pub use component::Component; +use iced_renderer::core::widget::Operation; mod cache; @@ -14,7 +15,7 @@ use crate::core::mouse; use crate::core::overlay; use crate::core::renderer; use crate::core::widget::tree::{self, Tree}; -use crate::core::widget::Widget; +use crate::core::widget::{self, Widget}; use crate::core::{ self, Clipboard, Event, Length, Rectangle, Shell, Size, Vector, }; diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs index b3c51f37..a810e117 100644 --- a/widget/src/lazy/component.rs +++ b/widget/src/lazy/component.rs @@ -10,6 +10,7 @@ use crate::core::{ self, Clipboard, Element, Length, Rectangle, Shell, Size, Vector, Widget, }; +use iced_renderer::core::widget::Operation; use ouroboros::self_referencing; use std::cell::RefCell; use std::marker::PhantomData; @@ -526,11 +527,11 @@ where renderer: &Renderer, dnd_rectangles: &mut core::clipboard::DndDestinationRectangles, ) { - let tree = tree + let mut tree = tree .state .downcast_ref::>>>() .borrow_mut(); - let tree = tree.as_ref().unwrap(); + let mut tree = tree.as_ref().unwrap(); self.with_element(|element| { element.as_widget().drag_destinations( &tree.children[0], diff --git a/widget/src/list.rs b/widget/src/list.rs index d0d501d2..de9fe9b8 100644 --- a/widget/src/list.rs +++ b/widget/src/list.rs @@ -1,5 +1,5 @@ #![allow(missing_docs)] -use crate::core::event::Event; +use crate::core::event::{self, Event}; use crate::core::layout; use crate::core::mouse; use crate::core::overlay; @@ -366,7 +366,7 @@ where self.visible_elements .iter_mut() .zip(&mut state.visible_layouts) - .for_each(|(element, (index, layout, tree))| { + .map(|(element, (index, layout, tree))| { element.as_widget_mut().update( tree, event, diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 4d808348..3d355c52 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -2,6 +2,7 @@ use iced_renderer::core::mouse::Click; +use crate::core::event; use crate::core::layout; use crate::core::mouse; use crate::core::overlay; diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index e7c4dc23..94d2b6ad 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -575,7 +575,7 @@ where align_x: text::Alignment::Default, align_y: alignment::Vertical::Center, shaping: self.text_shaping, - wrapping: self.text_wrap, + wrapping: text::Wrapping::default(), ellipsize: text::Ellipsize::default(), }, Point::new(bounds.x + self.padding.left, bounds.center_y()), diff --git a/widget/src/pane_grid/content.rs b/widget/src/pane_grid/content.rs index 4c41e3a6..a76010e7 100644 --- a/widget/src/pane_grid/content.rs +++ b/widget/src/pane_grid/content.rs @@ -6,7 +6,7 @@ use crate::core::renderer; use crate::core::widget::{self, Tree}; use crate::core::{ self, Clipboard, Element, Event, Layout, Point, Rectangle, Shell, Size, - Vector, + Vector, event, }; use crate::pane_grid::{Draggable, TitleBar}; diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs index b14e1413..e005a7b8 100644 --- a/widget/src/scrollable.rs +++ b/widget/src/scrollable.rs @@ -27,6 +27,7 @@ use iced_runtime::core::widget::Id; #[cfg(feature = "a11y")] use std::borrow::Cow; +use crate::core::event; use crate::core::keyboard; use crate::core::layout; use crate::core::mouse; @@ -932,7 +933,7 @@ where let had_input_method = shell.input_method().is_enabled(); - let c_event = match event.clone() { + let mut c_event = match event.clone() { Event::Dnd(dnd::DndEvent::Offer( id, dnd::OfferEvent::Enter { @@ -1585,7 +1586,7 @@ where return A11yTree::default(); } let window = layout.bounds(); - let _is_hovered = cursor.is_over(window); + let is_hovered = cursor.is_over(window); let Rectangle { x, y, @@ -1669,7 +1670,7 @@ where })) { let scrollbar_bounds = scrollbar.total_bounds; - let _is_hovered = cursor.is_over(scrollbar_bounds); + let is_hovered = cursor.is_over(scrollbar_bounds); let Rectangle { x, y, diff --git a/widget/src/slider.rs b/widget/src/slider.rs index 9516f55c..ff32f417 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -695,7 +695,7 @@ where }; let bounds = layout.bounds(); - let _is_hovered = cursor.is_over(bounds); + let is_hovered = cursor.is_over(bounds); let Rectangle { x, y, @@ -732,14 +732,18 @@ where node.set_labelled_by(label.clone()); } - let Ok(min) = self.range.start().clone().try_into(); - node.set_min_numeric_value(min); - let Ok(max) = self.range.end().clone().try_into(); - node.set_max_numeric_value(max); - let Ok(value) = self.value.clone().try_into(); - node.set_numeric_value(value); - let Ok(step) = self.step.clone().try_into(); - node.set_numeric_value_step(step); + if let Ok(min) = self.range.start().clone().try_into() { + node.set_min_numeric_value(min); + } + if let Ok(max) = self.range.end().clone().try_into() { + node.set_max_numeric_value(max); + } + if let Ok(value) = self.value.clone().try_into() { + node.set_numeric_value(value); + } + if let Ok(step) = self.step.clone().try_into() { + node.set_numeric_value_step(step); + } // TODO: This could be a setting on the slider node.set_live(iced_accessibility::accesskit::Live::Polite); diff --git a/widget/src/stack.rs b/widget/src/stack.rs index cd30a886..e85bf2af 100644 --- a/widget/src/stack.rs +++ b/widget/src/stack.rs @@ -1,5 +1,6 @@ //! Display content on top of other content. +use crate::core::event; use crate::core::layout; use crate::core::mouse; use crate::core::overlay; diff --git a/widget/src/svg.rs b/widget/src/svg.rs index 61b1e688..277af3eb 100644 --- a/widget/src/svg.rs +++ b/widget/src/svg.rs @@ -31,6 +31,7 @@ use crate::core::{ #[cfg(feature = "a11y")] use std::borrow::Cow; +use std::marker::PhantomData; use std::path::PathBuf; pub use crate::core::svg::Handle; diff --git a/widget/src/themer.rs b/widget/src/themer.rs index 76448ae1..306c8580 100644 --- a/widget/src/themer.rs +++ b/widget/src/themer.rs @@ -1,5 +1,6 @@ use crate::container; +use crate::core::event; use crate::core::layout; use crate::core::mouse; use crate::core::overlay; diff --git a/widget/src/toggler.rs b/widget/src/toggler.rs index 43ba6930..d398a79b 100644 --- a/widget/src/toggler.rs +++ b/widget/src/toggler.rs @@ -37,6 +37,7 @@ use std::borrow::Cow; use iced_runtime::core::border::Radius; use crate::core::alignment; +use crate::core::border; use crate::core::layout; use crate::core::mouse; use crate::core::renderer; @@ -508,7 +509,7 @@ where let space = style.handle_margin; - let _toggler_background_bounds = Rectangle { + let toggler_background_bounds = Rectangle { x: bounds.x, y: bounds.y, width: bounds.width, @@ -528,7 +529,7 @@ where style.background, ); - let _padding = (style.padding_ratio * bounds.height).round(); + let padding = (style.padding_ratio * bounds.height).round(); let toggler_foreground_bounds = Rectangle { x: bounds.x + if self.is_toggled { @@ -569,7 +570,7 @@ where }; let bounds = layout.bounds(); - let _is_hovered = cursor.is_over(bounds); + let is_hovered = cursor.is_over(bounds); let Rectangle { x, y, diff --git a/winit/src/a11y.rs b/winit/src/a11y.rs index 8f6cf27b..a901b480 100644 --- a/winit/src/a11y.rs +++ b/winit/src/a11y.rs @@ -4,10 +4,11 @@ use crate::futures::futures::channel::mpsc; use iced_accessibility::accesskit::{ ActivationHandler, Node, NodeId, Role, Tree, TreeId, TreeUpdate, }; +use iced_accessibility::accesskit_winit::Adapter; use iced_runtime::core; pub struct WinitActivationHandler { - pub(crate) proxy: mpsc::UnboundedSender, + pub proxy: mpsc::UnboundedSender, pub title: String, } @@ -33,7 +34,7 @@ impl ActivationHandler for WinitActivationHandler { pub struct WinitActionHandler { pub id: core::window::Id, - pub(crate) proxy: mpsc::UnboundedSender, + pub proxy: mpsc::UnboundedSender, } impl iced_accessibility::accesskit::ActionHandler for WinitActionHandler { @@ -48,7 +49,7 @@ impl iced_accessibility::accesskit::ActionHandler for WinitActionHandler { } pub struct WinitDeactivationHandler { - pub(crate) proxy: mpsc::UnboundedSender, + pub proxy: mpsc::UnboundedSender, } impl iced_accessibility::accesskit::DeactivationHandler diff --git a/winit/src/application/drag_resize.rs b/winit/src/application/drag_resize.rs index 5e524736..6d575b52 100644 --- a/winit/src/application/drag_resize.rs +++ b/winit/src/application/drag_resize.rs @@ -25,7 +25,7 @@ const DRAG_RESIZE_SUPPORTED: bool = false; /// If supported by winit, returns a closure that implements cursor resize support. pub fn event_func( - _window: &dyn winit::window::Window, + window: &dyn winit::window::Window, border_size: f64, ) -> Option< Box< diff --git a/winit/src/clipboard.rs b/winit/src/clipboard.rs index da83d37a..d302ac36 100644 --- a/winit/src/clipboard.rs +++ b/winit/src/clipboard.rs @@ -1,7 +1,7 @@ //! Access the clipboard. use std::sync::Mutex; -use std::borrow::Cow; +use std::{any::Any, borrow::Cow}; use crate::Control; diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index ff167722..cc5676b5 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -3,6 +3,9 @@ //! [`winit`]: https://github.com/rust-windowing/winit //! [`iced_runtime`]: https://github.com/iced-rs/iced/tree/0.14/runtime use crate::core::input_method; +use std::hash::DefaultHasher; +use std::hash::Hash; +use std::hash::Hasher; use std::sync::Arc; use crate::core::keyboard; @@ -11,6 +14,7 @@ use crate::core::theme; use crate::core::touch; use crate::core::window; use crate::core::{Event, Point, Size}; +use iced_futures::core::event::PlatformSpecific; use winit::dpi::PhysicalPosition; use winit::event::ButtonSource; use winit::event::ElementState; @@ -23,7 +27,7 @@ use winit::keyboard::SmolStr; pub fn window_attributes( settings: window::Settings, title: &str, - _scale_factor: f64, + scale_factor: f64, primary_monitor: Option, _id: Option, ) -> winit::window::WindowAttributes { @@ -392,8 +396,8 @@ pub fn window_event( Ime::Commit(content) => input_method::Event::Commit(content), Ime::Disabled => input_method::Event::Closed, Ime::DeleteSurrounding { - before_bytes: _, - after_bytes: _, + before_bytes, + after_bytes, } => todo!(), })), WindowEvent::Focused(focused) => Some(Event::Window(if focused { @@ -407,7 +411,7 @@ pub fn window_event( WindowEvent::DragDropped { paths, .. } => { Some(Event::Window(window::Event::FileDropped(paths.clone()))) } - WindowEvent::DragLeft { position: _ } => { + WindowEvent::DragLeft { position } => { Some(Event::Window(window::Event::FilesHoveredLeft)) } @@ -638,6 +642,10 @@ pub fn mouse_interaction( Interaction::AllScroll => winit_core::cursor::CursorIcon::AllScroll, Interaction::ZoomIn => winit_core::cursor::CursorIcon::ZoomIn, Interaction::ZoomOut => winit_core::cursor::CursorIcon::ZoomOut, + Interaction::Cell => winit_core::cursor::CursorIcon::Cell, + Interaction::Move => winit_core::cursor::CursorIcon::Move, + Interaction::Copy => winit_core::cursor::CursorIcon::Copy, + Interaction::Help => winit_core::cursor::CursorIcon::Help, Interaction::Hidden => { return None; } @@ -696,10 +704,10 @@ enum TouchInternal { /// /// [`winit`]: https://github.com/rust-windowing/winit /// [`iced`]: https://github.com/iced-rs/iced/tree/0.12 -fn touch_event( +pub fn touch_event( finger: FingerId, state: TouchInternal, - _force: Option, + force: Option, position: Option>, scale_factor: f64, ) -> touch::Event { @@ -1073,7 +1081,6 @@ pub fn physical_key( /// /// [`winit`]: https://github.com/rust-windowing/winit /// [`iced`]: https://github.com/iced-rs/iced/tree/0.12 -#[allow(deprecated)] // KeyCode::Super/Hyper/Turbo: legacy spec, no Meta variant in this enum pub fn key_code( key_code: winit::keyboard::KeyCode, ) -> Option { @@ -1278,7 +1285,6 @@ pub fn key_code( }) } -#[allow(deprecated)] // KeyCode::Super/Hyper/Turbo: legacy spec, no Meta variant in this enum pub fn winit_key_code( key_code: keyboard::key::Code, ) -> Option { @@ -1589,10 +1595,7 @@ pub fn resize_direction( } } -// Fields are passed through to winit via `IconProvider: AsAny` for potential -// downcast; they are not read directly here. #[derive(Debug)] -#[allow(dead_code)] pub struct RawImage(Vec, Size); impl IconProvider for RawImage {} impl From for winit_core::icon::Icon { diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 9bc2db96..735d73aa 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -53,6 +53,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; @@ -157,8 +158,7 @@ where let (boot_sender, boot_receiver) = oneshot::channel(); let (control_sender, control_receiver) = mpsc::unbounded(); - // Sender side currently not wired to a producer; receiver gets default. - let (_system_theme_sender, system_theme_receiver) = oneshot::channel(); + let (system_theme_sender, system_theme_receiver) = oneshot::channel(); let instance = Box::pin(run_instance::

( program, @@ -179,6 +179,9 @@ where struct BootConfig { sender: oneshot::Sender<()>, + fonts: Vec>, + graphics_settings: graphics::Settings, + is_wayland: bool, } struct Runner { instance: std::pin::Pin>, @@ -188,9 +191,9 @@ where sender: mpsc::UnboundedSender>, receiver: mpsc::UnboundedReceiver, error: Option, - #[cfg(feature = "a11y")] + system_theme: Option>, control_sender: mpsc::UnboundedSender, - + #[cfg(feature = "a11y")] adapters: std::collections::HashMap, @@ -205,13 +208,16 @@ where context, boot: Some(BootConfig { sender: boot_sender, + fonts: settings.fonts, + graphics_settings, + is_wayland, }), id: settings.id, sender: event_sender, receiver: control_receiver, - #[cfg(feature = "a11y")] control_sender: control_sender.clone(), error: None, + system_theme: Some(system_theme_sender), #[cfg(feature = "a11y")] adapters: Default::default(), @@ -314,7 +320,12 @@ where event_loop: &dyn winit::event_loop::ActiveEventLoop, ) { // create initial window - let Some(BootConfig { sender }) = self.boot.take() + let Some(BootConfig { + sender, + fonts, + graphics_settings, + is_wayland, + }) = self.boot.take() else { return; }; @@ -352,8 +363,6 @@ where where F: Future, { - // TODO(yoda): migrate try_next → try_recv (futures-channel API change). - #[allow(deprecated)] fn process_event( &mut self, event_loop: &dyn winit::event_loop::ActiveEventLoop, @@ -627,7 +636,10 @@ where #[cfg(feature = "a11y")] fn init_adapter(&mut self, event_loop: &(dyn winit::event_loop::ActiveEventLoop + 'static), id: core::window::Id, window: Arc) { use crate::a11y::*; - + use iced_accessibility::accesskit::{ + ActivationHandler, Node, NodeId, Role, + Tree, TreeUpdate, + }; use iced_accessibility::accesskit_winit::Adapter; let node_id = @@ -681,7 +693,6 @@ where } } -#[allow(hidden_glob_reexports)] // intentional: internal Event shadows winit::event::Event from `pub use winit` enum Event { WindowCreated { id: window::Id, @@ -789,6 +800,9 @@ async fn run_instance

( > = None; let mut dnd_surface_id: Option = None; + #[cfg(feature = "a11y")] + let mut a11y_enabled = false; + #[cfg(all(feature = "linux-theme-detection", target_os = "linux"))] let mut system_theme = { let to_mode = |color_scheme| match color_scheme { @@ -1381,6 +1395,7 @@ async fn run_instance

( } let mut uis_stale = false; + let mut resized = false; for (id, window) in window_manager.iter_mut() { if skip && !window.resize_enabled { continue; @@ -1433,6 +1448,7 @@ async fn run_instance

( // FIXME what to do when we are stuck in a configure event/resize request loop // We don't have control over how winit handles this. window.resize_enabled = true; + resized = true; needs_redraw = true; let s = winit::dpi::Size::Logical( requested_size.cast(), @@ -1647,8 +1663,8 @@ async fn run_instance

( events.push((Some(id), conversion::a11y(action_request))); } #[cfg(feature = "a11y")] - Event::AccessibilityEnabled(_enabled) => { - // a11y enable signal currently unused at this layer + Event::AccessibilityEnabled(enabled) => { + a11y_enabled = enabled; } Event::PlatformSpecific(e) => { crate::platform_specific::handle_event( diff --git a/winit/src/platform_specific/mod.rs b/winit/src/platform_specific/mod.rs index 357fb1ec..9b74ee9c 100644 --- a/winit/src/platform_specific/mod.rs +++ b/winit/src/platform_specific/mod.rs @@ -1,11 +1,14 @@ //! 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, + core::{Vector, window}, + platform_specific, user_interface, }; use winit::raw_window_handle::HasWindowHandle; @@ -14,6 +17,8 @@ pub mod wayland; #[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}; @@ -148,12 +153,9 @@ impl PlatformSpecific { ) -> Option> { #[cfg(all(feature = "cctk", target_os = "linux"))] { - self.wayland.create_surface() - } - #[cfg(not(all(feature = "cctk", target_os = "linux")))] - { - None + return self.wayland.create_surface(); } + None } pub(crate) fn update_surface_shm( diff --git a/winit/src/platform_specific/wayland/event_loop/control_flow.rs b/winit/src/platform_specific/wayland/event_loop/control_flow.rs new file mode 100644 index 00000000..bc920ed4 --- /dev/null +++ b/winit/src/platform_specific/wayland/event_loop/control_flow.rs @@ -0,0 +1,56 @@ +/// Set by the user callback given to the [`EventLoop::run`] method. +/// +/// Indicates the desired behavior of the event loop after [`Event::RedrawEventsCleared`] is emitted. +/// +/// Defaults to [`Poll`]. +/// +/// ## Persistency +/// +/// Almost every change is persistent between multiple calls to the event loop closure within a +/// given run loop. The only exception to this is [`ExitWithCode`] which, once set, cannot be unset. +/// Changes are **not** persistent between multiple calls to `run_return` - issuing a new call will +/// reset the control flow to [`Poll`]. +/// +/// [`ExitWithCode`]: Self::ExitWithCode +/// [`Poll`]: Self::Poll +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum ControlFlow { + /// When the current loop iteration finishes, immediately begin a new iteration regardless of + /// whether or not new events are available to process. + /// + /// ## Platform-specific + /// + /// - **Web:** Events are queued and usually sent when `requestAnimationFrame` fires but sometimes + /// the events in the queue may be sent before the next `requestAnimationFrame` callback, for + /// example when the scaling of the page has changed. This should be treated as an implementation + /// detail which should not be relied on. + Poll, + /// When the current loop iteration finishes, suspend the thread until another event arrives. + Wait, + /// When the current loop iteration finishes, suspend the thread until either another event + /// arrives or the given time is reached. + /// + /// Useful for implementing efficient timers. Applications which want to render at the display's + /// native refresh rate should instead use [`Poll`] and the VSync functionality of a graphics API + /// to reduce odds of missed frames. + /// + /// [`Poll`]: Self::Poll + WaitUntil(std::time::Instant), + /// Send a [`LoopDestroyed`] event and stop the event loop. This variant is *sticky* - once set, + /// `control_flow` cannot be changed from `ExitWithCode`, and any future attempts to do so will + /// result in the `control_flow` parameter being reset to `ExitWithCode`. + /// + /// The contained number will be used as exit code. The [`Exit`] constant is a shortcut for this + /// with exit code 0. + /// + /// ## Platform-specific + /// + /// - **Android / iOS / WASM:** The supplied exit code is unused. + /// - **Unix:** On most Unix-like platforms, only the 8 least significant bits will be used, + /// which can cause surprises with negative exit values (`-42` would end up as `214`). See + /// [`std::process::exit`]. + /// + /// [`LoopDestroyed`]: Event::LoopDestroyed + /// [`Exit`]: ControlFlow::Exit + ExitWithCode(i32), +} diff --git a/winit/src/platform_specific/wayland/event_loop/mod.rs b/winit/src/platform_specific/wayland/event_loop/mod.rs index 86d9f7da..976595a7 100644 --- a/winit/src/platform_specific/wayland/event_loop/mod.rs +++ b/winit/src/platform_specific/wayland/event_loop/mod.rs @@ -1,5 +1,9 @@ +pub mod control_flow; +pub mod proxy; pub mod state; +#[cfg(feature = "a11y")] +use crate::platform_specific::SurfaceIdWrapper; use crate::{ Control, futures::futures::channel::mpsc, @@ -29,7 +33,7 @@ use cctk::{ reexports::{ calloop::{self, EventLoop}, client::{ - Connection, Proxy, globals::registry_queue_init, + ConnectError, Connection, Proxy, globals::registry_queue_init, }, }, registry::RegistryState, @@ -42,6 +46,8 @@ use cctk::{ }; use raw_window_handle::HasDisplayHandle; use state::{FrameStatus, SctkWindow, send_event}; +#[cfg(feature = "a11y")] +use std::sync::{Arc, Mutex}; use std::{ collections::{HashMap, HashSet}, fmt::Debug, @@ -65,8 +71,8 @@ pub struct SctkEventLoop { pub(crate) state: SctkState, } -#[allow(dead_code)] // payloads kept for Debug; not inspected programmatically pub enum Error { + Connect(ConnectError), Calloop(calloop::Error), Global(GlobalError), NoDisplayHandle, diff --git a/winit/src/platform_specific/wayland/event_loop/proxy.rs b/winit/src/platform_specific/wayland/event_loop/proxy.rs new file mode 100644 index 00000000..bdbc44a4 --- /dev/null +++ b/winit/src/platform_specific/wayland/event_loop/proxy.rs @@ -0,0 +1,66 @@ +use cctk::sctk::reexports::calloop; +use iced_futures::futures::{ + channel::mpsc, + task::{Context, Poll}, + Sink, +}; +use std::pin::Pin; + +/// An event loop proxy that implements `Sink`. +#[derive(Debug)] +pub struct Proxy { + raw: calloop::channel::Sender, +} + +impl Clone for Proxy { + fn clone(&self) -> Self { + Self { + raw: self.raw.clone(), + } + } +} + +impl Proxy { + /// Creates a new [`Proxy`] from an `EventLoopProxy`. + pub fn new(raw: calloop::channel::Sender) -> Self { + Self { raw } + } + /// send an event + pub fn send_event(&self, message: Message) { + let _ = self.raw.send(message); + } +} + +impl Sink for Proxy { + type Error = mpsc::SendError; + + fn poll_ready( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + + fn start_send( + self: Pin<&mut Self>, + message: Message, + ) -> Result<(), Self::Error> { + let _ = self.raw.send(message); + + Ok(()) + } + + fn poll_flush( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + + fn poll_close( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } +} diff --git a/winit/src/platform_specific/wayland/event_loop/state.rs b/winit/src/platform_specific/wayland/event_loop/state.rs index 379225f6..f99e48ba 100644 --- a/winit/src/platform_specific/wayland/event_loop/state.rs +++ b/winit/src/platform_specific/wayland/event_loop/state.rs @@ -30,11 +30,12 @@ use std::{ convert::Infallible, fmt::Debug, sync::{Arc, Mutex, atomic::AtomicU32}, + thread::panicking, time::Duration, }; use wayland_backend::client::ObjectId; use winit::{ - dpi::LogicalSize, + dpi::{LogicalPosition, LogicalSize}, platform::wayland::WindowExtWayland, }; @@ -50,6 +51,7 @@ use cctk::{ activation::{ActivationState, RequestData}, compositor::CompositorState, error::GlobalError, + globals::GlobalData, output::OutputState, reexports::{ calloop::{LoopHandle, timer::TimeoutAction}, @@ -231,6 +233,9 @@ impl CommonSurface { #[derive(Debug, Clone)] pub struct Common { pub(crate) fractional_scale: Option, + pub(crate) has_focus: bool, + pub(crate) ime_pos: LogicalPosition, + pub(crate) ime_size: LogicalSize, pub(crate) size: LogicalSize, pub(crate) requested_size: (Option, Option), pub(crate) wp_viewport: Option, @@ -240,6 +245,9 @@ impl Default for Common { fn default() -> Self { Self { fractional_scale: Default::default(), + has_focus: Default::default(), + ime_pos: Default::default(), + ime_size: Default::default(), size: LogicalSize::new(1, 1), requested_size: (None, None), wp_viewport: None, @@ -332,6 +340,7 @@ pub struct SctkPopupData { pub(crate) parent: PopupParent, pub(crate) toplevel: WlSurface, pub(crate) positioner: Arc, + pub(crate) grab: bool, } #[derive(Debug)] @@ -872,6 +881,7 @@ impl SctkState { parent: parent.clone(), toplevel: toplevel.clone(), positioner: positioner.clone(), + grab: settings.grab, }, last_configure: None, _pending_requests: Default::default(), @@ -1256,7 +1266,7 @@ impl SctkState { let timer = cctk::sctk::reexports::calloop::timer::Timer::from_duration(Duration::from_millis(30)); let queue_handle = self.queue_handle.clone(); _ = self.loop_handle.insert_source(timer, move |_, _, state| { - let Some((popup, attempt)) = state.pending_popup.take() else { + let Some((mut popup, attempt)) = state.pending_popup.take() else { return TimeoutAction::Drop; }; @@ -1531,6 +1541,7 @@ impl SctkState { SctkEvent::SubsurfaceEvent (crate::sctk_event::SubsurfaceEventVariant::Created{ parent_id, parent, + surface: subsurface, qh: self.queue_handle.clone(), common_surface, surface_id: subsurface_settings.id, diff --git a/winit/src/platform_specific/wayland/handlers/activation.rs b/winit/src/platform_specific/wayland/handlers/activation.rs index ed5f2259..6b03a8dd 100644 --- a/winit/src/platform_specific/wayland/handlers/activation.rs +++ b/winit/src/platform_specific/wayland/handlers/activation.rs @@ -3,6 +3,7 @@ use cctk::sctk::{ delegate_activation, reexports::client::protocol::{wl_seat::WlSeat, wl_surface::WlSurface}, }; +use iced_futures::futures::channel::oneshot::Sender; use crate::platform_specific::wayland::event_loop::state::SctkState; diff --git a/winit/src/platform_specific/wayland/handlers/seat/seat.rs b/winit/src/platform_specific/wayland/handlers/seat/seat.rs index b0fe43f4..2901ce8e 100644 --- a/winit/src/platform_specific/wayland/handlers/seat/seat.rs +++ b/winit/src/platform_specific/wayland/handlers/seat/seat.rs @@ -18,7 +18,7 @@ impl SeatHandler for SctkState { fn new_seat( &mut self, _conn: &cctk::sctk::reexports::client::Connection, - _qh: &cctk::sctk::reexports::client::QueueHandle, + qh: &cctk::sctk::reexports::client::QueueHandle, seat: cctk::sctk::reexports::client::protocol::wl_seat::WlSeat, ) { self.sctk_events.push(SctkEvent::SeatEvent { diff --git a/winit/src/platform_specific/wayland/handlers/shell/corner_radius.rs b/winit/src/platform_specific/wayland/handlers/shell/corner_radius.rs index 67439671..bd7d2409 100644 --- a/winit/src/platform_specific/wayland/handlers/shell/corner_radius.rs +++ b/winit/src/platform_specific/wayland/handlers/shell/corner_radius.rs @@ -1,13 +1,17 @@ -use cctk::{sctk, cosmic_protocols::corner_radius::v1::client::{ +use cctk::{sctk, cosmic_protocols::{ + corner_radius::v1::client::{ cosmic_corner_radius_manager_v1::CosmicCornerRadiusManagerV1, cosmic_corner_radius_toplevel_v1::CosmicCornerRadiusToplevelV1, - }}; + }, + overlap_notify::v1::client::zcosmic_overlap_notification_v1::ZcosmicOverlapNotificationV1, +}}; use sctk::reexports::{ client::{Connection, Dispatch, Proxy}, }; use crate::event_loop::state::SctkState; +use crate::platform_specific::wayland::SctkEvent; impl Dispatch for SctkState { fn event( @@ -27,7 +31,7 @@ impl > for SctkState { fn event( - _state: &mut Self, + state: &mut Self, _proxy: &CosmicCornerRadiusToplevelV1, event: ::Event, _data: &(), diff --git a/winit/src/platform_specific/wayland/mod.rs b/winit/src/platform_specific/wayland/mod.rs index e613e3b4..9b3a7ec0 100644 --- a/winit/src/platform_specific/wayland/mod.rs +++ b/winit/src/platform_specific/wayland/mod.rs @@ -16,9 +16,10 @@ use cctk::sctk::reexports::client::protocol::wl_surface::WlSurface; use cctk::sctk::seat::keyboard::Modifiers; use cursor_icon::CursorIcon; use iced_futures::futures::channel::mpsc; -use iced_graphics::compositor; +use iced_graphics::{Compositor, compositor}; use iced_runtime::core::{Vector, window}; -use raw_window_handle::{HasDisplayHandle, HasWindowHandle, RawWindowHandle}; +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; +use raw_window_handle::{HasRawDisplayHandle, RawWindowHandle}; use sctk_event::SctkEvent; use std::{collections::HashMap, sync::Arc}; use subsurface_widget::{SubsurfaceInstance, SubsurfaceState}; @@ -105,7 +106,7 @@ impl PlatformSpecific { display: OwnedDisplayHandle, ) -> Self { self.wayland.winit_event_sender = Some(tx); - self.wayland.conn = match display.display_handle().map(|h| h.as_raw()) { + self.wayland.conn = match display.raw_display_handle() { Ok(raw_window_handle::RawDisplayHandle::Wayland( wayland_display_handle, )) => { @@ -188,12 +189,12 @@ impl WaylandSpecific { winit_event_sender, proxy, sender, - display_handle: _, - conn: _, + display_handle, + conn, surface_ids, modifiers, subsurface_state, - surface_subsurfaces: _, + surface_subsurfaces, } = self; match e { @@ -236,7 +237,7 @@ impl WaylandSpecific { &mut self, keep: F, ) { - self.surface_subsurfaces.retain(|k, _v| keep(*k)) + self.surface_subsurfaces.retain(|k, v| keep(*k)) } pub(crate) fn clear_subsurface_list(&mut self) { @@ -249,7 +250,7 @@ impl WaylandSpecific { wl_surface: &WlSurface, ) { let subsurfaces = crate::subsurface_widget::take_subsurfaces(); - let entry = self.surface_subsurfaces.entry(id); + let mut entry = self.surface_subsurfaces.entry(id); let surface_subsurfaces = entry.or_default(); let Some(subsurface_state) = self.subsurface_state.as_mut() else { return; diff --git a/winit/src/platform_specific/wayland/sctk_event.rs b/winit/src/platform_specific/wayland/sctk_event.rs index 04d3d6b1..8845b0c9 100755 --- a/winit/src/platform_specific/wayland/sctk_event.rs +++ b/winit/src/platform_specific/wayland/sctk_event.rs @@ -4,7 +4,7 @@ use crate::{ SurfaceIdWrapper, UserInterfaces, wayland::{ conversion::{ - modifiers_to_native, + modifiers_to_native, pointer_axis_to_native, pointer_button_to_native, }, keymap::{self, keysym_to_key}, @@ -25,9 +25,10 @@ use iced_futures::{ }, }, }, + event, futures::{SinkExt, channel::mpsc}, }; -use iced_graphics::compositor; +use iced_graphics::{Compositor, compositor}; use iced_runtime::{ core::{ Point, @@ -39,7 +40,9 @@ use iced_runtime::{ user_interface, }; -use cctk::sctk::{ +use cctk::{ + cosmic_protocols::overlap_notify::v1::client::zcosmic_overlap_notification_v1, + sctk::{ output::OutputInfo, reexports::{ calloop::channel, @@ -64,8 +67,11 @@ use cctk::sctk::{ wlr_layer::{Layer, LayerSurfaceConfigure}, xdg::{popup::PopupConfigure, window::WindowConfigure}, }, - }; + }, + wayland_client::protocol::wl_subsurface::WlSubsurface, +}; use std::{ + any::Any, collections::HashMap, num::NonZeroU32, sync::{Arc, Mutex}, @@ -282,6 +288,7 @@ pub enum SubsurfaceEventVariant { Created { parent_id: window::Id, parent: WlSurface, + surface: WlSurface, qh: QueueHandle, common_surface: CommonSurface, surface_id: SurfaceId, @@ -509,7 +516,7 @@ impl SctkEvent { ), ), ), - SurfaceIdWrapper::Window(_id) => { + SurfaceIdWrapper::Window(id) => { Some(iced_runtime::core::Event::Window( window::Event::Unfocused, )) @@ -537,7 +544,7 @@ impl SctkEvent { ), ), ), - SurfaceIdWrapper::Subsurface(_id) => None, + SurfaceIdWrapper::Subsurface(id) => None, }) { events.push(( @@ -571,7 +578,7 @@ impl SctkEvent { ), ), ), - SurfaceIdWrapper::Window(_id) => { + SurfaceIdWrapper::Window(id) => { Some(iced_runtime::core::Event::Window( window::Event::Focused, )) @@ -1508,6 +1515,7 @@ impl SctkEvent { common, z, parent, + surface: _, qh, surface_id, display, diff --git a/winit/src/platform_specific/wayland/subsurface_widget.rs b/winit/src/platform_specific/wayland/subsurface_widget.rs index c09e2424..dbecc52d 100644 --- a/winit/src/platform_specific/wayland/subsurface_widget.rs +++ b/winit/src/platform_specific/wayland/subsurface_widget.rs @@ -57,7 +57,9 @@ use wayland_protocols::wp::{ }; use winit::window::WindowId; -use crate::platform_specific::event_loop::state::SctkState; +use crate::platform_specific::{ + SurfaceIdWrapper, event_loop::state::SctkState, +}; #[derive(Debug)] pub struct Plane { @@ -407,10 +409,7 @@ impl SubsurfaceState { .unwrap(); canvas[0..width as usize * height as usize * 4].copy_from_slice(data); surface.damage_buffer(0, 0, width as i32, height as i32); - if let Err(err) = buffer.attach_to(&surface) { - log::warn!("failed to attach shm buffer to subsurface: {err}"); - return; - } + buffer.attach_to(&surface); surface.offset(offset.x as i32, offset.y as i32); wp_viewport.set_destination( (width as f64 / scale) as i32, @@ -623,7 +622,7 @@ impl Drop for SubsurfaceState { } #[derive(Clone, Debug)] -pub struct SubsurfaceInstance { +pub(crate) struct SubsurfaceInstance { pub(crate) wl_surface: WlSurface, pub(crate) wl_subsurface: WlSubsurface, pub(crate) wp_viewport: WpViewport, diff --git a/winit/src/platform_specific/wayland/winit_window.rs b/winit/src/platform_specific/wayland/winit_window.rs index 75936cc6..b33b7f9e 100644 --- a/winit/src/platform_specific/wayland/winit_window.rs +++ b/winit/src/platform_specific/wayland/winit_window.rs @@ -1,9 +1,9 @@ use crate::platform_specific::wayland::Action; use cctk::sctk::reexports::{ - calloop::channel, + calloop::{LoopHandle, channel}, client::{ Proxy, QueueHandle, - protocol::wl_display::WlDisplay, + protocol::{wl_display::WlDisplay, wl_surface::WlSurface}, }, }; use raw_window_handle::HandleError; @@ -91,7 +91,7 @@ impl winit::window::Window for SctkWinitWindow { } } - fn set_cursor_visible(&self, _visible: bool) { + fn set_cursor_visible(&self, visible: bool) { // TODO } @@ -203,35 +203,35 @@ impl winit::window::Window for SctkWinitWindow { // TODO refer to winit for implementation } - fn set_outer_position(&self, _position: winit::dpi::Position) {} + fn set_outer_position(&self, position: winit::dpi::Position) {} fn outer_size(&self) -> winit::dpi::PhysicalSize { // XXX not applicable to wrapped surfaces Default::default() } - fn set_min_surface_size(&self, _min_size: Option) { + fn set_min_surface_size(&self, min_size: Option) { // XXX not applicable to wrapped surfaces } - fn set_max_surface_size(&self, _max_size: Option) { + fn set_max_surface_size(&self, max_size: Option) { // XXX not applicable to wrapped surfaces } fn set_surface_resize_increments( &self, - _increments: Option, + increments: Option, ) { log::warn!( "`set_surface_resize_increments` is not implemented for Wayland" ) } - fn set_title(&self, _title: &str) { + fn set_title(&self, title: &str) { // XXX not applicable to wrapped surfaces } - fn set_transparent(&self, _transparent: bool) { + fn set_transparent(&self, transparent: bool) { todo!() } @@ -304,19 +304,19 @@ impl winit::window::Window for SctkWinitWindow { )); } - fn set_visible(&self, _visible: bool) {} + fn set_visible(&self, visible: bool) {} fn is_visible(&self) -> Option { None } - fn set_resizable(&self, _resizable: bool) {} + fn set_resizable(&self, resizable: bool) {} fn is_resizable(&self) -> bool { false } - fn set_enabled_buttons(&self, _buttons: winit::window::WindowButtons) { + fn set_enabled_buttons(&self, buttons: winit::window::WindowButtons) { // TODO v5 of xdg_shell. } @@ -324,7 +324,7 @@ impl winit::window::Window for SctkWinitWindow { WindowButtons::all() } - fn set_minimized(&self, _minimized: bool) { + fn set_minimized(&self, minimized: bool) { // XXX not applicable to the wrapped surfaces } @@ -333,7 +333,7 @@ impl winit::window::Window for SctkWinitWindow { None } - fn set_maximized(&self, _maximized: bool) { + fn set_maximized(&self, maximized: bool) { // XXX can't minimize the wrapped surfaces } @@ -344,7 +344,7 @@ impl winit::window::Window for SctkWinitWindow { fn set_fullscreen( &self, - _fullscreen: Option, + fullscreen: Option, ) { // XXX can't fullscreen the wrapped surfaces } @@ -354,7 +354,7 @@ impl winit::window::Window for SctkWinitWindow { None } - fn set_decorations(&self, _decorations: bool) { + fn set_decorations(&self, decorations: bool) { // XXX no decorations supported for the wrapped surfaces } @@ -362,26 +362,26 @@ impl winit::window::Window for SctkWinitWindow { false } - fn set_window_level(&self, _level: winit::window::WindowLevel) {} + fn set_window_level(&self, level: winit::window::WindowLevel) {} - fn set_window_icon(&self, _window_icon: Option) {} + fn set_window_icon(&self, window_icon: Option) {} fn focus_window(&self) {} fn request_user_attention( &self, - _request_type: Option, + request_type: Option, ) { // XXX can't request attention on wrapped surfaces } - fn set_theme(&self, _theme: Option) {} + fn set_theme(&self, theme: Option) {} fn theme(&self) -> Option { None } - fn set_content_protected(&self, _protected: bool) {} + fn set_content_protected(&self, protected: bool) {} fn title(&self) -> String { String::new() @@ -434,14 +434,14 @@ impl winit::window::Window for SctkWinitWindow { fn set_cursor_position( &self, - _position: winit::dpi::Position, + position: winit::dpi::Position, ) -> Result<(), winit::error::RequestError> { todo!() } fn set_cursor_grab( &self, - _mode: winit::window::CursorGrabMode, + mode: winit::window::CursorGrabMode, ) -> Result<(), winit::error::RequestError> { todo!() } @@ -452,7 +452,7 @@ impl winit::window::Window for SctkWinitWindow { fn request_ime_update( &self, - _request: winit::window::ImeRequest, + request: winit::window::ImeRequest, ) -> Result<(), winit::window::ImeRequestError> { todo!() } diff --git a/winit/src/proxy.rs b/winit/src/proxy.rs index aabe15c3..a3e4e816 100644 --- a/winit/src/proxy.rs +++ b/winit/src/proxy.rs @@ -8,6 +8,7 @@ use crate::futures::futures::{ use crate::graphics::shell; use crate::runtime::Action; use crate::runtime::window; +use std::hash::DefaultHasher; use std::pin::Pin; /// An event loop proxy with backpressure that implements `Sink`. @@ -33,7 +34,7 @@ impl Proxy { const MAX_SIZE: usize = 100; /// Creates a new [`Proxy`] from an `EventLoopProxy`. - pub(crate) fn new( + pub fn new( raw: winit::event_loop::EventLoopProxy, event_sender: mpsc::UnboundedSender>, ) -> (Self, impl Future) { diff --git a/winit/src/window.rs b/winit/src/window.rs index ecb2107a..87d35a5a 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -14,7 +14,7 @@ use crate::core::text; use crate::core::theme::{self, Base}; use crate::core::time::Instant; use crate::core::{ - Color, InputMethod, Padding, Point, Rectangle, Size, Text, Vector, + Color, Element, InputMethod, Padding, Point, Rectangle, Size, Text, Vector, }; use crate::graphics::Compositor; use crate::program::{self, Program}; @@ -26,6 +26,10 @@ use winit::monitor::MonitorHandle; use std::collections::BTreeMap; use std::sync::Arc; +pub(crate) type ViewFn = Arc< + Box Option> + Send + Sync + 'static>, +>; + pub struct WindowManager where P: Program, @@ -321,10 +325,6 @@ where } } - // TODO(yoda): migrate to Window::request_ime_update(ImeRequest::*). - // Legacy set_ime_* still functional but deprecated; full migration - // requires ImeCapabilities + ImeRequestData reshape. - #[allow(deprecated)] fn enable_ime( &mut self, cursor: Rectangle, @@ -355,7 +355,6 @@ where } } - #[allow(deprecated)] // see TODO on enable_ime fn disable_ime(&mut self) { if self.ime_state.is_some() { self.raw.set_ime_allowed(false); diff --git a/winit/src/window/state.rs b/winit/src/window/state.rs index 1e16fc51..98fdf9ee 100644 --- a/winit/src/window/state.rs +++ b/winit/src/window/state.rs @@ -97,7 +97,6 @@ where self.ready = ready; } - #[cfg(feature = "a11y")] pub(crate) fn set_a11y_ready(&mut self, ready: bool) { self.a11y_ready = ready; }