diff --git a/Cargo.lock b/Cargo.lock index 542f3cfa..8082ce9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" [[package]] name = "ab_glyph" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe21446ad43aa56417a767f3e2f3d7c4ca522904de1dd640529a76e9c5c3b33c" +checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -63,9 +63,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" dependencies = [ "backtrace", ] @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "atomic_refcell" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "857253367827bd9d0fd973f0ef15506a96e79e41b0ad7aa691203a4e3214f6c8" +checksum = "79d6dc922a2792b006573f60b2648076355daeae5ce9cb59507e5908c9625d31" [[package]] name = "autocfg" @@ -237,9 +237,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" [[package]] name = "bytemuck" @@ -312,6 +312,56 @@ dependencies = [ "num-traits", ] +[[package]] +name = "clipboard-win" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + +[[package]] +name = "clipboard_macos" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145a7f9e9b89453bc0a5e32d166456405d389cea5b578f57f1274b1397588a95" +dependencies = [ + "objc", + "objc-foundation", + "objc_id", +] + +[[package]] +name = "clipboard_wayland" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f6364a9f7a66f2ac1a1a098aa1c7f6b686f2496c6ac5e5c0d773445df912747" +dependencies = [ + "smithay-clipboard", +] + +[[package]] +name = "clipboard_x11" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983a7010836ecd04dde2c6d27a0cb56ec5d21572177e782bdcb24a600124e921" +dependencies = [ + "thiserror", + "x11rb 0.9.0", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "cocoa" version = "0.24.1" @@ -323,7 +373,7 @@ dependencies = [ "cocoa-foundation", "core-foundation", "core-graphics", - "foreign-types", + "foreign-types 0.3.2", "libc", "objc", ] @@ -338,7 +388,7 @@ dependencies = [ "block", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "libc", "objc", ] @@ -360,10 +410,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] -name = "const_panic" -version = "0.2.7" +name = "com-rs" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58baae561b85ca19b3122a9ddd35c8ec40c3bcd14fe89921824eae73f7baffbf" +checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" + +[[package]] +name = "const_panic" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" [[package]] name = "core-foundation" @@ -390,7 +446,7 @@ dependencies = [ "bitflags", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "libc", ] @@ -402,7 +458,19 @@ checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" dependencies = [ "bitflags", "core-foundation", - "foreign-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-text" +version = "19.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25" +dependencies = [ + "core-foundation", + "core-graphics", + "foreign-types 0.3.2", "libc", ] @@ -415,6 +483,7 @@ dependencies = [ "bytemuck", "calloop", "cosmic-protocols", + "cosmic-time", "edid-rs", "egui", "glow 0.11.2", @@ -465,7 +534,7 @@ name = "cosmic-text" version = "0.7.0" source = "git+https://github.com/pop-os/cosmic-text?rev=e788c175#e788c175ec31094b04dcacbc0537dba4433afcfc" dependencies = [ - "fontdb 0.13.0", + "fontdb 0.13.1", "libm", "log", "ouroboros 0.15.6", @@ -494,10 +563,23 @@ dependencies = [ ] [[package]] -name = "cpufeatures" -version = "0.2.6" +name = "cosmic-time" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "269b94889f152389ed39fde8a69a6083ff4ca73993360d2850d5c281e3488c11" +dependencies = [ + "iced 0.9.0", + "iced_core 0.9.0", + "iced_futures 0.6.0", + "iced_native 0.10.3", + "iced_style 0.8.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -554,6 +636,29 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossfont" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21fd3add36ea31aba1520aa5288714dd63be506106753226d0eb387a93bc9c45" +dependencies = [ + "cocoa", + "core-foundation", + "core-foundation-sys", + "core-graphics", + "core-text", + "dwrote", + "foreign-types 0.5.0", + "freetype-rs", + "libc", + "log", + "objc", + "once_cell", + "pkg-config", + "servo-fontconfig", + "winapi", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -597,6 +702,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "d3d12" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" +dependencies = [ + "bitflags", + "libloading", + "winapi", +] + [[package]] name = "darling" version = "0.10.2" @@ -799,6 +915,20 @@ dependencies = [ "libc", ] +[[package]] +name = "dwrote" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b" +dependencies = [ + "lazy_static", + "libc", + "serde", + "serde_derive", + "winapi", + "wio", +] + [[package]] name = "ecolor" version = "0.21.0" @@ -1012,6 +1142,16 @@ dependencies = [ "libc", ] +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + [[package]] name = "euclid" version = "0.22.9" @@ -1021,6 +1161,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "expat-sys" +version = "2.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa" +dependencies = [ + "cmake", + "pkg-config", +] + [[package]] name = "exr" version = "1.6.3" @@ -1066,12 +1216,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "miniz_oxide 0.6.2", + "miniz_oxide 0.7.1", ] [[package]] @@ -1121,9 +1271,9 @@ dependencies = [ [[package]] name = "fontdb" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfec8f19f9b89b2901219cc62604810d2bfef15dc1182e95320f57e7cbbe041a" +checksum = "237ff9f0813bbfc9de836016472e0c9ae7802f174a51594607e5f4ff334cb2f5" dependencies = [ "log", "memmap2 0.5.10", @@ -1137,7 +1287,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", ] [[package]] @@ -1146,6 +1317,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "fraction" version = "0.13.1" @@ -1169,6 +1346,28 @@ dependencies = [ "xdg", ] +[[package]] +name = "freetype-rs" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74eadec9d0a5c28c54bb9882e54787275152a4e36ce206b45d7451384e5bf5fb" +dependencies = [ + "bitflags", + "freetype-sys", + "libc", +] + +[[package]] +name = "freetype-sys" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a" +dependencies = [ + "cmake", + "libc", + "pkg-config", +] + [[package]] name = "futures" version = "0.3.28" @@ -1434,9 +1633,9 @@ dependencies = [ [[package]] name = "gpu-alloc" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" dependencies = [ "bitflags", "gpu-alloc-types", @@ -1451,6 +1650,19 @@ dependencies = [ "bitflags", ] +[[package]] +name = "gpu-allocator" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" +dependencies = [ + "backtrace", + "log", + "thiserror", + "winapi", + "windows", +] + [[package]] name = "gpu-descriptor" version = "0.2.3" @@ -1499,6 +1711,21 @@ dependencies = [ "ahash 0.7.6", ] +[[package]] +name = "hassle-rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90601c6189668c7345fc53842cb3f3a3d872203d523be1b3cb44a36a3e62fb85" +dependencies = [ + "bitflags", + "com-rs", + "libc", + "libloading", + "thiserror", + "widestring", + "winapi", +] + [[package]] name = "hermit-abi" version = "0.2.6" @@ -1529,23 +1756,47 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "iced" version = "0.6.0" source = "git+https://github.com/pop-os/libcosmic?rev=24709e9c3b#24709e9c3b56c49a0af168d1e37ebef85f112c8a" dependencies = [ - "iced_core", + "iced_core 0.6.2", "iced_dyrend", - "iced_futures", + "iced_futures 0.5.1", "iced_glow", - "iced_graphics", - "iced_native", + "iced_graphics 0.5.0", + "iced_native 0.7.0", "iced_softbuffer", - "iced_wgpu", + "iced_wgpu 0.7.0", "image", "thiserror", ] +[[package]] +name = "iced" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbddf356d01e9d41cd394a9d04d62bfd89650a30f12fda5839cabb8c4591c88" +dependencies = [ + "iced_core 0.9.0", + "iced_futures 0.6.0", + "iced_graphics 0.8.0", + "iced_native 0.10.3", + "iced_wgpu 0.10.0", + "iced_winit", + "thiserror", +] + [[package]] name = "iced_core" version = "0.6.2" @@ -1556,16 +1807,27 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "iced_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11e1942e28dedee756cc27e67e7a838cdc1e59fb6bf9627ec9f709ab3b135782" +dependencies = [ + "bitflags", + "instant", + "palette", +] + [[package]] name = "iced_dyrend" version = "0.1.0" source = "git+https://github.com/pop-os/libcosmic?rev=24709e9c3b#24709e9c3b56c49a0af168d1e37ebef85f112c8a" dependencies = [ "iced_glow", - "iced_graphics", - "iced_native", + "iced_graphics 0.5.0", + "iced_native 0.7.0", "iced_softbuffer", - "iced_wgpu", + "iced_wgpu 0.7.0", "log", "raw-window-handle 0.5.2", ] @@ -1581,6 +1843,19 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "iced_futures" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "215d51fa4f70dbb63775d7141243c4d98d4d525d8949695601f8fbac7dcbc04e" +dependencies = [ + "futures", + "log", + "tokio", + "wasm-bindgen-futures", + "wasm-timer", +] + [[package]] name = "iced_glow" version = "0.5.1" @@ -1591,8 +1866,8 @@ dependencies = [ "glow 0.11.2", "glow_glyph", "glyph_brush", - "iced_graphics", - "iced_native", + "iced_graphics 0.5.0", + "iced_native 0.7.0", "log", ] @@ -1604,8 +1879,8 @@ dependencies = [ "bitflags", "bytemuck", "glam", - "iced_native", - "iced_style", + "iced_native 0.7.0", + "iced_style 0.5.1", "image", "kamadak-exif", "log", @@ -1616,12 +1891,28 @@ dependencies = [ "usvg 0.18.0", ] +[[package]] +name = "iced_graphics" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338a6aff7db906537074ad0fe8b720cfdb9512cdfea43c628c76bd1cf50fdcc0" +dependencies = [ + "bitflags", + "bytemuck", + "glam", + "iced_native 0.10.3", + "iced_style 0.8.0", + "log", + "raw-window-handle 0.5.2", + "thiserror", +] + [[package]] name = "iced_lazy" version = "0.3.0" source = "git+https://github.com/pop-os/libcosmic?rev=24709e9c3b#24709e9c3b56c49a0af168d1e37ebef85f112c8a" dependencies = [ - "iced_native", + "iced_native 0.7.0", "ouroboros 0.13.0", ] @@ -1630,22 +1921,37 @@ name = "iced_native" version = "0.7.0" source = "git+https://github.com/pop-os/libcosmic?rev=24709e9c3b#24709e9c3b56c49a0af168d1e37ebef85f112c8a" dependencies = [ - "iced_core", - "iced_futures", - "iced_style", + "iced_core 0.6.2", + "iced_futures 0.5.1", + "iced_style 0.5.1", "num-traits", "twox-hash", "unicode-segmentation", ] +[[package]] +name = "iced_native" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012eb06da490fe46a695b39721c20da9643f35cf2ecb9d30618fdeb96170616" +dependencies = [ + "iced_core 0.9.0", + "iced_futures 0.6.0", + "iced_style 0.8.0", + "num-traits", + "thiserror", + "twox-hash", + "unicode-segmentation", +] + [[package]] name = "iced_softbuffer" version = "0.1.0" source = "git+https://github.com/pop-os/libcosmic?rev=24709e9c3b#24709e9c3b56c49a0af168d1e37ebef85f112c8a" dependencies = [ "cosmic-text", - "iced_graphics", - "iced_native", + "iced_graphics 0.5.0", + "iced_native 0.7.0", "lazy_static", "log", "raqote", @@ -1658,7 +1964,18 @@ name = "iced_style" version = "0.5.1" source = "git+https://github.com/pop-os/libcosmic?rev=24709e9c3b#24709e9c3b56c49a0af168d1e37ebef85f112c8a" dependencies = [ - "iced_core", + "iced_core 0.6.2", + "once_cell", + "palette", +] + +[[package]] +name = "iced_style" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e37333dc2991201140302cd0d4cea051bd37ca3671d5008ec85df86d232ff30" +dependencies = [ + "iced_core 0.9.0", "once_cell", "palette", ] @@ -1675,19 +1992,56 @@ dependencies = [ "glam", "glyph_brush", "guillotiere", - "iced_graphics", - "iced_native", + "iced_graphics 0.5.0", + "iced_native 0.7.0", "log", "raw-window-handle 0.5.2", - "wgpu", - "wgpu_glyph", + "wgpu 0.14.2", + "wgpu_glyph 0.18.0", +] + +[[package]] +name = "iced_wgpu" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478803c56061f567ce5ddf223b20d11d3c118cc46bb0d0552370dc65cdc4cb9c" +dependencies = [ + "bitflags", + "bytemuck", + "encase", + "futures", + "glam", + "glyph_brush", + "guillotiere", + "iced_graphics 0.8.0", + "iced_native 0.10.3", + "log", + "raw-window-handle 0.5.2", + "wgpu 0.15.1", + "wgpu_glyph 0.19.0", +] + +[[package]] +name = "iced_winit" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a59ea3a85149a6a1f9e92b6c740ce90f04e5c7d848cfd05742336863fceb955" +dependencies = [ + "iced_futures 0.6.0", + "iced_graphics 0.8.0", + "iced_native 0.10.3", + "log", + "thiserror", + "web-sys", + "winapi", + "window_clipboard", + "winit", ] [[package]] name = "id_tree" version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd9db8dd5be8bde5a2624ed4b2dfb74368fe7999eb9c4940fd3ca344b61071a" +source = "git+https://github.com/Drakulix/id-tree.git?branch=feature/copy_clone#c9a2b8c325566d223cf06362c902636b0405e28c" dependencies = [ "snowflake", ] @@ -1817,9 +2171,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" dependencies = [ "wasm-bindgen", ] @@ -1873,9 +2227,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.141" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libcosmic" @@ -1887,12 +2241,12 @@ dependencies = [ "derive_setters", "fraction", "freedesktop-icons", - "iced", - "iced_core", + "iced 0.6.0", + "iced_core 0.6.2", "iced_lazy", - "iced_native", + "iced_native 0.7.0", "iced_softbuffer", - "iced_style", + "iced_style 0.5.1", "lazy_static", "palette", "slotmap", @@ -1970,9 +2324,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" [[package]] name = "lock_api" @@ -2098,7 +2452,7 @@ dependencies = [ "bitflags", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "log", "objc", ] @@ -2166,6 +2520,26 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "naga" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5" +dependencies = [ + "bit-set", + "bitflags", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -2239,6 +2613,19 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + [[package]] name = "nix" version = "0.23.2" @@ -2434,6 +2821,17 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -2443,6 +2841,15 @@ dependencies = [ "cc", ] +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "object" version = "0.30.3" @@ -2460,9 +2867,9 @@ checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "ordered-float" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a384337e997e6860ffbaa83708b2ef329fd8c54cb67a5f64d421e0f943254f" +checksum = "2fc2dbde8f8a79f2102cc474ceb0ad68e3b80b85289ea62389b60e66777e4213" dependencies = [ "num-traits", ] @@ -2532,11 +2939,11 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owned_ttf_parser" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25e9fb15717794fae58ab55c26e044103aad13186fbb625893f9a3bbcc24228" +checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4" dependencies = [ - "ttf-parser 0.18.1", + "ttf-parser 0.19.0", ] [[package]] @@ -2706,9 +3113,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" @@ -2842,9 +3249,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] @@ -2903,6 +3310,16 @@ dependencies = [ "typed-arena", ] +[[package]] +name = "raw-window-handle" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76" +dependencies = [ + "libc", + "raw-window-handle 0.4.3", +] + [[package]] name = "raw-window-handle" version = "0.4.3" @@ -2983,13 +3400,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.3" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.1", ] [[package]] @@ -2998,7 +3415,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.29", ] [[package]] @@ -3007,6 +3424,12 @@ version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + [[package]] name = "renderdoc" version = "0.10.1" @@ -3131,9 +3554,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.37.11" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags", "errno 0.3.1", @@ -3220,6 +3643,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sctk-adwaita" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61270629cc6b4d77ec1907db1033d5c2e1a404c412743621981a871dc9c12339" +dependencies = [ + "crossfont", + "log", + "smithay-client-toolkit", + "tiny-skia 0.7.0", +] + [[package]] name = "sendfd" version = "0.4.3" @@ -3231,18 +3666,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.160" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", @@ -3260,6 +3695,27 @@ dependencies = [ "serde", ] +[[package]] +name = "servo-fontconfig" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e3e22fe5fd73d04ebf0daa049d3efe3eae55369ce38ab16d07ddd9ac5c217c" +dependencies = [ + "libc", + "servo-fontconfig-sys", +] + +[[package]] +name = "servo-fontconfig-sys" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36b879db9892dfa40f95da1c38a835d41634b825fbd8c4c418093d53c24b388" +dependencies = [ + "expat-sys", + "freetype-sys", + "pkg-config", +] + [[package]] name = "sha2" version = "0.10.6" @@ -3334,7 +3790,7 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "smithay" version = "0.3.0" -source = "git+https://github.com/smithay//smithay?rev=25d1176484#25d1176484e1c846c4b510f6a4bf5cc5a6d2e4e9" +source = "git+https://github.com/pop-os/smithay?branch=tiling_rework#920556dd8f5b16609fee20a44191add364740e61" dependencies = [ "appendlist", "ash", @@ -3374,7 +3830,7 @@ dependencies = [ "wayland-server", "wayland-sys 0.30.1", "winit", - "x11rb", + "x11rb 0.11.1", "xkbcommon 0.5.0", ] @@ -3397,6 +3853,16 @@ dependencies = [ "wayland-protocols 0.29.5", ] +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit", + "wayland-client 0.29.5", +] + [[package]] name = "smithay-egui" version = "0.1.0" @@ -3429,7 +3895,7 @@ dependencies = [ "cocoa", "core-graphics", "fastrand", - "foreign-types", + "foreign-types 0.3.2", "log", "nix 0.26.2", "objc", @@ -3443,7 +3909,7 @@ dependencies = [ "web-sys", "windows-sys 0.42.0", "x11-dl", - "x11rb", + "x11rb 0.11.1", ] [[package]] @@ -3477,6 +3943,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + [[package]] name = "strict-num" version = "0.1.0" @@ -3537,9 +4009,9 @@ checksum = "9ac8fb7895b4afa060ad731a32860db8755da3449a47e796d5ecf758db2671d4" [[package]] name = "swash" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba6e16b35fe4f8b2020640610575827892b4e2db5d289b3b76ff4e1cfd38752" +checksum = "3b7c73c813353c347272919aa1af2885068b05e625e5532b43049e4f641ae77f" dependencies = [ "yazi", "zeno", @@ -3645,9 +4117,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" dependencies = [ "itoa", "serde", @@ -3657,15 +4129,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" dependencies = [ "time-core", ] @@ -3684,6 +4156,21 @@ dependencies = [ "safe_arch", ] +[[package]] +name = "tiny-skia" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642680569bb895b16e4b9d181c60be1ed136fa0c9c7f11d004daf053ba89bf82" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "bytemuck", + "cfg-if", + "png", + "safe_arch", + "tiny-skia-path 0.7.0", +] + [[package]] name = "tiny-skia" version = "0.8.4" @@ -3695,7 +4182,17 @@ dependencies = [ "bytemuck", "cfg-if", "png", - "tiny-skia-path", + "tiny-skia-path 0.8.4", +] + +[[package]] +name = "tiny-skia-path" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c114d32f0c2ee43d585367cb013dfaba967ab9f62b90d9af0d696e955e70fa6c" +dependencies = [ + "arrayref", + "bytemuck", ] [[package]] @@ -3709,6 +4206,18 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tokio" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +dependencies = [ + "autocfg", + "num_cpus", + "pin-project-lite", + "windows-sys 0.48.0", +] + [[package]] name = "toml" version = "0.5.11" @@ -3749,20 +4258,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -3792,9 +4301,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ "matchers", "nu-ansi-term", @@ -3820,6 +4329,12 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" +[[package]] +name = "ttf-parser" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dcf002ae3b32cd25400d6df128c5babec3927cd1eb7ce813cfff20eb6c3746" + [[package]] name = "twox-hash" version = "1.6.3" @@ -4018,9 +4533,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4028,24 +4543,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" dependencies = [ "cfg-if", "js-sys", @@ -4055,9 +4570,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4065,22 +4580,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" [[package]] name = "wasm-timer" @@ -4099,9 +4614,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ebd48bfc1178c9190c7ff80cc822b3335ffc83141e9aa723168f377257623e" +checksum = "41b48e27457e8da3b2260ac60d0a94512f5cba36448679f3747c0865b7893ed8" dependencies = [ "cc", "downcast-rs", @@ -4286,9 +4801,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" dependencies = [ "js-sys", "wasm-bindgen", @@ -4309,7 +4824,7 @@ dependencies = [ "arrayvec 0.7.2", "js-sys", "log", - "naga", + "naga 0.10.0", "parking_lot 0.12.1", "raw-window-handle 0.5.2", "smallvec", @@ -4317,9 +4832,33 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", + "wgpu-core 0.14.2", + "wgpu-hal 0.14.1", + "wgpu-types 0.14.1", +] + +[[package]] +name = "wgpu" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d745a1b6d91d85c33defbb29f0eee0450e1d2614d987e14bf6baf26009d132d7" +dependencies = [ + "arrayvec 0.7.2", + "cfg-if", + "js-sys", + "log", + "naga 0.11.0", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.5.2", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 0.15.1", + "wgpu-hal 0.15.4", + "wgpu-types 0.15.2", ] [[package]] @@ -4335,15 +4874,38 @@ dependencies = [ "codespan-reporting", "fxhash", "log", - "naga", + "naga 0.10.0", "parking_lot 0.12.1", "profiling", "raw-window-handle 0.5.2", "smallvec", "thiserror", "web-sys", - "wgpu-hal", - "wgpu-types", + "wgpu-hal 0.14.1", + "wgpu-types 0.14.1", +] + +[[package]] +name = "wgpu-core" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131408d940e335792645a98f03639573b0480e9e2e7cddbbab74f7c6d9f3fff" +dependencies = [ + "arrayvec 0.7.2", + "bit-vec", + "bitflags", + "codespan-reporting", + "fxhash", + "log", + "naga 0.11.0", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.5.2", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal 0.15.4", + "wgpu-types 0.15.2", ] [[package]] @@ -4359,8 +4921,8 @@ dependencies = [ "bitflags", "block", "core-graphics-types", - "d3d12", - "foreign-types", + "d3d12 0.5.0", + "foreign-types 0.3.2", "fxhash", "glow 0.11.2", "gpu-alloc", @@ -4370,7 +4932,7 @@ dependencies = [ "libloading", "log", "metal", - "naga", + "naga 0.10.0", "objc", "parking_lot 0.12.1", "profiling", @@ -4381,7 +4943,49 @@ dependencies = [ "thiserror", "wasm-bindgen", "web-sys", - "wgpu-types", + "wgpu-types 0.14.1", + "winapi", +] + +[[package]] +name = "wgpu-hal" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b" +dependencies = [ + "android_system_properties", + "arrayvec 0.7.2", + "ash", + "bit-set", + "bitflags", + "block", + "core-graphics-types", + "d3d12 0.6.0", + "foreign-types 0.3.2", + "fxhash", + "glow 0.12.1", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga 0.11.0", + "objc", + "parking_lot 0.12.1", + "profiling", + "range-alloc", + "raw-window-handle 0.5.2", + "renderdoc-sys", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types 0.15.2", "winapi", ] @@ -4394,6 +4998,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "wgpu-types" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32444e121b0bd00cb02c0de32fde457a9491bd44e03e7a5db6df9b1da2f6f110" +dependencies = [ + "bitflags", + "js-sys", + "web-sys", +] + [[package]] name = "wgpu_glyph" version = "0.18.0" @@ -4403,9 +5018,27 @@ dependencies = [ "bytemuck", "glyph_brush", "log", - "wgpu", + "wgpu 0.14.2", ] +[[package]] +name = "wgpu_glyph" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25440d5f32ec39de49c57c15c2d3f9133a7939b069b5ad07e5afd8b78fb8adc" +dependencies = [ + "bytemuck", + "glyph_brush", + "log", + "wgpu 0.15.1", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + [[package]] name = "winapi" version = "0.3.9" @@ -4446,6 +5079,29 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "window_clipboard" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015dd4474dc6aa96fe19aae3a24587a088bd90331dba5a5cc60fb3a180234c4d" +dependencies = [ + "clipboard-win", + "clipboard_macos", + "clipboard_wayland", + "clipboard_x11", + "raw-window-handle 0.3.4", + "thiserror", +] + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.36.1" @@ -4659,6 +5315,7 @@ dependencies = [ "percent-encoding", "raw-window-handle 0.4.3", "raw-window-handle 0.5.2", + "sctk-adwaita", "smithay-client-toolkit", "wasm-bindgen", "wayland-client 0.29.5", @@ -4670,9 +5327,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] @@ -4697,6 +5354,18 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "x11rb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a" +dependencies = [ + "gethostname", + "nix 0.22.3", + "winapi", + "winapi-wsapoll", +] + [[package]] name = "x11rb" version = "0.11.1" @@ -4733,11 +5402,11 @@ dependencies = [ [[package]] name = "xdg" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6" +checksum = "688597db5a750e9cad4511cb94729a078e274308099a0382b5b8203bbc767fee" dependencies = [ - "dirs", + "home", ] [[package]] @@ -4767,9 +5436,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.4" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" +checksum = "dc95a04ea24f543cd9be5aab44f963fa35589c99e18415c38fb2b17e133bf8d2" [[package]] name = "xmlparser" @@ -4785,9 +5454,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "yazi" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4882895da007f1fb0524971b07f60fc742f457996d970443affd44a48ce954" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" [[package]] name = "zeno" @@ -4827,9 +5496,9 @@ dependencies = [ [[package]] name = "zune-inflate" -version = "0.2.53" +version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440a08fd59c6442e4b846ea9b10386c38307eae728b216e1ab2c305d1c9daaf8" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] diff --git a/Cargo.toml b/Cargo.toml index 967dd2bb..38d8b160 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,6 @@ log-panics = { version = "2", features = ["with-backtrace"] } thiserror = "1.0.26" regex = "1" xcursor = "0.3.3" -id_tree = "1.8.0" xkbcommon = "0.4" indexmap = "1.8.0" xdg = "^2.1" @@ -40,6 +39,11 @@ tracing-journald = "0.3.0" tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_level_info"] } puffin = { version = "0.14.3", optional = true } puffin_egui = { version = "0.21.0", optional = true } +cosmic-time = "0.2.0" + +[dependencies.id_tree] +git = "https://github.com/Drakulix/id-tree.git" +branch = "feature/copy_clone" [dependencies.smithay] version = "0.3" @@ -70,4 +74,4 @@ debug = true lto = "fat" [patch."https://github.com/Smithay/smithay.git"] -smithay = { git = "https://github.com/smithay//smithay", rev = "25d1176484" } +smithay = { git = "https://github.com/pop-os/smithay", branch = "tiling_rework" } diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index 18bee99d..e3e3fc4b 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -485,7 +485,9 @@ impl State { } surface.pending = false; - surface.dirty.then(|| { + (surface.dirty + || data.state.common.shell.animations_going()) + .then(|| { (surface.output.clone(), surface.fps.avg_rendertime(5)) }) } diff --git a/src/backend/render/cursor.rs b/src/backend/render/cursor.rs index 14765568..c6f0db74 100644 --- a/src/backend/render/cursor.rs +++ b/src/backend/render/cursor.rs @@ -162,6 +162,7 @@ where surface, position.to_physical_precise_round(scale), scale, + 1.0, ) } @@ -190,6 +191,7 @@ where surface, location.into().to_physical_precise_round(scale), scale, + 1.0, ) } diff --git a/src/backend/render/element.rs b/src/backend/render/element.rs index 526bfafb..d3bcbae8 100644 --- a/src/backend/render/element.rs +++ b/src/backend/render/element.rs @@ -118,6 +118,16 @@ where CosmicElement::Egui(elem) => elem.opaque_regions(scale), } } + + fn alpha(&self) -> f32 { + match self { + CosmicElement::Workspace(elem) => elem.alpha(), + CosmicElement::Cursor(elem) => elem.alpha(), + CosmicElement::MoveGrab(elem) => elem.alpha(), + #[cfg(feature = "debug")] + CosmicElement::Egui(elem) => elem.alpha(), + } + } } impl RenderElement for CosmicElement { diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index e48e86c4..f820a113 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -66,7 +66,7 @@ pub type GlMultiFrame<'a, 'b, 'frame> = MultiFrame<'a, 'a, 'b, 'frame, GbmGlesBackend, GbmGlesBackend>; pub static CLEAR_COLOR: [f32; 4] = [0.153, 0.161, 0.165, 1.0]; -pub static FOCUS_INDICATOR_COLOR: [f32; 4] = [0.580, 0.921, 0.921, 1.0]; +pub static FOCUS_INDICATOR_COLOR: [f32; 3] = [0.580, 0.921, 0.921]; pub static FOCUS_INDICATOR_SHADER: &str = include_str!("./shaders/focus_indicator.frag"); pub struct IndicatorShader(pub GlesPixelProgram); @@ -87,6 +87,7 @@ impl IndicatorShader { renderer: &R, geo: Rectangle, thickness: u8, + alpha: f32, ) -> PixelShaderElement { let thickness: f32 = thickness as f32; let thickness_loc = (thickness as i32, thickness as i32); @@ -110,15 +111,14 @@ impl IndicatorShader { } None => { let shader = Self::get(renderer); - let color = FOCUS_INDICATOR_COLOR; let elem = PixelShaderElement::new( shader, - dbg!(geo), + geo, None, //TODO - color[3], + alpha, vec![ - Uniform::new("color", [color[0], color[1], color[2]]), + Uniform::new("color", FOCUS_INDICATOR_COLOR), Uniform::new("thickness", thickness), Uniform::new("radius", thickness * 2.0), ], @@ -283,6 +283,11 @@ where } } + state + .shell + .space_for_handle_mut(&handle) + .ok_or(OutputNoMode)? + .update_animations(&state.event_loop_handle); let workspace = state.shell.space_for_handle(&handle).ok_or(OutputNoMode)?; let last_active_seat = state.last_active_seat().clone(); let move_active = last_active_seat diff --git a/src/backend/winit.rs b/src/backend/winit.rs index 3bec32f6..d9ad3bb7 100644 --- a/src/backend/winit.rs +++ b/src/backend/winit.rs @@ -95,7 +95,7 @@ impl WinitState { .unwrap_or_default(), 0, wp_presentation_feedback::Kind::Vsync, - ) + ); } } Err(err) => { diff --git a/src/main.rs b/src/main.rs index 5e61523a..7810ebab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -66,6 +66,10 @@ fn main() -> Result<()> { } // trigger routines + data.state + .common + .shell + .update_animations(&data.state.common.event_loop_handle); data.state.common.shell.refresh(); state::Common::refresh_focus(&mut data.state); diff --git a/src/shell/element/mod.rs b/src/shell/element/mod.rs index 7bd840a0..9aa7fc29 100644 --- a/src/shell/element/mod.rs +++ b/src/shell/element/mod.rs @@ -11,7 +11,10 @@ use smithay::{ backend::{ input::KeyState, renderer::{ - element::{AsRenderElements, Element, RenderElement, UnderlyingStorage}, + element::{ + utils::CropRenderElement, AsRenderElements, Element, RenderElement, + UnderlyingStorage, + }, gles::element::PixelShaderElement, glow::GlowRenderer, multigpu::Error as MultiError, @@ -418,15 +421,17 @@ impl CosmicMapped { } } - pub fn configure(&self) { - for window in match &self.element { + pub fn configure(&self) -> Option { + match &self.element { CosmicMappedInternal::Stack(s) => { - Box::new(s.surfaces()) as Box> + let active = s.active(); + for surface in s.surfaces().filter(|s| s != &active) { + surface.send_configure(); + } + active.send_configure() } - CosmicMappedInternal::Window(w) => Box::new(std::iter::once(w.surface())), + CosmicMappedInternal::Window(w) => w.surface().send_configure(), _ => unreachable!(), - } { - window.send_configure(); } } @@ -676,6 +681,8 @@ where { Stack(self::stack::CosmicStackRenderElement), Window(self::window::CosmicWindowRenderElement), + CroppedStack(CropRenderElement>), + CroppedWindow(CropRenderElement>), Indicator(PixelShaderElement), #[cfg(feature = "debug")] Egui(TextureRenderElement), @@ -690,6 +697,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.id(), CosmicMappedRenderElement::Window(elem) => elem.id(), + CosmicMappedRenderElement::CroppedStack(elem) => elem.id(), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.id(), CosmicMappedRenderElement::Indicator(elem) => elem.id(), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.id(), @@ -700,6 +709,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.current_commit(), CosmicMappedRenderElement::Window(elem) => elem.current_commit(), + CosmicMappedRenderElement::CroppedStack(elem) => elem.current_commit(), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.current_commit(), CosmicMappedRenderElement::Indicator(elem) => elem.current_commit(), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.current_commit(), @@ -710,6 +721,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.src(), CosmicMappedRenderElement::Window(elem) => elem.src(), + CosmicMappedRenderElement::CroppedStack(elem) => elem.src(), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.src(), CosmicMappedRenderElement::Indicator(elem) => elem.src(), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.src(), @@ -720,6 +733,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.geometry(scale), CosmicMappedRenderElement::Window(elem) => elem.geometry(scale), + CosmicMappedRenderElement::CroppedStack(elem) => elem.geometry(scale), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.geometry(scale), CosmicMappedRenderElement::Indicator(elem) => elem.geometry(scale), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.geometry(scale), @@ -730,6 +745,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.location(scale), CosmicMappedRenderElement::Window(elem) => elem.location(scale), + CosmicMappedRenderElement::CroppedStack(elem) => elem.location(scale), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.location(scale), CosmicMappedRenderElement::Indicator(elem) => elem.location(scale), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.location(scale), @@ -740,6 +757,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.transform(), CosmicMappedRenderElement::Window(elem) => elem.transform(), + CosmicMappedRenderElement::CroppedStack(elem) => elem.transform(), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.transform(), CosmicMappedRenderElement::Indicator(elem) => elem.transform(), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.transform(), @@ -754,6 +773,8 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.damage_since(scale, commit), CosmicMappedRenderElement::Window(elem) => elem.damage_since(scale, commit), + CosmicMappedRenderElement::CroppedStack(elem) => elem.damage_since(scale, commit), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.damage_since(scale, commit), CosmicMappedRenderElement::Indicator(elem) => elem.damage_since(scale, commit), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.damage_since(scale, commit), @@ -764,11 +785,25 @@ where match self { CosmicMappedRenderElement::Stack(elem) => elem.opaque_regions(scale), CosmicMappedRenderElement::Window(elem) => elem.opaque_regions(scale), + CosmicMappedRenderElement::CroppedStack(elem) => elem.opaque_regions(scale), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.opaque_regions(scale), CosmicMappedRenderElement::Indicator(elem) => elem.opaque_regions(scale), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.opaque_regions(scale), } } + + fn alpha(&self) -> f32 { + match self { + CosmicMappedRenderElement::Stack(elem) => elem.alpha(), + CosmicMappedRenderElement::Window(elem) => elem.alpha(), + CosmicMappedRenderElement::CroppedStack(elem) => elem.alpha(), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.alpha(), + CosmicMappedRenderElement::Indicator(elem) => elem.alpha(), + #[cfg(feature = "debug")] + CosmicMappedRenderElement::Egui(elem) => elem.alpha(), + } + } } impl RenderElement for CosmicMappedRenderElement { @@ -782,6 +817,8 @@ impl RenderElement for CosmicMappedRenderElement { match self { CosmicMappedRenderElement::Stack(elem) => elem.draw(frame, src, dst, damage), CosmicMappedRenderElement::Window(elem) => elem.draw(frame, src, dst, damage), + CosmicMappedRenderElement::CroppedStack(elem) => elem.draw(frame, src, dst, damage), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.draw(frame, src, dst, damage), CosmicMappedRenderElement::Indicator(elem) => { RenderElement::::draw(elem, frame, src, dst, damage) } @@ -796,6 +833,8 @@ impl RenderElement for CosmicMappedRenderElement { match self { CosmicMappedRenderElement::Stack(elem) => elem.underlying_storage(renderer), CosmicMappedRenderElement::Window(elem) => elem.underlying_storage(renderer), + CosmicMappedRenderElement::CroppedStack(elem) => elem.underlying_storage(renderer), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.underlying_storage(renderer), CosmicMappedRenderElement::Indicator(elem) => elem.underlying_storage(renderer), #[cfg(feature = "debug")] CosmicMappedRenderElement::Egui(elem) => elem.underlying_storage(renderer), @@ -816,6 +855,8 @@ impl<'a, 'b> RenderElement> match self { CosmicMappedRenderElement::Stack(elem) => elem.draw(frame, src, dst, damage), CosmicMappedRenderElement::Window(elem) => elem.draw(frame, src, dst, damage), + CosmicMappedRenderElement::CroppedStack(elem) => elem.draw(frame, src, dst, damage), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.draw(frame, src, dst, damage), CosmicMappedRenderElement::Indicator(elem) => { RenderElement::::draw(elem, frame.glow_frame_mut(), src, dst, damage) .map_err(|err| MultiError::Render(err)) @@ -836,6 +877,8 @@ impl<'a, 'b> RenderElement> match self { CosmicMappedRenderElement::Stack(elem) => elem.underlying_storage(renderer), CosmicMappedRenderElement::Window(elem) => elem.underlying_storage(renderer), + CosmicMappedRenderElement::CroppedStack(elem) => elem.underlying_storage(renderer), + CosmicMappedRenderElement::CroppedWindow(elem) => elem.underlying_storage(renderer), CosmicMappedRenderElement::Indicator(elem) => { elem.underlying_storage(renderer.glow_renderer_mut()) } @@ -910,6 +953,7 @@ where renderer: &mut R, location: Point, scale: Scale, + alpha: f32, ) -> Vec { #[cfg(feature = "debug")] let mut elements = if let Some(debug) = self.debug.lock().unwrap().as_mut() { @@ -1080,12 +1124,12 @@ where CosmicMappedInternal::Stack(s) => { elements.extend(AsRenderElements::::render_elements::< CosmicMappedRenderElement, - >(s, renderer, location, scale)) + >(s, renderer, location, scale, alpha)) } CosmicMappedInternal::Window(w) => { elements.extend(AsRenderElements::::render_elements::< CosmicMappedRenderElement, - >(w, renderer, location, scale)) + >(w, renderer, location, scale, alpha)) } _ => {} }; diff --git a/src/shell/element/stack.rs b/src/shell/element/stack.rs index 1d7ecb5e..9ecd1b34 100644 --- a/src/shell/element/stack.rs +++ b/src/shell/element/stack.rs @@ -604,9 +604,10 @@ where renderer: &mut R, mut location: Point, scale: Scale, + alpha: f32, ) -> Vec { let mut elements = AsRenderElements::::render_elements::>( - &self.0, renderer, location, scale, + &self.0, renderer, location, scale, alpha, ); location.y += TAB_HEIGHT; @@ -616,6 +617,7 @@ where renderer, location, scale, + alpha, ); elements })); diff --git a/src/shell/element/surface.rs b/src/shell/element/surface.rs index ac15a12e..d02c4083 100644 --- a/src/shell/element/surface.rs +++ b/src/shell/element/surface.rs @@ -29,7 +29,7 @@ use smithay::{ wayland_server::protocol::wl_surface::WlSurface, }, space_elements, - utils::{user_data::UserDataMap, Logical, Rectangle, Size}, + utils::{user_data::UserDataMap, Logical, Rectangle, Serial, Size}, wayland::{ compositor::{with_states, SurfaceData}, seat::WaylandFocus, @@ -345,11 +345,44 @@ impl CosmicSurface { }) } - pub fn send_configure(&self) { + pub fn serial_acked(&self, serial: &Serial) -> bool { match self { - CosmicSurface::Wayland(window) => window.toplevel().send_configure(), + CosmicSurface::Wayland(window) => { + with_states(window.toplevel().wl_surface(), |states| { + let attrs = states + .data_map + .get::() + .unwrap() + .lock() + .unwrap(); + attrs + .configure_serial + .as_ref() + .map(|s| s >= serial) + .unwrap_or(false) + }) + } + _ => true, + } + } + + pub fn force_configure(&self) -> Option { + match self { + CosmicSurface::Wayland(window) => Some(window.toplevel().send_configure()), CosmicSurface::X11(surface) => { let _ = surface.configure(None); + None + } + _ => unreachable!(), + } + } + + pub fn send_configure(&self) -> Option { + match self { + CosmicSurface::Wayland(window) => window.toplevel().send_pending_configure(), + CosmicSurface::X11(surface) => { + let _ = surface.configure(None); + None } _ => unreachable!(), } @@ -675,10 +708,15 @@ where renderer: &mut R, location: smithay::utils::Point, scale: smithay::utils::Scale, + alpha: f32, ) -> Vec { match self { - CosmicSurface::Wayland(window) => window.render_elements(renderer, location, scale), - CosmicSurface::X11(surface) => surface.render_elements(renderer, location, scale), + CosmicSurface::Wayland(window) => { + window.render_elements(renderer, location, scale, alpha) + } + CosmicSurface::X11(surface) => { + surface.render_elements(renderer, location, scale, alpha) + } _ => unreachable!(), } } diff --git a/src/shell/element/window.rs b/src/shell/element/window.rs index 3aca2632..35416758 100644 --- a/src/shell/element/window.rs +++ b/src/shell/element/window.rs @@ -640,6 +640,13 @@ where CosmicWindowRenderElement::Window(w) => w.opaque_regions(scale), } } + + fn alpha(&self) -> f32 { + match self { + CosmicWindowRenderElement::Header(h) => h.alpha(), + CosmicWindowRenderElement::Window(w) => w.alpha(), + } + } } impl RenderElement for CosmicWindowRenderElement { @@ -710,6 +717,7 @@ where renderer: &mut R, location: Point, scale: Scale, + alpha: f32, ) -> Vec { let has_ssd = self.0.with_program(|p| p.has_ssd()); @@ -721,14 +729,18 @@ where let mut elements = self.0.with_program(|p| { AsRenderElements::::render_elements::>( - &p.window, renderer, window_loc, scale, + &p.window, renderer, window_loc, scale, alpha, ) }); if has_ssd { elements.extend(AsRenderElements::::render_elements::< CosmicWindowRenderElement, >( - &self.0, renderer.glow_renderer_mut(), location, scale + &self.0, + renderer.glow_renderer_mut(), + location, + scale, + alpha, )) } diff --git a/src/shell/layout/floating/grabs/moving.rs b/src/shell/layout/floating/grabs/moving.rs index 4623ffd0..24b9ea59 100644 --- a/src/shell/layout/floating/grabs/moving.rs +++ b/src/shell/layout/floating/grabs/moving.rs @@ -68,6 +68,7 @@ impl MoveGrabState { renderer, Rectangle::from_loc_and_size(render_location, self.window.geometry().size), self.indicator_thickness, + 1.0, )) .into(), ); @@ -77,6 +78,7 @@ impl MoveGrabState { renderer, (render_location - self.window.geometry().loc).to_physical_precise_round(scale), scale, + 1.0, )); elements } @@ -266,7 +268,7 @@ impl MoveSurfaceGrab { .active_space_mut(&output) .floating_layer .map_internal(grab_state.window, &output, Some(window_location + offset)); - + let pointer_pos = handle.current_location(); let relative_pos = state.common.shell.map_global_to_space(pointer_pos, &output); Some(window_location + offset + (pointer_pos - relative_pos).to_i32_round()) @@ -282,7 +284,10 @@ impl MoveSurfaceGrab { if let Some(position) = position { handle.motion( state, - Some((PointerFocusTarget::from(self.window.clone()), position - self.window.geometry().loc)), + Some(( + PointerFocusTarget::from(self.window.clone()), + position - self.window.geometry().loc, + )), &MotionEvent { location: handle.current_location(), serial: serial, diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index e878bda0..b5a0ce04 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -374,6 +374,7 @@ impl FloatingLayout { renderer, render_location.to_physical_precise_round(output_scale), output_scale.into(), + 1.0, ); if focused == Some(elem) { if indicator_thickness > 0 { @@ -384,6 +385,7 @@ impl FloatingLayout { elem.geometry().size, ), indicator_thickness, + 1.0, ); elements.insert(0, element.into()); } diff --git a/src/shell/layout/tiling/blocker.rs b/src/shell/layout/tiling/blocker.rs new file mode 100644 index 00000000..73768ced --- /dev/null +++ b/src/shell/layout/tiling/blocker.rs @@ -0,0 +1,65 @@ +use crate::{ + shell::element::CosmicSurface, state::Data, + wayland::handlers::compositor::client_compositor_state, +}; +use calloop::LoopHandle; +use smithay::{ + reexports::wayland_server::{backend::ClientId, Client, Resource}, + utils::Serial, + wayland::{ + compositor::{Blocker, BlockerState}, + seat::WaylandFocus, + }, +}; +use std::{ + collections::HashMap, + time::{Duration, Instant}, +}; + +#[derive(Debug, Clone)] +pub struct TilingBlocker { + pub necessary_acks: Vec<(CosmicSurface, Serial)>, + start: Instant, +} + +impl Blocker for TilingBlocker { + fn state(&self) -> BlockerState { + if self.is_ready() { + BlockerState::Released + } else { + BlockerState::Pending + } + } +} + +impl TilingBlocker { + pub fn new(configures: impl IntoIterator) -> Self { + TilingBlocker { + necessary_acks: configures.into_iter().collect(), + start: Instant::now(), + } + } + + pub fn is_ready(&self) -> bool { + Instant::now().duration_since(self.start) >= Duration::from_millis(200) + || self + .necessary_acks + .iter() + .all(|(surf, serial)| surf.serial_acked(serial)) + } + + pub fn signal_ready(&self, handle: &LoopHandle<'static, Data>) { + let clients = self + .necessary_acks + .iter() + .flat_map(|(surface, _)| surface.wl_surface().and_then(|s| s.client())) + .map(|client| (client.id(), client)) + .collect::>(); + handle.insert_idle(move |data| { + let dh = data.display.handle(); + for client in clients.values() { + client_compositor_state(&client).blocker_cleared(&mut data.state, &dh); + } + }); + } +} diff --git a/src/shell/layout/tiling/grabs.rs b/src/shell/layout/tiling/grabs.rs index d12c0450..46e9cc70 100644 --- a/src/shell/layout/tiling/grabs.rs +++ b/src/shell/layout/tiling/grabs.rs @@ -64,7 +64,8 @@ impl PointerGrab for ResizeForkGrab { if let Some(output) = self.output.upgrade() { let tiling_layer = &mut data.common.shell.active_space_mut(&output).tiling_layer; - if let Some(tree) = tiling_layer.trees.get_mut(&output) { + if let Some(queue) = tiling_layer.queues.get_mut(&output) { + let tree = &mut queue.trees.back_mut().unwrap().0; if tree.get(&self.node).is_ok() { let orientation = tree.get(&self.node).unwrap().data().orientation(); let delta = match orientation { diff --git a/src/shell/layout/tiling/mod.rs b/src/shell/layout/tiling/mod.rs index 0723078c..a1e3d34d 100644 --- a/src/shell/layout/tiling/mod.rs +++ b/src/shell/layout/tiling/mod.rs @@ -18,24 +18,36 @@ use crate::{ }, }; +use calloop::LoopHandle; +use cosmic_time::{Cubic, Ease, Tween}; use id_tree::{InsertBehavior, MoveBehavior, Node, NodeId, NodeIdError, RemoveBehavior, Tree}; use smithay::{ backend::renderer::{ - element::{AsRenderElements, RenderElement}, + element::{utils::CropRenderElement, AsRenderElements, RenderElement}, ImportAll, ImportMem, Renderer, }, desktop::{layer_map_for_output, space::SpaceElement, PopupKind}, input::{pointer::GrabStartData as PointerGrabStartData, Seat}, output::Output, utils::{IsAlive, Logical, Point, Rectangle, Scale}, - wayland::seat::WaylandFocus, + wayland::{compositor::add_blocker, seat::WaylandFocus}, +}; +use std::{ + borrow::Borrow, + collections::{HashMap, VecDeque}, + hash::Hash, + sync::Arc, + time::{Duration, Instant}, }; -use std::{borrow::Borrow, collections::HashMap, hash::Hash, sync::Arc}; use tracing::trace; +mod blocker; mod grabs; +pub use self::blocker::*; pub use self::grabs::*; +const ANIMATION_DURATION: Duration = Duration::from_millis(200); + #[derive(Debug, Clone)] struct OutputData { output: Output, @@ -83,10 +95,24 @@ pub enum FocusResult { Some(KeyboardFocusTarget), } +#[derive(Debug, Clone, Default)] +struct TreeQueue { + trees: VecDeque<(Tree, Option)>, + animation_start: Option, +} + +impl TreeQueue { + pub fn push_tree(&mut self, tree: Tree, blocker: Option) { + self.trees.push_back((tree, blocker)) + } +} + #[derive(Debug, Clone)] pub struct TilingLayout { gaps: (i32, i32), - trees: HashMap>, + queues: HashMap, + standby_tree: Option>, + pending_blockers: Vec, } #[derive(Debug, Clone)] @@ -251,24 +277,33 @@ impl TilingLayout { pub fn new(gaps: (u8, u8)) -> TilingLayout { TilingLayout { gaps: (gaps.0 as i32, gaps.1 as i32), - trees: HashMap::new(), + queues: HashMap::new(), + standby_tree: None, + pending_blockers: Vec::new(), } } } impl TilingLayout { pub fn map_output(&mut self, output: &Output, location: Point) { - if !self.trees.contains_key(output) { - self.trees.insert( + if !self.queues.contains_key(output) { + self.queues.insert( OutputData { output: output.clone(), location, }, - Tree::new(), + TreeQueue { + trees: { + let mut queue = VecDeque::new(); + queue.push_back((self.standby_tree.take().unwrap_or_else(Tree::new), None)); + queue + }, + animation_start: None, + }, ); } else { - let tree = self.trees.remove(output).unwrap(); - self.trees.insert( + let tree = self.queues.remove(output).unwrap(); + self.queues.insert( OutputData { output: output.clone(), location, @@ -283,9 +318,19 @@ impl TilingLayout { output: &Output, toplevel_info: &mut ToplevelInfoState, ) { - if let Some(src) = self.trees.remove(output) { - // TODO: expects last remaining output - let Some((new_output, dst)) = self.trees.iter_mut().next() else { return; }; + if let Some(mut src) = self.queues.remove(output) { + // Operate on last pending tree & unblock queue + for blocker in src.trees.iter_mut().flat_map(|(_, blocker)| blocker.take()) { + self.pending_blockers.push(blocker); + } + let (src, _) = src.trees.pop_back().expect("No tree in queue"); + + let Some((new_output, dst_queue)) = self.queues.iter_mut().next() else { + self.standby_tree = Some(src); + return; + }; + + let mut dst = dst_queue.trees.back().unwrap().0.copy_clone(); let orientation = match new_output.output.geometry().size { x if x.w >= x.h => Orientation::Vertical, _ => Orientation::Horizontal, @@ -309,8 +354,10 @@ impl TilingLayout { mapped.output_enter(&new_output.output, mapped.bbox()); } } - TilingLayout::merge_trees(src, dst, orientation); - self.refresh() + TilingLayout::merge_trees(src, &mut dst, orientation); + + let blocker = TilingLayout::update_positions(output, &mut dst, self.gaps); + dst_queue.push_tree(dst, blocker); } } @@ -324,7 +371,6 @@ impl TilingLayout { window.output_enter(&output, window.bbox()); window.set_bounds(output.geometry().size); self.map_internal(window, &output, Some(focus_stack)); - self.refresh(); } fn map_internal<'a>( @@ -333,15 +379,17 @@ impl TilingLayout { output: &Output, focus_stack: Option + 'a>, ) { - let tree = self.trees.get_mut(output).expect("Output not mapped?"); + let queue = self.queues.get_mut(output).expect("Output not mapped?"); + let mut tree = queue.trees.back().unwrap().0.copy_clone(); + let window = window.into(); let new_window = Node::new(Data::Mapped { mapped: window.clone(), last_geometry: Rectangle::from_loc_and_size((0, 0), (100, 100)), }); - let last_active = - focus_stack.and_then(|focus_stack| TilingLayout::last_active_window(tree, focus_stack)); + let last_active = focus_stack + .and_then(|focus_stack| TilingLayout::last_active_window(&mut tree, focus_stack)); let window_id = if let Some((_last_active_window, ref node_id)) = last_active { let orientation = { @@ -353,7 +401,7 @@ impl TilingLayout { } }; let new_id = tree.insert(new_window, InsertBehavior::AsRoot).unwrap(); - TilingLayout::new_group(tree, &node_id, &new_id, orientation).unwrap(); + TilingLayout::new_group(&mut tree, &node_id, &new_id, orientation).unwrap(); new_id } else { // nothing? then we add to the root @@ -367,7 +415,7 @@ impl TilingLayout { } }; let new_id = tree.insert(new_window, InsertBehavior::AsRoot).unwrap(); - TilingLayout::new_group(tree, &root_id, &new_id, orientation).unwrap(); + TilingLayout::new_group(&mut tree, &root_id, &new_id, orientation).unwrap(); new_id } else { tree.insert(new_window, InsertBehavior::AsRoot).unwrap() @@ -375,15 +423,23 @@ impl TilingLayout { }; *window.tiling_node_id.lock().unwrap() = Some(window_id); + + let blocker = TilingLayout::update_positions(output, &mut tree, self.gaps); + queue.push_tree(tree, blocker); } pub fn unmap(&mut self, window: &CosmicMapped) -> Option { let output = { let node_id = window.tiling_node_id.lock().unwrap().clone()?; - self.trees + self.queues .iter() - .find(|(_, tree)| { - tree.get(&node_id) + .find(|(_, queue)| { + queue + .trees + .back() + .unwrap() + .0 + .get(&node_id) .map(|node| node.data().is_mapped(Some(window))) .unwrap_or(false) }) @@ -391,19 +447,23 @@ impl TilingLayout { }; self.unmap_window_internal(window); + window.output_leave(&output); window.set_tiled(false); - self.refresh(); Some(output) } fn unmap_window_internal(&mut self, mapped: &CosmicMapped) { - if let Some(node_id) = mapped.tiling_node_id.lock().unwrap().as_ref() { - if let Some(tree) = self.trees.values_mut().find(|tree| { - tree.get(node_id) + let tiling_node_id = mapped.tiling_node_id.lock().unwrap().as_ref().cloned(); + if let Some(node_id) = tiling_node_id { + if let Some((output, queue)) = self.queues.iter_mut().find(|(_, queue)| { + let tree = &queue.trees.back().unwrap().0; + tree.get(&node_id) .map(|node| node.data().is_mapped(Some(mapped))) .unwrap_or(false) }) { + let mut tree = queue.trees.back().unwrap().0.copy_clone(); + let parent_id = tree .get(&node_id) .ok() @@ -412,7 +472,7 @@ impl TilingLayout { let position = parent_id.as_ref().and_then(|parent_id| { tree.children_ids(&parent_id) .unwrap() - .position(|id| id == node_id) + .position(|id| id == &node_id) }); let parent_parent_id = parent_id.as_ref().and_then(|parent_id| { tree.get(parent_id) @@ -423,7 +483,7 @@ impl TilingLayout { // remove self trace!(?mapped, "Remove window."); - let _ = tree.remove_node(node_id.clone(), RemoveBehavior::DropChildren); + let _ = tree.remove_node(node_id, RemoveBehavior::DropChildren); // fixup parent node match parent_id { @@ -457,6 +517,9 @@ impl TilingLayout { } None => {} // root } + + let blocker = TilingLayout::update_positions(&output.output, &mut tree, self.gaps); + queue.push_tree(tree, blocker); } } } @@ -465,11 +528,12 @@ impl TilingLayout { self.mapped().find_map(|(o, m, _)| (m == elem).then_some(o)) } + // TODO: Move would needs this to be accurate during animations pub fn element_geometry(&self, elem: &CosmicMapped) -> Option> { if let Some(id) = elem.tiling_node_id.lock().unwrap().as_ref() { if let Some(output) = self.output_for_element(elem) { - let (output_data, tree) = self.trees.get_key_value(output).unwrap(); - let node = tree.get(id).ok()?; + let (output_data, queue) = self.queues.get_key_value(output).unwrap(); + let node = queue.trees.back().unwrap().0.get(id).ok()?; let data = node.data(); assert!(data.is_mapped(Some(elem))); let mut geo = *data.geometry(); @@ -486,9 +550,10 @@ impl TilingLayout { seat: &Seat, ) -> Option { let output = seat.active_output(); - let tree = self.trees.get_mut(&output).unwrap(); + let queue = self.queues.get_mut(&output).unwrap(); + let mut tree = queue.trees.back().unwrap().0.copy_clone(); - let node_id = match TilingLayout::currently_focused_node(tree, seat) { + let node_id = match TilingLayout::currently_focused_node(&mut tree, seat) { Some(node_id) => node_id, None => { return None; @@ -533,7 +598,7 @@ impl TilingLayout { | (Orientation::Vertical, Direction::Down) ) { TilingLayout::new_group( - tree, + &mut tree, &parent, &node_id, match direction { @@ -556,7 +621,9 @@ impl TilingLayout { .unwrap() .data_mut() .remove_window(og_idx); - self.refresh(); + + let blocker = TilingLayout::update_positions(&output, &mut tree, self.gaps); + queue.push_tree(tree, blocker); return None; } @@ -580,7 +647,9 @@ impl TilingLayout { .unwrap() .data_mut() .remove_window(og_idx); - self.refresh(); + + let blocker = TilingLayout::update_positions(&output, &mut tree, self.gaps); + queue.push_tree(tree, blocker); return None; } @@ -646,7 +715,7 @@ impl TilingLayout { .unwrap() .clone(); TilingLayout::new_group( - tree, + &mut tree, &old_id, &node_id, !group_orientation, @@ -678,7 +747,8 @@ impl TilingLayout { .swap_windows(idx, next_idx); } else { // else we make a new fork - TilingLayout::new_group(tree, &next_child_id, &node_id, orientation).unwrap(); + TilingLayout::new_group(&mut tree, &next_child_id, &node_id, orientation) + .unwrap(); tree.make_nth_sibling( &node_id, if direction == Direction::Left || direction == Direction::Up { @@ -693,7 +763,9 @@ impl TilingLayout { .data_mut() .remove_window(og_idx); } - self.refresh(); + + let blocker = TilingLayout::update_positions(&output, &mut tree, self.gaps); + queue.push_tree(tree, blocker); return None; } @@ -715,7 +787,7 @@ impl TilingLayout { focus_stack: impl Iterator + 'a, ) -> FocusResult { let output = seat.active_output(); - let tree = self.trees.get_mut(&output).unwrap(); + let tree = &self.queues.get(&output).unwrap().trees.back().unwrap().0; // TODO: Rather use something like seat.current_keyboard_focus // TODO https://github.com/Smithay/smithay/pull/777 @@ -860,8 +932,10 @@ impl TilingLayout { focus_stack: impl Iterator + 'a, ) { let output = seat.active_output(); - let tree = self.trees.get_mut(&output).unwrap(); - if let Some((_, last_active)) = TilingLayout::last_active_window(tree, focus_stack) { + let Some(queue) = self.queues.get_mut(&output) else { return }; + let mut tree = queue.trees.back().unwrap().0.copy_clone(); + + if let Some((_, last_active)) = TilingLayout::last_active_window(&tree, focus_stack) { if let Some(group) = tree.get(&last_active).unwrap().parent().cloned() { if let &mut Data::Group { ref mut orientation, @@ -890,13 +964,15 @@ impl TilingLayout { } *orientation = new_orientation; + + let blocker = TilingLayout::update_positions(&output, &mut tree, self.gaps); + queue.push_tree(tree, blocker); } } } - self.refresh(); } - pub fn refresh<'a>(&mut self) { + pub fn refresh(&mut self) { #[cfg(feature = "debug")] puffin::profile_function!(); @@ -908,53 +984,47 @@ impl TilingLayout { for dead_window in dead_windows.iter() { self.unmap_window_internal(&dead_window); } - // flatten trees - for tree in self.trees.values_mut() { - let root_id = match tree.root_node_id() { - Some(root) => root, - None => { + + for (_, mapped, _) in self.mapped() { + mapped.refresh(); + } + } + + pub fn animations_going(&self) -> bool { + self.queues + .values() + .any(|queue| queue.animation_start.is_some()) + } + + pub fn update_animation_state(&mut self, handle: &LoopHandle<'static, crate::state::Data>) { + for blocker in self.pending_blockers.drain(..) { + blocker.signal_ready(handle); + } + for queue in self.queues.values_mut() { + if let Some(start) = queue.animation_start { + let duration_since_start = Instant::now().duration_since(start); + if duration_since_start > ANIMATION_DURATION { + assert!(queue.trees.len() >= 2); + let _ = queue.animation_start.take(); + let _ = queue.trees.pop_front(); + let _ = queue.trees.front_mut().unwrap().1.take(); + } else { continue; } - }; - for node_id in tree - .traverse_pre_order_ids(root_id) - .unwrap() - .collect::>() - .into_iter() - { - let node = tree.get(&node_id).unwrap(); - let data = node.data(); - if data.is_group() && data.len() == 1 { - // RemoveBehavior::LiftChildren sadly does not what we want: lifting them into the same place. - // So we need to fix that manually.. - let child_id = tree - .children_ids(&node_id) - .unwrap() - .cloned() - .next() - .unwrap(); - let idx = node.parent().map(|parent_id| { - tree.children_ids(&parent_id) - .unwrap() - .position(|id| id == &node_id) - .unwrap() - }); - tree.remove_node(node_id, RemoveBehavior::LiftChildren) - .unwrap(); - if let Some(idx) = idx { - tree.make_nth_sibling(&child_id, idx).unwrap(); - } else { - // additionally `RemoveBehavior::LiftChildren` doesn't work, when removing the root-node, - // even with just one child. *sigh* - tree.move_node(&child_id, MoveBehavior::ToRoot).unwrap(); + } + if let Some((_, blocker)) = queue.trees.get(1) { + if blocker + .as_ref() + .map(TilingBlocker::is_ready) + .unwrap_or(true) + { + queue.animation_start = Some(Instant::now()); + if let Some(blocker) = blocker.as_ref() { + blocker.signal_ready(handle) } } } } - for (_, mapped, _) in self.mapped() { - mapped.refresh(); - } - TilingLayout::update_space_positions(&mut self.trees, self.gaps); } pub fn resize_request( @@ -964,7 +1034,8 @@ impl TilingLayout { start_data: PointerGrabStartData, edges: ResizeEdge, ) -> Option { - let (output, mut node_id) = self.trees.iter().find_map(|(output, tree)| { + let (output, mut node_id) = self.queues.iter().find_map(|(output, queue)| { + let tree = &queue.trees.back().unwrap().0; let root_id = tree.root_node_id()?; tree.traverse_pre_order_ids(root_id) .unwrap() @@ -972,7 +1043,8 @@ impl TilingLayout { .map(|id| (&output.output, id)) })?; - let tree = self.trees.get(output).unwrap(); + let queue = self.queues.get(output).unwrap(); + let tree = &queue.trees.back().unwrap().0; while let Some(group_id) = tree.get(&node_id).unwrap().parent() { let orientation = tree.get(group_id).unwrap().data().orientation(); if !((orientation == Orientation::Vertical @@ -1010,7 +1082,7 @@ impl TilingLayout { } fn last_active_window<'a>( - tree: &mut Tree, + tree: &Tree, mut focus_stack: impl Iterator, ) -> Option<(CosmicMapped, NodeId)> { focus_stack @@ -1110,87 +1182,135 @@ impl TilingLayout { Ok(group_id) } - fn update_space_positions(trees: &mut HashMap>, gaps: (i32, i32)) { + fn update_positions( + output: &Output, + tree: &mut Tree, + gaps: (i32, i32), + ) -> Option { #[cfg(feature = "debug")] puffin::profile_function!(); - let (outer, inner) = gaps; - for (output, tree) in trees - .iter_mut() - .map(|(output_data, tree)| (&output_data.output, tree)) - { - if let Some(root) = tree.root_node_id() { - let mut geo = layer_map_for_output(&output).non_exclusive_zone(); - geo.loc.x += outer; - geo.loc.y += outer; - geo.size.w -= outer * 2; - geo.size.h -= outer * 2; - let mut stack = vec![geo]; + if let Some(root_id) = tree.root_node_id() { + let mut configures = Vec::new(); - for node_id in tree - .traverse_pre_order_ids(root) - .unwrap() - .collect::>() - .into_iter() - { + let (outer, inner) = gaps; + let mut geo = layer_map_for_output(&output).non_exclusive_zone(); + geo.loc.x += outer; + geo.loc.y += outer; + geo.size.w -= outer * 2; + geo.size.h -= outer * 2; + let mut stack = vec![geo]; + + for node_id in tree + .traverse_pre_order_ids(root_id) + .unwrap() + .collect::>() + .into_iter() + { + let node = tree.get_mut(&node_id).unwrap(); + let data = node.data_mut(); + + // flatten tree + if data.is_group() && data.len() == 1 { + // RemoveBehavior::LiftChildren sadly does not what we want: lifting them into the same place. + // So we need to fix that manually.. + let idx = node.parent().cloned().map(|parent_id| { + tree.children_ids(&parent_id) + .unwrap() + .position(|id| id == &node_id) + .unwrap() + }); + let child_id = tree + .children_ids(&node_id) + .unwrap() + .cloned() + .next() + .unwrap(); + tree.remove_node(node_id, RemoveBehavior::LiftChildren) + .unwrap(); + if let Some(idx) = idx { + tree.make_nth_sibling(&child_id, idx).unwrap(); + } else { + // additionally `RemoveBehavior::LiftChildren` doesn't work, when removing the root-node, + // even with just one child. *sigh* + tree.move_node(&child_id, MoveBehavior::ToRoot).unwrap(); + } + + continue; + } + + if let Some(mut geo) = stack.pop() { let node = tree.get_mut(&node_id).unwrap(); - if let Some(mut geo) = stack.pop() { - let data = node.data_mut(); - match data { - Data::Group { - orientation, sizes, .. - } => { - match orientation { - Orientation::Horizontal => { - let mut previous: i32 = sizes.iter().sum(); - for size in sizes.iter().rev() { - previous -= *size; - stack.push(Rectangle::from_loc_and_size( - (geo.loc.x, geo.loc.y + previous), - (geo.size.w, *size), - )); - } - } - Orientation::Vertical => { - let mut previous: i32 = sizes.iter().sum(); - for size in sizes.iter().rev() { - previous -= *size; - stack.push(Rectangle::from_loc_and_size( - (geo.loc.x + previous, geo.loc.y), - (*size, geo.size.h), - )); - } - } + let data = node.data_mut(); + if data.is_mapped(None) { + geo.loc += (inner, inner).into(); + geo.size -= (inner * 2, inner * 2).into(); + } + data.update_geometry(geo); + + match data { + Data::Group { + orientation, sizes, .. + } => match orientation { + Orientation::Horizontal => { + let mut previous: i32 = sizes.iter().sum(); + for size in sizes.iter().rev() { + previous -= *size; + stack.push(Rectangle::from_loc_and_size( + (geo.loc.x, geo.loc.y + previous), + (geo.size.w, *size), + )); } - data.update_geometry(geo); } - Data::Mapped { mapped, .. } => { - geo.loc += (inner, inner).into(); - if !(mapped.is_fullscreen() || mapped.is_maximized()) { - mapped.set_tiled(true); - let size = (geo.size.w - inner * 2, geo.size.h - inner * 2); - let internal_geometry = Rectangle::from_loc_and_size( - geo.loc + output.geometry().loc, - size, - ); - if mapped.geometry() != internal_geometry { - mapped.set_geometry(internal_geometry); - mapped.configure(); + Orientation::Vertical => { + let mut previous: i32 = sizes.iter().sum(); + for size in sizes.iter().rev() { + previous -= *size; + stack.push(Rectangle::from_loc_and_size( + (geo.loc.x + previous, geo.loc.y), + (*size, geo.size.h), + )); + } + } + }, + Data::Mapped { mapped, .. } => { + if !(mapped.is_fullscreen() || mapped.is_maximized()) { + mapped.set_tiled(true); + let internal_geometry = Rectangle::from_loc_and_size( + geo.loc + output.geometry().loc, + geo.size, + ); + if mapped.geometry() != internal_geometry { + mapped.set_geometry(internal_geometry); + if let Some(serial) = mapped.configure() { + configures.push((mapped.active_window(), serial)); } } - data.update_geometry(geo); } } } } } + + if !configures.is_empty() { + let blocker = TilingBlocker::new(configures); + for (surface, _) in &blocker.necessary_acks { + if let Some(surface) = surface.wl_surface() { + add_blocker(&surface, blocker.clone()); + } + } + return Some(blocker); + } } + + None } pub fn mapped(&self) -> impl Iterator)> { - self.trees + self.queues .iter() - .flat_map(|(output_data, tree)| { + .flat_map(|(output_data, queue)| { + let tree = &queue.trees.back().unwrap().0; if let Some(root) = tree.root_node_id() { Some( tree.traverse_pre_order(root) @@ -1252,15 +1372,20 @@ impl TilingLayout { } pub fn merge(&mut self, other: TilingLayout) { - for (output_data, src) in other.trees { - let mut dst = self.trees.entry(output_data.clone()).or_default(); + for (output_data, mut src_queue) in other.queues { + let src = src_queue.trees.pop_back().unwrap().0; + let dst_queue = self.queues.entry(output_data.clone()).or_default(); + let mut dst = dst_queue.trees.back().unwrap().0.copy_clone(); + let orientation = match output_data.output.geometry().size { x if x.w >= x.h => Orientation::Vertical, _ => Orientation::Horizontal, }; TilingLayout::merge_trees(src, &mut dst, orientation); + + let blocker = TilingLayout::update_positions(&output_data.output, &mut dst, self.gaps); + dst_queue.push_tree(dst, blocker); } - self.refresh(); } fn merge_trees(src: Tree, dst: &mut Tree, orientation: Orientation) { @@ -1320,25 +1445,124 @@ impl TilingLayout { let output_scale = output.current_scale().fractional_scale(); - if !self.trees.contains_key(output) { + if !self.queues.contains_key(output) { return Err(OutputNotMapped); } - Ok(self - .trees - .iter() - .flat_map(|(output_data, tree)| { - if &output_data.output != output { - return None; - } + let queue = self.queues.get(output).unwrap(); + let (target_tree, _) = if queue.animation_start.is_some() { + queue + .trees + .get(1) + .expect("Animation ongoing, should have two trees") + } else { + queue.trees.front().unwrap() + }; + let reference_tree = queue + .animation_start + .is_some() + .then(|| &queue.trees.front().unwrap().0); - if let Some(root) = tree.root_node_id() { - Some( - tree.traverse_pre_order(root) + let percentage = if let Some(animation_start) = queue.animation_start { + let percentage = Instant::now().duration_since(animation_start).as_millis() as f32 + / ANIMATION_DURATION.as_millis() as f32; + Ease::Cubic(Cubic::Out).tween(percentage) + } else { + 1.0 + }; + + let mut elements = Vec::new(); + + // all old windows and fade them out + if let Some(reference_tree) = reference_tree.as_ref() { + if let Some(root) = reference_tree.root_node_id() { + elements.extend( + reference_tree + .traverse_pre_order(root) + .unwrap() + .filter(|node| node.data().is_mapped(None)) + .map(|node| match node.data() { + Data::Mapped { + mapped, + last_geometry, + .. + } => (mapped, last_geometry), + _ => unreachable!(), + }) + .filter(|(mapped, _)| { + if let Some(root) = target_tree.root_node_id() { + !target_tree + .traverse_pre_order(root) + .unwrap() + .any(|node| node.data().is_mapped(Some(mapped))) + } else { + true + } + }) + .flat_map(|(mapped, geo)| { + let crop_rect = geo.clone(); + AsRenderElements::::render_elements::>( + mapped, + renderer, + geo.loc.to_physical_precise_round(output_scale) + - mapped + .geometry() + .loc + .to_physical_precise_round(output_scale), + Scale::from(output_scale), + 1.0 - percentage, + ) + .into_iter() + .flat_map(|element| match element { + CosmicMappedRenderElement::Stack(elem) => { + CropRenderElement::from_element( + elem, + output_scale, + crop_rect.to_physical_precise_round(output_scale), + ) + .map(CosmicMappedRenderElement::CroppedStack) + } + CosmicMappedRenderElement::Window(elem) => { + CropRenderElement::from_element( + elem, + output_scale, + crop_rect.to_physical_precise_round(output_scale), + ) + .map(CosmicMappedRenderElement::CroppedWindow) + } + x => Some(x), + }) + .collect::>() + }), + ) + } + } + + if let Some(root) = target_tree.root_node_id() { + elements.extend( + target_tree + .traverse_pre_order(root) + .unwrap() + .filter(|node| node.data().is_mapped(None)) + .filter(|node| match node.data() { + Data::Mapped { mapped, .. } => mapped.is_activated(), + _ => unreachable!(), + }) + .map(|node| match node.data() { + Data::Mapped { + mapped, + last_geometry, + .. + } => (mapped, last_geometry), + _ => unreachable!(), + }) + .chain( + target_tree + .traverse_pre_order(root) .unwrap() .filter(|node| node.data().is_mapped(None)) .filter(|node| match node.data() { - Data::Mapped { mapped, .. } => mapped.is_activated(), + Data::Mapped { mapped, .. } => !mapped.is_activated(), _ => unreachable!(), }) .map(|node| match node.data() { @@ -1346,56 +1570,116 @@ impl TilingLayout { mapped, last_geometry, .. - } => (mapped, last_geometry.loc), + } => (mapped, last_geometry), _ => unreachable!(), - }) - .chain( - tree.traverse_pre_order(root) + }), + ) + .flat_map(|(mapped, new_geo)| { + let old_geo = if let Some(reference_tree) = reference_tree.as_ref() { + if let Some(root) = reference_tree.root_node_id() { + reference_tree + .traverse_pre_order(root) .unwrap() - .filter(|node| node.data().is_mapped(None)) - .filter(|node| match node.data() { - Data::Mapped { mapped, .. } => !mapped.is_activated(), + .find(|node| node.data().is_mapped(Some(mapped))) + .map(|node| match node.data() { + Data::Mapped { last_geometry, .. } => last_geometry, _ => unreachable!(), }) - .map(|node| match node.data() { - Data::Mapped { - mapped, - last_geometry, - .. - } => (mapped, last_geometry.loc), - _ => unreachable!(), - }), - ), - ) - } else { - None - } - }) - .flatten() - .flat_map(|(mapped, loc)| { - let mut elements = - AsRenderElements::::render_elements::>( - mapped, - renderer, - loc.to_physical_precise_round(output_scale) - - mapped - .geometry() - .loc - .to_physical_precise_round(output_scale), - Scale::from(output_scale), - ); - if focused == Some(mapped) { - if indicator_thickness > 0 { - let element = IndicatorShader::element( - renderer, - Rectangle::from_loc_and_size(loc, mapped.geometry().size), - indicator_thickness, - ); - elements.insert(0, element.into()); - } - } - elements - }) - .collect::>()) + } else { + None + } + } else { + None + }; + + let (geo, alpha) = if let Some(old_geo) = old_geo { + ( + Rectangle::from_loc_and_size( + ( + old_geo.loc.x + + ((new_geo.loc.x - old_geo.loc.x) as f32 * percentage) + .round() + as i32, + old_geo.loc.y + + ((new_geo.loc.y - old_geo.loc.y) as f32 * percentage) + .round() + as i32, + ), + ( + old_geo.size.w + + ((new_geo.size.w - old_geo.size.w) as f32 + * percentage) + .round() + as i32, + old_geo.size.h + + ((new_geo.size.h - old_geo.size.h) as f32 + * percentage) + .round() + as i32, + ), + ), + 1.0, + ) + } else { + // TODO: If old_geo.is_none() animate alpha - fade in + (*new_geo, percentage) + }; + + if alpha < 1.0 { + dbg!(alpha); + } + + let crop_rect = geo.clone(); + let mut elements = + AsRenderElements::::render_elements::>( + mapped, + renderer, + geo.loc.to_physical_precise_round(output_scale) + - mapped + .geometry() + .loc + .to_physical_precise_round(output_scale), + Scale::from(output_scale), + alpha, + ) + .into_iter() + .flat_map(|element| match element { + CosmicMappedRenderElement::Stack(elem) => { + CropRenderElement::from_element( + elem, + output_scale, + crop_rect.to_physical_precise_round(output_scale), + ) + .map(CosmicMappedRenderElement::CroppedStack) + } + CosmicMappedRenderElement::Window(elem) => { + CropRenderElement::from_element( + elem, + output_scale, + crop_rect.to_physical_precise_round(output_scale), + ) + .map(CosmicMappedRenderElement::CroppedWindow) + } + x => Some(x), + }) + .collect::>(); + + if focused == Some(mapped) { + if indicator_thickness > 0 { + let element = IndicatorShader::element( + renderer, + geo, + indicator_thickness, + 1.0, + ); + elements.insert(0, element.into()); + } + } + elements + }), + ) + } + + Ok(elements) } } diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 0ff4b8e6..47f11785 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -1,3 +1,4 @@ +use calloop::LoopHandle; use serde::{Deserialize, Serialize}; use std::{cell::RefCell, collections::HashMap}; use tracing::warn; @@ -1036,6 +1037,18 @@ impl Shell { } } + pub fn animations_going(&self) -> bool { + self.workspaces + .spaces() + .any(|workspace| workspace.animations_going()) + } + + pub fn update_animations(&mut self, handle: &LoopHandle<'static, crate::state::Data>) { + for workspace in self.workspaces.spaces_mut() { + workspace.update_animations(handle) + } + } + pub fn refresh(&mut self) { #[cfg(feature = "debug")] puffin::profile_function!(); diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index d48d38ec..1ae1239f 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -17,6 +17,7 @@ use crate::{ xwayland::XWaylandState, }; +use calloop::LoopHandle; use indexmap::IndexSet; use smithay::{ backend::renderer::{ @@ -85,6 +86,14 @@ impl Workspace { self.tiling_layer.refresh(); } + pub fn animations_going(&self) -> bool { + self.tiling_layer.animations_going() + } + + pub fn update_animations(&mut self, handle: &LoopHandle<'static, crate::state::Data>) { + self.tiling_layer.update_animation_state(handle) + } + pub fn commit(&mut self, surface: &WlSurface) { if let Some(mapped) = self.element_for_wl_surface(surface) { mapped @@ -484,6 +493,7 @@ impl Workspace { renderer, loc.to_physical_precise_round(output_scale), Scale::from(output_scale), + 1.0, ) }), ); @@ -499,6 +509,7 @@ impl Workspace { (or.geometry().loc - output.geometry().loc) .to_physical_precise_round(output_scale), Scale::from(output_scale), + 1.0, ) }), ); @@ -507,7 +518,11 @@ impl Workspace { render_elements.extend(AsRenderElements::::render_elements::< WorkspaceRenderElement, >( - fullscreen, renderer, (0, 0).into(), output_scale.into() + fullscreen, + renderer, + (0, 0).into(), + output_scale.into(), + 1.0, )); if let Some(xwm) = xwm_state.and_then(|state| state.xwm.as_mut()) { @@ -551,6 +566,7 @@ impl Workspace { renderer, loc.to_physical_precise_round(output_scale), Scale::from(output_scale), + 1.0, ) }), ); @@ -570,6 +586,7 @@ impl Workspace { (or.geometry().loc - output.geometry().loc) .to_physical_precise_round(output_scale), Scale::from(output_scale), + 1.0, ) }), ); @@ -620,6 +637,7 @@ impl Workspace { renderer, loc.to_physical_precise_round(output_scale), Scale::from(output_scale), + 1.0, ) }), ); @@ -715,6 +733,13 @@ where WorkspaceRenderElement::Window(elem) => elem.opaque_regions(scale), } } + + fn alpha(&self) -> f32 { + match self { + WorkspaceRenderElement::Wayland(elem) => elem.alpha(), + WorkspaceRenderElement::Window(elem) => elem.alpha(), + } + } } impl RenderElement for WorkspaceRenderElement diff --git a/src/state.rs b/src/state.rs index 3597e341..39772323 100644 --- a/src/state.rs +++ b/src/state.rs @@ -50,7 +50,7 @@ use smithay::{ }, utils::{Clock, IsAlive, Monotonic}, wayland::{ - compositor::CompositorState, + compositor::{CompositorClientState, CompositorState}, data_device::DataDeviceState, dmabuf::{DmabufFeedback, DmabufState}, keyboard_shortcuts_inhibit::KeyboardShortcutsInhibitState, @@ -69,6 +69,7 @@ use std::{cell::RefCell, ffi::OsString, time::Duration}; use std::{collections::VecDeque, time::Instant}; pub struct ClientState { + pub compositor_client_state: CompositorClientState, pub workspace_client_state: WorkspaceClientState, pub drm_node: Option, pub privileged: bool, @@ -312,6 +313,7 @@ impl State { pub fn new_client_state(&self) -> ClientState { ClientState { + compositor_client_state: CompositorClientState::default(), workspace_client_state: WorkspaceClientState::default(), drm_node: match &self.backend { BackendData::Kms(kms_state) => { @@ -334,6 +336,7 @@ impl State { pub fn new_client_state_with_node(&self, drm_node: DrmNode) -> ClientState { ClientState { + compositor_client_state: CompositorClientState::default(), workspace_client_state: WorkspaceClientState::default(), drm_node: Some(drm_node), privileged: false, @@ -342,6 +345,7 @@ impl State { pub fn new_privileged_client_state(&self) -> ClientState { ClientState { + compositor_client_state: CompositorClientState::default(), workspace_client_state: WorkspaceClientState::default(), drm_node: match &self.backend { BackendData::Kms(kms_state) => Some(kms_state.primary), diff --git a/src/utils/iced.rs b/src/utils/iced.rs index 901448fc..b23dc201 100644 --- a/src/utils/iced.rs +++ b/src/utils/iced.rs @@ -567,6 +567,7 @@ where renderer: &mut R, location: Point, scale: Scale, + alpha: f32, ) -> Vec { let mut internal = self.0.lock().unwrap(); @@ -633,7 +634,7 @@ where renderer, location.to_f64(), &buffer, - None, + Some(alpha), Some(Rectangle::from_loc_and_size( (0., 0.), size.to_f64().to_logical(1.0, Transform::Normal), diff --git a/src/wayland/handlers/compositor.rs b/src/wayland/handlers/compositor.rs index f5e447fd..37b87b5e 100644 --- a/src/wayland/handlers/compositor.rs +++ b/src/wayland/handlers/compositor.rs @@ -2,17 +2,22 @@ use crate::{ shell::CosmicSurface, - state::{BackendData, Data}, + state::{BackendData, ClientState, Data}, utils::prelude::*, wayland::protocols::screencopy::SessionType, }; +use calloop::Interest; use smithay::{ backend::renderer::utils::{on_commit_buffer_handler, with_renderer_surface_state}, delegate_compositor, desktop::{layer_map_for_output, LayerSurface, PopupKind, WindowSurfaceType}, - reexports::wayland_server::protocol::wl_surface::WlSurface, + reexports::wayland_server::{protocol::wl_surface::WlSurface, Client, Resource}, wayland::{ - compositor::{with_states, CompositorHandler, CompositorState}, + compositor::{ + add_blocker, add_pre_commit_hook, with_states, BufferAssignment, CompositorClientState, + CompositorHandler, CompositorState, SurfaceAttributes, + }, + dmabuf::get_dmabuf, seat::WaylandFocus, shell::{ wlr_layer::LayerSurfaceAttributes, @@ -21,7 +26,7 @@ use smithay::{ }, }, }, - xwayland::X11Wm, + xwayland::{X11Wm, XWaylandClientData}, }; use std::sync::Mutex; @@ -105,15 +110,63 @@ impl State { } } +pub fn client_compositor_state<'a>(client: &'a Client) -> &'a CompositorClientState { + if let Some(state) = client.get_data::() { + return &state.compositor_state; + } + if let Some(state) = client.get_data::() { + return &state.compositor_client_state; + } + panic!("Unknown client data type") +} + impl CompositorHandler for State { fn compositor_state(&mut self) -> &mut CompositorState { &mut self.common.compositor_state } + fn client_compositor_state<'a>(&self, client: &'a Client) -> &'a CompositorClientState { + client_compositor_state(client) + } + + fn new_surface(&mut self, surface: &WlSurface) { + add_pre_commit_hook::(surface, move |state, _dh, surface| { + let maybe_dmabuf = with_states(surface, |surface_data| { + surface_data + .cached_state + .pending::() + .buffer + .as_ref() + .and_then(|assignment| match assignment { + BufferAssignment::NewBuffer(buffer) => get_dmabuf(buffer).ok(), + _ => None, + }) + }); + if let Some(dmabuf) = maybe_dmabuf { + if let Ok((blocker, source)) = dmabuf.generate_blocker(Interest::READ) { + let client = surface.client().unwrap(); + let res = + state + .common + .event_loop_handle + .insert_source(source, move |_, _, data| { + data.state + .client_compositor_state(&client) + .blocker_cleared(&mut data.state, &data.display.handle()); + Ok(()) + }); + if res.is_ok() { + add_blocker(surface, blocker); + } + } + } + }) + } + fn commit(&mut self, surface: &WlSurface) { X11Wm::commit_hook::(surface); // first load the buffer for various smithay helper functions - on_commit_buffer_handler(surface); + on_commit_buffer_handler::(surface); // then handle initial configure events and map windows if necessary if let Some((window, seat)) = self diff --git a/src/wayland/handlers/screencopy.rs b/src/wayland/handlers/screencopy.rs index 8fffcfea..aebef716 100644 --- a/src/wayland/handlers/screencopy.rs +++ b/src/wayland/handlers/screencopy.rs @@ -947,6 +947,7 @@ pub fn render_window_to_buffer( renderer, (-geometry.loc.x, -geometry.loc.y).into(), Scale::from(1.0), + 1.0, ); for seat in common.seats() {