diff --git a/Cargo.lock b/Cargo.lock index cc3b563..8d831b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,156 +2,12 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ab_glyph" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - [[package]] name = "bytemuck" version = "1.24.0" @@ -213,29 +69,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -245,183 +78,24 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags", - "core-foundation", - "libc", -] - [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "cursor-icon" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - [[package]] name = "downcast-rs" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" -[[package]] -name = "ecolor" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084980ebede2fb1ad6c4f54285b3e489052ef2b6aa4016e4c19349417adc75c5" -dependencies = [ - "bytemuck", - "emath", -] - -[[package]] -name = "egui" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75645894de4ca1695ab3ab7201c7953bb95c1725aafeefa6822dc901ad2a81b" -dependencies = [ - "ahash", - "bitflags", - "emath", - "epaint", - "log", - "nohash-hasher", - "profiling", - "smallvec", - "unicode-segmentation", -] - -[[package]] -name = "egui-wgpu" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdaac35a6e0ff458aaa5776b2bda578e38334a9d1258f7795042a70372745b7" -dependencies = [ - "ahash", - "bytemuck", - "document-features", - "egui", - "epaint", - "log", - "profiling", - "thiserror 2.0.17", - "type-map", - "web-time", - "wgpu", -] - -[[package]] -name = "emath" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e561352ae95c22ad179fb56c38d6e6eecd86cf4925cf5c70e738dd01df9b620" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "env_filter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", -] - -[[package]] -name = "epaint" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a909ce8cee63e8350fb0c251ad39277a5b24f19add60787e84a3b3ab3f2bd83a" -dependencies = [ - "ab_glyph", - "ahash", - "bytemuck", - "ecolor", - "emath", - "epaint_default_fonts", - "log", - "nohash-hasher", - "parking_lot", - "profiling", -] - -[[package]] -name = "epaint_default_fonts" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9649446c23368ae138716910e3e28143995691b598fbb9de16b42b0722cbcc" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - [[package]] name = "errno" version = "0.3.14" @@ -442,171 +116,8 @@ checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" name = "floating-calculator" version = "0.1.0" dependencies = [ - "egui", - "egui-wgpu", - "env_logger", - "log", - "pollster", - "raw-window-handle", "smithay-client-toolkit", - "smithay-clipboard", - "wayland-backend", "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", - "wgpu", -] - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[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", -] - -[[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", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glow" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags", -] - -[[package]] -name = "gpu-allocator" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" -dependencies = [ - "log", - "presser", - "thiserror 1.0.69", - "windows", -] - -[[package]] -name = "gpu-descriptor" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" -dependencies = [ - "bitflags", - "gpu-descriptor-types", - "hashbrown 0.15.5", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" -dependencies = [ - "bitflags", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "num-traits", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "foldhash 0.2.0", ] [[package]] @@ -615,143 +126,24 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "jiff" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" -dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", -] - -[[package]] -name = "jiff-static" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "js-sys" -version = "0.3.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", - "pkg-config", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - [[package]] name = "libc" version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - [[package]] name = "linux-raw-sys" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "memchr" version = "2.7.6" @@ -767,140 +159,6 @@ dependencies = [ "libc", ] -[[package]] -name = "metal" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" -dependencies = [ - "bitflags", - "block", - "core-graphics-types", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "naga" -version = "27.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags", - "cfg-if", - "cfg_aliases", - "codespan-reporting", - "half", - "hashbrown 0.16.1", - "hexf-parse", - "indexmap", - "libm", - "log", - "num-traits", - "once_cell", - "rustc-hash 1.1.0", - "spirv", - "thiserror 2.0.17", - "unicode-ident", -] - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "ordered-float" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -927,33 +185,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - -[[package]] -name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "presser" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" - [[package]] name = "proc-macro2" version = "1.0.103" @@ -963,12 +194,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "profiling" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" - [[package]] name = "quick-xml" version = "0.37.5" @@ -987,74 +212,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "range-alloc" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "renderdoc-sys" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - [[package]] name = "rustix" version = "1.1.2" @@ -1068,54 +225,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "shlex" version = "1.3.0" @@ -1128,15 +237,6 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - [[package]] name = "smallvec" version = "1.15.1" @@ -1159,7 +259,7 @@ dependencies = [ "memmap2", "pkg-config", "rustix", - "thiserror 2.0.17", + "thiserror", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -1173,32 +273,6 @@ dependencies = [ "xkeysym", ] -[[package]] -name = "smithay-clipboard" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" -dependencies = [ - "libc", - "smithay-client-toolkit", - "wayland-backend", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "syn" version = "2.0.111" @@ -1210,42 +284,13 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "thiserror-impl", ] [[package]] @@ -1276,109 +321,12 @@ version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "type-map" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" -dependencies = [ - "rustc-hash 2.1.1", -] - [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasm-bindgen" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" -dependencies = [ - "unicode-ident", -] - [[package]] name = "wayland-backend" version = "0.3.11" @@ -1388,7 +336,6 @@ dependencies = [ "cc", "downcast-rs", "rustix", - "scoped-tls", "smallvec", "wayland-sys", ] @@ -1495,262 +442,15 @@ version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ - "dlib", - "log", - "once_cell", "pkg-config", ] -[[package]] -name = "web-sys" -version = "0.3.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wgpu" -version = "27.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" -dependencies = [ - "arrayvec", - "bitflags", - "cfg-if", - "cfg_aliases", - "document-features", - "hashbrown 0.16.1", - "js-sys", - "log", - "naga", - "parking_lot", - "portable-atomic", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core" -version = "27.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" -dependencies = [ - "arrayvec", - "bit-set", - "bit-vec", - "bitflags", - "bytemuck", - "cfg_aliases", - "document-features", - "hashbrown 0.16.1", - "indexmap", - "log", - "naga", - "once_cell", - "parking_lot", - "portable-atomic", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 2.0.17", - "wgpu-core-deps-apple", - "wgpu-core-deps-emscripten", - "wgpu-core-deps-windows-linux-android", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core-deps-apple" -version = "27.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-core-deps-emscripten" -version = "27.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-core-deps-windows-linux-android" -version = "27.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-hal" -version = "27.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set", - "bitflags", - "block", - "bytemuck", - "cfg-if", - "cfg_aliases", - "core-graphics-types", - "glow", - "glutin_wgl_sys", - "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", - "hashbrown 0.16.1", - "js-sys", - "khronos-egl", - "libc", - "libloading", - "log", - "metal", - "naga", - "ndk-sys", - "objc", - "once_cell", - "ordered-float", - "parking_lot", - "portable-atomic", - "portable-atomic-util", - "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", - "smallvec", - "thiserror 2.0.17", - "wasm-bindgen", - "web-sys", - "wgpu-types", - "windows", - "windows-core", -] - -[[package]] -name = "wgpu-types" -version = "27.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" -dependencies = [ - "bitflags", - "bytemuck", - "js-sys", - "log", - "thiserror 2.0.17", - "web-sys", -] - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core", - "windows-targets", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -1760,70 +460,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - [[package]] name = "xcursor" version = "0.3.10" @@ -1849,29 +485,3 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" dependencies = [ "bytemuck", ] - -[[package]] -name = "xml-rs" -version = "0.8.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" - -[[package]] -name = "zerocopy" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index b3c05f4..05c3e08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,16 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] -egui = "0.33.2" -egui-wgpu = "0.33.2" -env_logger = "0.11.8" -log = "0.4.28" -pollster = "0.4.0" -raw-window-handle = "0.6.2" smithay-client-toolkit = "0.20.0" -smithay-clipboard = "0.7" -wayland-backend = { version = "0.3.11", features = ["client_system"] } wayland-client = "0.31.11" -wayland-protocols = "0.32.9" -wayland-protocols-wlr = "0.3.9" -wgpu = "27.0.1" diff --git a/flake.nix b/flake.nix index f94e30f..559cdb0 100644 --- a/flake.nix +++ b/flake.nix @@ -21,29 +21,10 @@ gnumake rust-bin.stable.latest.default evcxr - pkg-config libxkbcommon wayland - wayland-protocols - wayland-scanner - - # Graphics libraries for wgpu - vulkan-loader - vulkan-validation-layers - libGL - libxkbcommon + rusty-man ]; - - # Critical: Set library paths for runtime - LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ - pkgs.wayland - pkgs.libxkbcommon - pkgs.vulkan-loader - pkgs.libGL - ]; - - # Ensure Vulkan ICD is findable - VK_LAYER_PATH = "${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d"; }; }; }; diff --git a/src/compositor_handler.rs b/src/compositor_handler.rs new file mode 100644 index 0000000..3af87d0 --- /dev/null +++ b/src/compositor_handler.rs @@ -0,0 +1,56 @@ +use smithay_client_toolkit::compositor::CompositorHandler; +use wayland_client::{Connection, QueueHandle, protocol::wl_output, protocol::wl_surface}; + +use crate::simple_layer::SimpleLayer; + +impl CompositorHandler for SimpleLayer { + fn scale_factor_changed( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _surface: &wl_surface::WlSurface, + _new_factor: i32, + ) { + // Not needed for this example. + } + + fn transform_changed( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _surface: &wl_surface::WlSurface, + _new_transform: wl_output::Transform, + ) { + // Not needed for this example. + } + + fn frame( + &mut self, + _conn: &Connection, + qh: &QueueHandle, + _surface: &wl_surface::WlSurface, + _time: u32, + ) { + self.draw(qh); + } + + fn surface_enter( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _surface: &wl_surface::WlSurface, + _output: &wl_output::WlOutput, + ) { + // Not needed for this example. + } + + fn surface_leave( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _surface: &wl_surface::WlSurface, + _output: &wl_output::WlOutput, + ) { + // Not needed for this example. + } +} diff --git a/src/egui_app.rs b/src/egui_app.rs deleted file mode 100644 index 61bc2b3..0000000 --- a/src/egui_app.rs +++ /dev/null @@ -1,49 +0,0 @@ -use egui::{CentralPanel, Context}; -pub struct EguiApp { - counter: i32, - text: String, -} - -impl EguiApp { - pub fn new() -> Self { - Self { - counter: 0, - text: String::from("Hello from EGUI!"), - } - } - - pub fn ui(&mut self, ctx: &Context) { - CentralPanel::default().show(ctx, |ui| { - ui.heading("Egui WGPU / Smithay example"); - - ui.separator(); - - ui.label(format!("Counter: {}", self.counter)); - if ui.button("Increment").clicked() { - self.counter += 1; - } - if ui.button("Decrement").clicked() { - self.counter -= 1; - } - - ui.separator(); - - ui.horizontal(|ui| { - ui.label("Text input:"); - ui.text_edit_singleline(&mut self.text); - }); - - ui.label(format!("You wrote: {}", self.text)); - - ui.separator(); - - ui.label("This is a simple EGUI app running on Wayland via Smithay toolkit!"); - }); - } -} - -impl Default for EguiApp { - fn default() -> Self { - Self::new() - } -} diff --git a/src/egui_renderer.rs b/src/egui_renderer.rs deleted file mode 100644 index d788436..0000000 --- a/src/egui_renderer.rs +++ /dev/null @@ -1,109 +0,0 @@ -// Original for Winit: -// https://github.com/kaphula/winit-egui-wgpu-template/blob/master/src/egui_tools.rs - -use egui::Context; -use egui_wgpu::wgpu::{CommandEncoder, Device, Queue, StoreOp, TextureFormat, TextureView}; -use egui_wgpu::{Renderer, RendererOptions, ScreenDescriptor, wgpu}; - -pub struct EguiRenderer { - context: Context, - renderer: Renderer, - frame_started: bool, -} - -impl EguiRenderer { - pub fn context(&self) -> &Context { - &self.context - } - - pub fn context_mut(&mut self) -> &mut Context { - &mut self.context - } - - pub fn new( - device: &Device, - output_color_format: TextureFormat, - output_depth_format: Option, - msaa_samples: u32, - ) -> EguiRenderer { - let egui_context = Context::default(); - - let egui_renderer = Renderer::new( - device, - output_color_format, - RendererOptions { - msaa_samples, - depth_stencil_format: output_depth_format, - - ..Default::default() - } - ); - - EguiRenderer { - context: egui_context, - renderer: egui_renderer, - frame_started: false, - } - } - - pub fn ppp(&mut self, v: f32) { - self.context.set_pixels_per_point(v); - } - - pub fn begin_frame(&mut self, raw_input: egui::RawInput) { - self.context.begin_pass(raw_input); - self.frame_started = true; - } - - pub fn end_frame_and_draw( - &mut self, - device: &Device, - queue: &Queue, - encoder: &mut CommandEncoder, - window_surface_view: &TextureView, - screen_descriptor: ScreenDescriptor, - ) -> egui::PlatformOutput { - if !self.frame_started { - panic!("begin_frame must be called before end_frame_and_draw can be called!"); - } - - self.ppp(screen_descriptor.pixels_per_point); - - let full_output = self.context.end_pass(); - - let tris = self - .context - .tessellate(full_output.shapes, self.context.pixels_per_point()); - for (id, image_delta) in &full_output.textures_delta.set { - self.renderer - .update_texture(device, queue, *id, image_delta); - } - self.renderer - .update_buffers(device, queue, encoder, &tris, &screen_descriptor); - let rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: window_surface_view, - resolve_target: None, - depth_slice: None, - ops: egui_wgpu::wgpu::Operations { - load: egui_wgpu::wgpu::LoadOp::Load, - store: StoreOp::Store, - }, - })], - depth_stencil_attachment: None, - timestamp_writes: None, - label: Some("egui main render pass"), - occlusion_query_set: None, - }); - - self.renderer - .render(&mut rpass.forget_lifetime(), &tris, &screen_descriptor); - for x in &full_output.textures_delta.free { - self.renderer.free_texture(x) - } - - self.frame_started = false; - - full_output.platform_output - } -} diff --git a/src/input_handler.rs b/src/input_handler.rs deleted file mode 100644 index 092d35d..0000000 --- a/src/input_handler.rs +++ /dev/null @@ -1,378 +0,0 @@ -use egui::{Event, Key, Modifiers, PointerButton, Pos2, RawInput}; -use log::trace; -use smithay_client_toolkit::seat::keyboard::{KeyEvent, Keysym, Modifiers as WaylandModifiers}; -use smithay_client_toolkit::seat::pointer::{PointerEvent, PointerEventKind}; -use smithay_clipboard::Clipboard; -use std::time::Instant; - -pub struct InputState { - modifiers: Modifiers, - pointer_pos: Pos2, - events: Vec, - screen_width: u32, - screen_height: u32, - start_time: Instant, - clipboard: Clipboard, - last_key_utf8: Option, -} - -impl InputState { - pub fn new(clipboard: Clipboard) -> Self { - Self { - modifiers: Modifiers::default(), - pointer_pos: Pos2::ZERO, - events: Vec::new(), - screen_width: 256, - screen_height: 256, - start_time: Instant::now(), - // pressed_keys: std::collections::HashSet::new(), - clipboard, - last_key_utf8: None, - } - } - - pub fn set_screen_size(&mut self, width: u32, height: u32) { - self.screen_width = width; - self.screen_height = height; - } - - pub fn handle_pointer_event(&mut self, event: &PointerEvent) { - trace!("[INPUT] Pointer event: {:?}", event.kind); - match &event.kind { - PointerEventKind::Enter { .. } => { - trace!("[INPUT] Pointer entered surface"); - // Pointer entered the surface - } - PointerEventKind::Leave { .. } => { - trace!("[INPUT] Pointer left surface"); - // Pointer left the surface - self.events.push(Event::PointerGone); - } - PointerEventKind::Motion { .. } => { - let (x, y) = event.position; - self.pointer_pos = Pos2::new(x as f32, y as f32); - trace!("[INPUT] Pointer moved to: ({}, {})", x, y); - self.events.push(Event::PointerMoved(self.pointer_pos)); - } - PointerEventKind::Press { button, .. } => { - trace!("[INPUT] Pointer button pressed: {}", button); - if let Some(egui_button) = wayland_button_to_egui(*button) { - trace!("[INPUT] Mapped to EGUI button: {:?}", egui_button); - self.events.push(Event::PointerButton { - pos: self.pointer_pos, - button: egui_button, - pressed: true, - modifiers: self.modifiers, - }); - } - } - PointerEventKind::Release { button, .. } => { - trace!("[INPUT] Pointer button released: {}", button); - if let Some(egui_button) = wayland_button_to_egui(*button) { - self.events.push(Event::PointerButton { - pos: self.pointer_pos, - button: egui_button, - pressed: false, - modifiers: self.modifiers, - }); - } - } - PointerEventKind::Axis { - horizontal, - vertical, - .. - } => { - // Handle scroll events - let scroll_delta = egui::vec2( - horizontal.discrete as f32 * 10.0, - vertical.discrete as f32 * 10.0, - ); - - if scroll_delta != egui::Vec2::ZERO { - self.events.push(Event::MouseWheel { - unit: egui::MouseWheelUnit::Line, - delta: scroll_delta, - modifiers: self.modifiers, - }); - } - } - } - } - - pub fn handle_keyboard_event(&mut self, event: &KeyEvent, pressed: bool, is_repeat: bool) { - trace!( - "[INPUT] Keyboard event - keysym: {:?}, raw_code: {}, pressed: {}, repeat: {}, utf8: {:?}", - event.keysym.raw(), - event.raw_code, - pressed, - is_repeat, - event.utf8 - ); - - // Check for clipboard operations BEFORE general key handling - if pressed && !is_repeat && self.modifiers.ctrl { - // XKB key constants - const XKB_KEY_c: u32 = 0x0063; - const XKB_KEY_x: u32 = 0x0078; - const XKB_KEY_v: u32 = 0x0076; - - match event.keysym.raw() { - XKB_KEY_c => self.events.push(Event::Copy), - XKB_KEY_x => self.events.push(Event::Cut), - XKB_KEY_v => self - .events - .push(Event::Paste(self.clipboard.load().unwrap_or_default())), - _ => (), - } - } - - if let Some(key) = keysym_to_egui_key(event.keysym) { - trace!( - "[INPUT] Mapped to EGUI key: {:?}, repeat: {}", - key, is_repeat - ); - // Note: Egui expects repeats to have pressed=true - self.events.push(Event::Key { - key, - physical_key: None, - pressed, - repeat: is_repeat, - modifiers: self.modifiers, - }); - if pressed || is_repeat { - let text = event.utf8.clone().or(self.last_key_utf8.clone()); - if let Some(text) = text { - if !text.chars().any(|c| c.is_control()) { - trace!("[INPUT] Text input: '{}'", text); - self.events.push(Event::Text(text.clone())); - } - } - } - } else { - trace!( - "[INPUT] No EGUI key mapping for keysym: {:?}", - event.keysym.raw() - ); - } - - if event.utf8.is_some() { - self.last_key_utf8 = event.utf8.clone(); - } - } - - pub fn update_modifiers(&mut self, wayland_mods: &WaylandModifiers) { - trace!( - "[INPUT] Modifiers updated - ctrl: {}, shift: {}, alt: {}", - wayland_mods.ctrl, wayland_mods.shift, wayland_mods.alt - ); - self.modifiers = Modifiers { - alt: wayland_mods.alt, - ctrl: wayland_mods.ctrl, - shift: wayland_mods.shift, - mac_cmd: false, // Not applicable on Linux/Wayland - command: wayland_mods.ctrl, // On non-Mac, command is ctrl - }; - } - - /// Get current modifiers state - // pub fn get_modifiers(&self) -> &Modifiers { - // &self.modifiers - // } - - pub fn take_raw_input(&mut self) -> RawInput { - let events = std::mem::take(&mut self.events); - trace!("[INPUT] Taking raw input with {} events", events.len()); - if !events.is_empty() { - trace!("[INPUT] Events: {:?}", events); - } - - RawInput { - screen_rect: Some(egui::Rect::from_min_size( - Pos2::ZERO, - egui::vec2(self.screen_width as f32, self.screen_height as f32), - )), - time: Some(self.start_time.elapsed().as_secs_f64()), - predicted_dt: 1.0 / 60.0, // Assume 60 FPS - modifiers: self.modifiers, - events, - hovered_files: Vec::new(), - dropped_files: Vec::new(), - focused: true, // Assume focused when we have the input - ..Default::default() - } - } - - pub fn handle_output_command(&mut self, output: &egui::OutputCommand) { - match output { - egui::OutputCommand::CopyText(text) => { - self.clipboard.store(text.clone()); - trace!("[INPUT] Copied text to clipboard: {:?}", text); - } - egui::OutputCommand::CopyImage(_image) => { - // Handle image copy if needed - trace!("[INPUT] CopyImage command received (not implemented)"); - // TODO: Implement image copying to clipboard if required - } - egui::OutputCommand::OpenUrl(url) => { - trace!("[INPUT] OpenUrl command received: {}", url.url); - } - } - } -} - -fn wayland_button_to_egui(button: u32) -> Option { - // Linux button codes (from linux/input-event-codes.h) - match button { - 0x110 => Some(PointerButton::Primary), // BTN_LEFT - 0x111 => Some(PointerButton::Secondary), // BTN_RIGHT - 0x112 => Some(PointerButton::Middle), // BTN_MIDDLE - _ => None, - } -} - -fn keysym_to_egui_key(keysym: Keysym) -> Option { - // XKB key constants from xkbcommon - const XKB_KEY_Escape: u32 = 0xff1b; - const XKB_KEY_Return: u32 = 0xff0d; - const XKB_KEY_KP_Enter: u32 = 0xff8d; - const XKB_KEY_Tab: u32 = 0xff09; - const XKB_KEY_BackSpace: u32 = 0xff08; - const XKB_KEY_Insert: u32 = 0xff63; - const XKB_KEY_Delete: u32 = 0xffff; - const XKB_KEY_Home: u32 = 0xff50; - const XKB_KEY_End: u32 = 0xff57; - const XKB_KEY_Page_Up: u32 = 0xff55; - const XKB_KEY_Page_Down: u32 = 0xff56; - const XKB_KEY_Left: u32 = 0xff51; - const XKB_KEY_Right: u32 = 0xff53; - const XKB_KEY_Up: u32 = 0xff52; - const XKB_KEY_Down: u32 = 0xff54; - const XKB_KEY_space: u32 = 0x0020; - - const XKB_KEY_a: u32 = 0x0061; - const XKB_KEY_b: u32 = 0x0062; - const XKB_KEY_c: u32 = 0x0063; - const XKB_KEY_d: u32 = 0x0064; - const XKB_KEY_e: u32 = 0x0065; - const XKB_KEY_f: u32 = 0x0066; - const XKB_KEY_g: u32 = 0x0067; - const XKB_KEY_h: u32 = 0x0068; - const XKB_KEY_i: u32 = 0x0069; - const XKB_KEY_j: u32 = 0x006a; - const XKB_KEY_k: u32 = 0x006b; - const XKB_KEY_l: u32 = 0x006c; - const XKB_KEY_m: u32 = 0x006d; - const XKB_KEY_n: u32 = 0x006e; - const XKB_KEY_o: u32 = 0x006f; - const XKB_KEY_p: u32 = 0x0070; - const XKB_KEY_q: u32 = 0x0071; - const XKB_KEY_r: u32 = 0x0072; - const XKB_KEY_s: u32 = 0x0073; - const XKB_KEY_t: u32 = 0x0074; - const XKB_KEY_u: u32 = 0x0075; - const XKB_KEY_v: u32 = 0x0076; - const XKB_KEY_w: u32 = 0x0077; - const XKB_KEY_x: u32 = 0x0078; - const XKB_KEY_y: u32 = 0x0079; - const XKB_KEY_z: u32 = 0x007a; - - const XKB_KEY_0: u32 = 0x0030; - const XKB_KEY_1: u32 = 0x0031; - const XKB_KEY_2: u32 = 0x0032; - const XKB_KEY_3: u32 = 0x0033; - const XKB_KEY_4: u32 = 0x0034; - const XKB_KEY_5: u32 = 0x0035; - const XKB_KEY_6: u32 = 0x0036; - const XKB_KEY_7: u32 = 0x0037; - const XKB_KEY_8: u32 = 0x0038; - const XKB_KEY_9: u32 = 0x0039; - - const XKB_KEY_F1: u32 = 0xffbe; - const XKB_KEY_F2: u32 = 0xffbf; - const XKB_KEY_F3: u32 = 0xffc0; - const XKB_KEY_F4: u32 = 0xffc1; - const XKB_KEY_F5: u32 = 0xffc2; - const XKB_KEY_F6: u32 = 0xffc3; - const XKB_KEY_F7: u32 = 0xffc4; - const XKB_KEY_F8: u32 = 0xffc5; - const XKB_KEY_F9: u32 = 0xffc6; - const XKB_KEY_F10: u32 = 0xffc7; - const XKB_KEY_F11: u32 = 0xffc8; - const XKB_KEY_F12: u32 = 0xffc9; - - Some(match keysym.raw() { - XKB_KEY_Escape => Key::Escape, - XKB_KEY_Return | XKB_KEY_KP_Enter => Key::Enter, - XKB_KEY_Tab => Key::Tab, - XKB_KEY_BackSpace => Key::Backspace, - XKB_KEY_Insert => Key::Insert, - XKB_KEY_Delete => Key::Delete, - XKB_KEY_Home => Key::Home, - XKB_KEY_End => Key::End, - XKB_KEY_Page_Up => Key::PageUp, - XKB_KEY_Page_Down => Key::PageDown, - XKB_KEY_Left => Key::ArrowLeft, - XKB_KEY_Right => Key::ArrowRight, - XKB_KEY_Up => Key::ArrowUp, - XKB_KEY_Down => Key::ArrowDown, - - XKB_KEY_space => Key::Space, - - // Letters (lowercase) - XKB_KEY_a => Key::A, - XKB_KEY_b => Key::B, - XKB_KEY_c => Key::C, - XKB_KEY_d => Key::D, - XKB_KEY_e => Key::E, - XKB_KEY_f => Key::F, - XKB_KEY_g => Key::G, - XKB_KEY_h => Key::H, - XKB_KEY_i => Key::I, - XKB_KEY_j => Key::J, - XKB_KEY_k => Key::K, - XKB_KEY_l => Key::L, - XKB_KEY_m => Key::M, - XKB_KEY_n => Key::N, - XKB_KEY_o => Key::O, - XKB_KEY_p => Key::P, - XKB_KEY_q => Key::Q, - XKB_KEY_r => Key::R, - XKB_KEY_s => Key::S, - XKB_KEY_t => Key::T, - XKB_KEY_u => Key::U, - XKB_KEY_v => Key::V, - XKB_KEY_w => Key::W, - XKB_KEY_x => Key::X, - XKB_KEY_y => Key::Y, - XKB_KEY_z => Key::Z, - - // Numbers - XKB_KEY_0 => Key::Num0, - XKB_KEY_1 => Key::Num1, - XKB_KEY_2 => Key::Num2, - XKB_KEY_3 => Key::Num3, - XKB_KEY_4 => Key::Num4, - XKB_KEY_5 => Key::Num5, - XKB_KEY_6 => Key::Num6, - XKB_KEY_7 => Key::Num7, - XKB_KEY_8 => Key::Num8, - XKB_KEY_9 => Key::Num9, - - // Function keys - XKB_KEY_F1 => Key::F1, - XKB_KEY_F2 => Key::F2, - XKB_KEY_F3 => Key::F3, - XKB_KEY_F4 => Key::F4, - XKB_KEY_F5 => Key::F5, - XKB_KEY_F6 => Key::F6, - XKB_KEY_F7 => Key::F7, - XKB_KEY_F8 => Key::F8, - XKB_KEY_F9 => Key::F9, - XKB_KEY_F10 => Key::F10, - XKB_KEY_F11 => Key::F11, - XKB_KEY_F12 => Key::F12, - - _ => return None, - }) -} - diff --git a/src/keyboard_handler.rs b/src/keyboard_handler.rs new file mode 100644 index 0000000..5cec1aa --- /dev/null +++ b/src/keyboard_handler.rs @@ -0,0 +1,92 @@ +use smithay_client_toolkit::{ + seat::keyboard::{KeyEvent, KeyboardHandler, Keysym, Modifiers, RawModifiers}, + shell::WaylandSurface, +}; +use wayland_client::{ + Connection, QueueHandle, + protocol::{wl_keyboard, wl_surface}, +}; + +use crate::simple_layer::SimpleLayer; + +impl KeyboardHandler for SimpleLayer { + fn enter( + &mut self, + _: &Connection, + _: &QueueHandle, + _: &wl_keyboard::WlKeyboard, + surface: &wl_surface::WlSurface, + _: u32, + _: &[u32], + keysyms: &[Keysym], + ) { + if self.layer.wl_surface() == surface { + println!("Keyboard focus on window with pressed syms: {keysyms:?}"); + self.keyboard_focus = true; + } + } + + fn leave( + &mut self, + _: &Connection, + _: &QueueHandle, + _: &wl_keyboard::WlKeyboard, + surface: &wl_surface::WlSurface, + _: u32, + ) { + if self.layer.wl_surface() == surface { + println!("Release keyboard focus on window"); + self.keyboard_focus = false; + } + } + + fn press_key( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _: &wl_keyboard::WlKeyboard, + _: u32, + event: KeyEvent, + ) { + println!("Key press: {event:?}"); + // press 'esc' to exit + if event.keysym == Keysym::Escape { + self.exit = true; + } + } + + fn repeat_key( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _keyboard: &wl_keyboard::WlKeyboard, + _serial: u32, + event: KeyEvent, + ) { + println!("Key repeat: {event:?}"); + } + + fn release_key( + &mut self, + _: &Connection, + _: &QueueHandle, + _: &wl_keyboard::WlKeyboard, + _: u32, + event: KeyEvent, + ) { + println!("Key release: {event:?}"); + } + + fn update_modifiers( + &mut self, + _: &Connection, + _: &QueueHandle, + _: &wl_keyboard::WlKeyboard, + _serial: u32, + modifiers: Modifiers, + _raw_modifiers: RawModifiers, + _layout: u32, + ) { + println!("Update modifiers: {modifiers:?}"); + } +} diff --git a/src/layer_shell_handler.rs b/src/layer_shell_handler.rs new file mode 100644 index 0000000..26e5641 --- /dev/null +++ b/src/layer_shell_handler.rs @@ -0,0 +1,30 @@ +use crate::simple_layer::SimpleLayer; +use smithay_client_toolkit::shell::wlr_layer::{ + LayerShellHandler, LayerSurface, LayerSurfaceConfigure, +}; +use std::num::NonZeroU32; +use wayland_client::{Connection, QueueHandle}; + +impl LayerShellHandler for SimpleLayer { + fn closed(&mut self, _conn: &Connection, _qh: &QueueHandle, _layer: &LayerSurface) { + self.exit = true; + } + + fn configure( + &mut self, + _conn: &Connection, + qh: &QueueHandle, + _layer: &LayerSurface, + configure: LayerSurfaceConfigure, + _serial: u32, + ) { + self.width = NonZeroU32::new(configure.new_size.0).map_or(256, NonZeroU32::get); + self.height = NonZeroU32::new(configure.new_size.1).map_or(256, NonZeroU32::get); + + // Initiate the first draw. + if self.first_configure { + self.first_configure = false; + self.draw(qh); + } + } +} diff --git a/src/main.rs b/src/main.rs index 71b2bf4..7e6cea0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,629 +1,85 @@ -// Original here: https://github.com/Smithay/client-toolkit/blob/master/examples/wgpu.rs +mod compositor_handler; +mod keyboard_handler; +mod layer_shell_handler; +mod mouse_handler; +mod output_handler; +mod provide_registry_state; +mod rendering; +mod seat_handling; +mod shm_handler; +mod simple_layer; -mod egui_renderer; -mod egui_app; -mod input_handler; +use crate::simple_layer::SimpleLayer; -use crate::egui_renderer::EguiRenderer; -use crate::egui_app::EguiApp; -use crate::input_handler::{InputState}; -use raw_window_handle::{ - RawDisplayHandle, RawWindowHandle, WaylandDisplayHandle, WaylandWindowHandle, -}; -use smithay_clipboard::Clipboard; use smithay_client_toolkit::{ - compositor::{CompositorHandler, CompositorState}, - delegate_compositor, delegate_output, delegate_registry, delegate_seat, delegate_layer, - delegate_keyboard, delegate_pointer, delegate_shm, - output::{OutputHandler, OutputState}, - registry::{ProvidesRegistryState, RegistryState}, - registry_handlers, - seat::{ - Capability, SeatHandler, SeatState, - keyboard::{KeyboardHandler, KeyEvent}, - pointer::{PointerHandler, PointerEvent, ThemedPointer, ThemeSpec, CursorIcon as WaylandCursorIcon}, - }, + compositor::CompositorState, + delegate_compositor, delegate_keyboard, delegate_layer, delegate_output, delegate_pointer, + delegate_registry, delegate_seat, delegate_shm, + output::OutputState, + registry::RegistryState, + seat::SeatState, shell::{ - wlr_layer::{ - Anchor, KeyboardInteractivity, Layer, LayerShell, LayerShellHandler, - LayerSurface, LayerSurfaceConfigure, - }, WaylandSurface, + wlr_layer::{Anchor, KeyboardInteractivity, Layer, LayerShell}, }, - shm::{Shm, ShmHandler}, + shm::{Shm, slot::SlotPool}, }; -use wgpu::DeviceDescriptor; -use std::ptr::NonNull; -use wayland_client::{ - globals::registry_queue_init, - protocol::{wl_output, wl_seat, wl_surface}, - Connection, Proxy, QueueHandle, -}; -use log::trace; +use wayland_client::{Connection, globals::registry_queue_init}; fn main() { - env_logger::init(); + let conn = Connection::connect_to_env().expect("wayland environment not found"); - let conn = Connection::connect_to_env().unwrap(); let (globals, mut event_queue) = registry_queue_init(&conn).unwrap(); let qh = event_queue.handle(); - // Initialize layer shell handlers - let compositor_state = - CompositorState::bind(&globals, &qh).expect("wl_compositor not available"); - let layer_shell_state = LayerShell::bind(&globals, &qh).expect("layer shell not available"); - let shm_state = Shm::bind(&globals, &qh).expect("wl_shm not available"); + let compositor = CompositorState::bind(&globals, &qh).expect("wl_compositor is not available"); + let layer_shell = LayerShell::bind(&globals, &qh).expect("layer shell is not available"); + let shm = Shm::bind(&globals, &qh).expect("wl_shm is not available"); - let surface = compositor_state.create_surface(&qh); - // Create the layer surface for adapter selection - let layer_surface = layer_shell_state.create_layer_surface( - &qh, - surface, - Layer::Top, - Some("clock-for-smithay"), + let surface = compositor.create_surface(&qh); + + let layer = + layer_shell.create_layer_surface(&qh, surface, Layer::Top, Some("simple_layer"), None); + layer.set_anchor(Anchor::TOP); + layer.set_exclusive_zone(-1); + layer.set_keyboard_interactivity(KeyboardInteractivity::OnDemand); + layer.set_size(256, 256); + + layer.commit(); + + let pool = SlotPool::new(256 * 256 * 4, &shm).expect("Failed to create pool"); + + let mut simple_layer = SimpleLayer::new( + RegistryState::new(&globals), + SeatState::new(&globals, &qh), + OutputState::new(&globals, &qh), + shm, + pool, + 256, + 256, + layer, + None, None, ); - layer_surface.set_anchor(Anchor::BOTTOM); - layer_surface.set_keyboard_interactivity(KeyboardInteractivity::OnDemand); - layer_surface.set_size(256, 256); - layer_surface.commit(); - // Initialize wgpu - let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { - backends: wgpu::Backends::all(), - ..Default::default() - }); - - // Create the raw window handle for the surface. - let raw_display_handle = RawDisplayHandle::Wayland(WaylandDisplayHandle::new( - NonNull::new(conn.backend().display_ptr() as *mut _).unwrap(), - )); - let raw_window_handle = RawWindowHandle::Wayland(WaylandWindowHandle::new( - NonNull::new(layer_surface.wl_surface().id().as_ptr() as *mut _).unwrap(), - )); - - let surface = unsafe { - instance - .create_surface_unsafe(wgpu::SurfaceTargetUnsafe::RawHandle { - raw_display_handle, - raw_window_handle, - }) - .unwrap() - }; - - // Pick a supported adapter - let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions { - compatible_surface: Some(&surface), - ..Default::default() - })) - .expect("Failed to find suitable adapter"); - - log::info!("Selected backend: {:?}", adapter.get_info().backend); - - let (device, queue) = pollster::block_on(adapter.request_device(&DeviceDescriptor { - memory_hints: wgpu::MemoryHints::MemoryUsage, - ..Default::default() - })) - .expect("Failed to request device"); - - // Initialize clipboard - let clipboard = unsafe { Clipboard::new(conn.display().id().as_ptr() as *mut _) }; - - let mut main_state = MainState { - registry_state: RegistryState::new(&globals), - seat_state: SeatState::new(&globals, &qh), - output_state: OutputState::new(&globals, &qh), - shm_state, - - exit: false, - width: 256, - height: 256, - scale_factor: 1, - layer_surface, - device, - surface, - adapter, - queue, - - egui_renderer: None, - egui_app: EguiApp::new(), - input_state: InputState::new(clipboard), - themed_pointer: None, - }; - - // We don't draw immediately, the configure will notify us when to first draw. loop { - event_queue.blocking_dispatch(&mut main_state).unwrap(); + event_queue.blocking_dispatch(&mut simple_layer).unwrap(); - if main_state.exit { - trace!("exiting example"); + if simple_layer.exit { + println!("exiting example"); break; } } - - // On exit we must destroy the surface before the layer surface is destroyed. - drop(main_state.surface); - drop(main_state.layer_surface); } -struct MainState { - registry_state: RegistryState, - seat_state: SeatState, - output_state: OutputState, - shm_state: Shm, +delegate_compositor!(SimpleLayer); +delegate_output!(SimpleLayer); +delegate_shm!(SimpleLayer); - exit: bool, - width: u32, - height: u32, - scale_factor: i32, - layer_surface: LayerSurface, +delegate_seat!(SimpleLayer); +delegate_keyboard!(SimpleLayer); +delegate_pointer!(SimpleLayer); - adapter: wgpu::Adapter, - device: wgpu::Device, - queue: wgpu::Queue, - surface: wgpu::Surface<'static>, - - egui_renderer: Option, - egui_app: EguiApp, - input_state: InputState, - themed_pointer: Option, -} +delegate_layer!(SimpleLayer); -impl MainState { - fn render(&mut self, conn: &Connection, qh: &QueueHandle) { - trace!("[MAIN] Render called"); - - if self.egui_renderer.is_none() { - trace!("[MAIN] Skipping render - EGUI renderer not initialized yet"); - return; - } - - let surface_texture = match self.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - trace!("[MAIN] Failed to acquire swapchain texture: {:?}", e); - return; - } - }; - - let texture_view = surface_texture.texture.create_view(&wgpu::TextureViewDescriptor::default()); - let mut encoder = self.device.create_command_encoder(&Default::default()); - - // Clear the surface first - { - let _renderpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("clear pass"), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &texture_view, - depth_slice: None, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color::BLACK), - store: wgpu::StoreOp::Store, - }, - })], - depth_stencil_attachment: None, - timestamp_writes: None, - occlusion_query_set: None, - }); - } - - // Render EGUI - let needs_repaint = if let Some(renderer) = &mut self.egui_renderer { - let raw_input = self.input_state.take_raw_input(); - - renderer.begin_frame(raw_input); - self.egui_app.ui(renderer.context()); - - // For Wayland: configure surface at physical resolution, render egui at logical resolution - // pixels_per_point tells egui how many physical pixels per logical point - let screen_descriptor = egui_wgpu::ScreenDescriptor { - size_in_pixels: [self.width * self.scale_factor as u32, self.height * self.scale_factor as u32], - pixels_per_point: self.scale_factor as f32, - }; - - let platform_output = renderer.end_frame_and_draw( - &self.device, - &self.queue, - &mut encoder, - &texture_view, - screen_descriptor, - ); - - // Handle clipboard commands from egui - for command in &platform_output.commands { - self.input_state.handle_output_command(command); - } - - // Handle cursor icon changes from EGUI - if let Some(themed_pointer) = &self.themed_pointer { - let cursor_icon = egui_to_wayland_cursor(platform_output.cursor_icon); - let _ = themed_pointer.set_cursor(conn, cursor_icon); - } - - // For now, just check if there are any platform commands (indicates interaction) - !platform_output.events.is_empty() - } else { - false - }; - - // Submit the command in the queue to execute - self.queue.submit(Some(encoder.finish())); - surface_texture.present(); - - // Only request next frame if EGUI needs repaint (animations, etc.) - if needs_repaint { - trace!("[MAIN] EGUI has events, scheduling next frame"); - self.layer_surface.wl_surface().frame(qh, self.layer_surface.wl_surface().clone()); - self.layer_surface.wl_surface().commit(); - } - } -} - -impl CompositorHandler for MainState { - fn scale_factor_changed( - &mut self, - _conn: &Connection, - qh: &QueueHandle, - _surface: &wl_surface::WlSurface, - new_factor: i32, - ) { - trace!("[MAIN] Scale factor changed to {}", new_factor); - self.scale_factor = new_factor; - // Request a redraw with the new scale factor - self.layer_surface.wl_surface().frame(qh, self.layer_surface.wl_surface().clone()); - self.layer_surface.wl_surface().commit(); - } - - fn transform_changed( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _surface: &wl_surface::WlSurface, - _new_transform: wl_output::Transform, - ) { - // Not needed for this example. - } - - fn frame( - &mut self, - conn: &Connection, - qh: &QueueHandle, - _surface: &wl_surface::WlSurface, - _time: u32, - ) { - trace!("[MAIN] Frame callback"); - self.render(conn, qh); - } - - fn surface_enter( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _surface: &wl_surface::WlSurface, - _output: &wl_output::WlOutput, - ) { - // Not needed for this example. - } - - fn surface_leave( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _surface: &wl_surface::WlSurface, - _output: &wl_output::WlOutput, - ) { - // Not needed for this example. - } -} - -impl OutputHandler for MainState { - fn output_state(&mut self) -> &mut OutputState { - &mut self.output_state - } - - fn new_output( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _output: wl_output::WlOutput, - ) { - } - - fn update_output( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _output: wl_output::WlOutput, - ) { - } - - fn output_destroyed( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _output: wl_output::WlOutput, - ) { - } -} - -impl LayerShellHandler for MainState { - fn closed(&mut self, _conn: &Connection, _qh: &QueueHandle, _layer: &LayerSurface) { - self.exit = true; - } - - fn configure( - &mut self, - conn: &Connection, - qh: &QueueHandle, - _layer: &LayerSurface, - configure: LayerSurfaceConfigure, - _serial: u32, - ) { - trace!("[MAIN] Configure called"); - let (new_width, new_height) = configure.new_size; - self.width = new_width.max(1); - self.height = new_height.max(1); - self.input_state.set_screen_size(self.width, self.height); - trace!("[MAIN] Layer surface size: {}x{}", self.width, self.height); - - let adapter = &self.adapter; - let surface = &self.surface; - let device = &self.device; - - let cap = surface.get_capabilities(&adapter); - let surface_config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: cap.formats[0], - view_formats: vec![cap.formats[0]], - alpha_mode: wgpu::CompositeAlphaMode::Auto, - width: self.width * self.scale_factor as u32, - height: self.height * self.scale_factor as u32, - desired_maximum_frame_latency: 2, - // Wayland is inherently a mailbox system. - present_mode: wgpu::PresentMode::Mailbox, - }; - - surface.configure(&self.device, &surface_config); - - // Tell Wayland we're providing a buffer at scale_factor resolution - self.layer_surface.wl_surface().set_buffer_scale(self.scale_factor); - - // Initialize EGUI renderer if not already done - if self.egui_renderer.is_none() { - self.egui_renderer = Some(EguiRenderer::new( - device, - surface_config.format, - None, - 1, - )); - } - - // Render the frame - self.render(conn, qh); - } -} - -impl PointerHandler for MainState { - fn pointer_frame( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _pointer: &wayland_client::protocol::wl_pointer::WlPointer, - events: &[PointerEvent], - ) { - trace!("[MAIN] Pointer frame with {} events", events.len()); - for event in events { - self.input_state.handle_pointer_event(event); - } - // Request a redraw after input - trace!("[MAIN] Requesting frame after pointer input"); - self.layer_surface.wl_surface().frame(&_qh, self.layer_surface.wl_surface().clone()); - self.layer_surface.wl_surface().commit(); - } -} - -impl KeyboardHandler for MainState { - fn enter( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _keyboard: &wayland_client::protocol::wl_keyboard::WlKeyboard, - _surface: &wl_surface::WlSurface, - _serial: u32, - _raw: &[u32], - _keysyms: &[smithay_client_toolkit::seat::keyboard::Keysym], - ) { - trace!("[MAIN] Keyboard focus gained"); - // Keyboard focus gained - } - - fn leave( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _keyboard: &wayland_client::protocol::wl_keyboard::WlKeyboard, - _surface: &wl_surface::WlSurface, - _serial: u32, - ) { - trace!("[MAIN] Keyboard focus lost"); - // Keyboard focus lost - } - - fn press_key( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _keyboard: &wayland_client::protocol::wl_keyboard::WlKeyboard, - _serial: u32, - event: KeyEvent, - ) { - trace!("[MAIN] Key pressed"); - - - self.input_state.handle_keyboard_event(&event, true, false); - - // Request a redraw after input - trace!("[MAIN] Requesting frame after key press"); - self.layer_surface.wl_surface().frame(&_qh, self.layer_surface.wl_surface().clone()); - self.layer_surface.wl_surface().commit(); - } - - fn release_key( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _keyboard: &wayland_client::protocol::wl_keyboard::WlKeyboard, - _serial: u32, - event: KeyEvent, - ) { - self.input_state.handle_keyboard_event(&event, false, false); - } - - fn update_modifiers( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _keyboard: &wayland_client::protocol::wl_keyboard::WlKeyboard, - _serial: u32, - modifiers: smithay_client_toolkit::seat::keyboard::Modifiers, - _raw_modifiers: smithay_client_toolkit::seat::keyboard::RawModifiers, - _layout: u32, - ) { - self.input_state.update_modifiers(&modifiers); - } - - fn repeat_key( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - _keyboard: &wayland_client::protocol::wl_keyboard::WlKeyboard, - _serial: u32, - event: KeyEvent, - ) { - self.input_state.handle_keyboard_event(&event, true, true); - // Request a redraw after input - self.layer_surface.wl_surface().frame(&_qh, self.layer_surface.wl_surface().clone()); - self.layer_surface.wl_surface().commit(); - } -} - -impl SeatHandler for MainState { - fn seat_state(&mut self) -> &mut SeatState { - &mut self.seat_state - } - - fn new_seat(&mut self, _: &Connection, _: &QueueHandle, _: wl_seat::WlSeat) {} - - fn new_capability( - &mut self, - _conn: &Connection, - qh: &QueueHandle, - seat: wl_seat::WlSeat, - capability: Capability, - ) { - trace!("[MAIN] New seat capability: {:?}", capability); - if capability == Capability::Keyboard && self.seat_state.get_keyboard(qh, &seat, None).is_err() { - trace!("[MAIN] Failed to get keyboard"); - } - if capability == Capability::Pointer && self.themed_pointer.is_none() { - trace!("[MAIN] Creating themed pointer"); - let surface = self.layer_surface.wl_surface().clone(); - match self.seat_state.get_pointer_with_theme( - qh, - &seat, - self.shm_state.wl_shm(), - surface, - ThemeSpec::default(), - ) { - Ok(themed_pointer) => { - self.themed_pointer = Some(themed_pointer); - trace!("[MAIN] Themed pointer created successfully"); - } - Err(e) => { - trace!("[MAIN] Failed to create themed pointer: {:?}", e); - } - } - } - } - - fn remove_capability( - &mut self, - _conn: &Connection, - _: &QueueHandle, - _: wl_seat::WlSeat, - _capability: Capability, - ) { - } - - fn remove_seat(&mut self, _: &Connection, _: &QueueHandle, _: wl_seat::WlSeat) {} -} - -impl ShmHandler for MainState { - fn shm_state(&mut self) -> &mut Shm { - &mut self.shm_state - } -} - -/// Convert EGUI cursor icon to Wayland cursor icon -fn egui_to_wayland_cursor(cursor: egui::CursorIcon) -> WaylandCursorIcon { - use egui::CursorIcon::*; - use smithay_client_toolkit::seat::pointer::CursorIcon as WCI; - - match cursor { - Default => WCI::Default, - None => WCI::Default, - ContextMenu => WCI::ContextMenu, - Help => WCI::Help, - PointingHand => WCI::Pointer, - Progress => WCI::Progress, - Wait => WCI::Wait, - Cell => WCI::Cell, - Crosshair => WCI::Crosshair, - Text => WCI::Text, - VerticalText => WCI::VerticalText, - Alias => WCI::Alias, - Copy => WCI::Copy, - Move => WCI::Move, - NoDrop => WCI::NoDrop, - NotAllowed => WCI::NotAllowed, - Grab => WCI::Grab, - Grabbing => WCI::Grabbing, - AllScroll => WCI::AllScroll, - ResizeHorizontal => WCI::EwResize, - ResizeNeSw => WCI::NeswResize, - ResizeNwSe => WCI::NwseResize, - ResizeVertical => WCI::NsResize, - ResizeEast => WCI::EResize, - ResizeSouthEast => WCI::SeResize, - ResizeSouth => WCI::SResize, - ResizeSouthWest => WCI::SwResize, - ResizeWest => WCI::WResize, - ResizeNorthWest => WCI::NwResize, - ResizeNorth => WCI::NResize, - ResizeNorthEast => WCI::NeResize, - ResizeColumn => WCI::ColResize, - ResizeRow => WCI::RowResize, - ZoomIn => WCI::ZoomIn, - ZoomOut => WCI::ZoomOut, - } -} - -delegate_compositor!(MainState); -delegate_output!(MainState); -delegate_shm!(MainState); - -delegate_seat!(MainState); -delegate_keyboard!(MainState); -delegate_pointer!(MainState); - -delegate_layer!(MainState); - -delegate_registry!(MainState); - -impl ProvidesRegistryState for MainState { - fn registry(&mut self) -> &mut RegistryState { - &mut self.registry_state - } - registry_handlers![OutputState]; -} \ No newline at end of file +delegate_registry!(SimpleLayer); diff --git a/src/mouse_handler.rs b/src/mouse_handler.rs new file mode 100644 index 0000000..ec8cbe1 --- /dev/null +++ b/src/mouse_handler.rs @@ -0,0 +1,46 @@ +use smithay_client_toolkit::seat::pointer::{PointerEvent, PointerEventKind, PointerHandler}; +use smithay_client_toolkit::shell::WaylandSurface; +use wayland_client::{Connection, QueueHandle, protocol::wl_pointer}; + +use crate::simple_layer::SimpleLayer; + +impl PointerHandler for SimpleLayer { + fn pointer_frame( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _pointer: &wl_pointer::WlPointer, + events: &[PointerEvent], + ) { + use PointerEventKind::*; + for event in events { + // Ignore events for other surfaces + if &event.surface != self.layer.wl_surface() { + continue; + } + match event.kind { + Enter { .. } => { + println!("Pointer entered @{:?}", event.position); + } + Leave { .. } => { + println!("Pointer left"); + } + Motion { .. } => {} + Press { button, .. } => { + println!("Press {:x} @ {:?}", button, event.position); + self.shift = self.shift.xor(Some(0)); + } + Release { button, .. } => { + println!("Release {:x} @ {:?}", button, event.position); + } + Axis { + horizontal, + vertical, + .. + } => { + println!("Scroll H:{horizontal:?}, V:{vertical:?}"); + } + } + } + } +} diff --git a/src/output_handler.rs b/src/output_handler.rs new file mode 100644 index 0000000..f1dce8a --- /dev/null +++ b/src/output_handler.rs @@ -0,0 +1,45 @@ +use smithay_client_toolkit::output::{OutputHandler, OutputState}; +use wayland_client::{Connection, QueueHandle, protocol::wl_output}; + +use crate::simple_layer::SimpleLayer; + +impl OutputHandler for SimpleLayer { + fn output_state(&mut self) -> &mut OutputState { + &mut self.output_state + } + + fn new_output( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + output: wl_output::WlOutput, + ) { + if let Some(info) = self.output_state.info(&output) { + if let Some((width, height)) = info.logical_size { + self.layer + .set_margin((height - (self.height as i32)) / 2, 0, 0, 0); + println!("Monitor logical size: {}x{}", width, height); + } else { + println!("Logical size not yet known"); + } + } else { + println!("OutputInfo not found for this output"); + } + } + + fn update_output( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _output: wl_output::WlOutput, + ) { + } + + fn output_destroyed( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + _output: wl_output::WlOutput, + ) { + } +} diff --git a/src/provide_registry_state.rs b/src/provide_registry_state.rs new file mode 100644 index 0000000..deb3216 --- /dev/null +++ b/src/provide_registry_state.rs @@ -0,0 +1,15 @@ +use smithay_client_toolkit::{ + output::OutputState, + registry::{ProvidesRegistryState, RegistryState}, + registry_handlers, + seat::SeatState, +}; + +use crate::simple_layer::SimpleLayer; + +impl ProvidesRegistryState for SimpleLayer { + fn registry(&mut self) -> &mut RegistryState { + &mut self.registry_state + } + registry_handlers![OutputState, SeatState]; +} diff --git a/src/rendering.rs b/src/rendering.rs new file mode 100644 index 0000000..43f4ace --- /dev/null +++ b/src/rendering.rs @@ -0,0 +1,67 @@ +use smithay_client_toolkit::shell::WaylandSurface; +use wayland_client::{QueueHandle, protocol::wl_shm}; + +use crate::simple_layer::SimpleLayer; + +impl SimpleLayer { + pub fn draw(&mut self, qh: &QueueHandle) { + let width = self.width; + let height = self.height; + let stride = self.width as i32 * 4; + + let (buffer, canvas) = self + .pool + .create_buffer( + width as i32, + height as i32, + stride, + wl_shm::Format::Argb8888, + ) + .expect("create buffer"); + + // Draw to the window: + { + let shift = self.shift.unwrap_or(0); + canvas + .chunks_exact_mut(4) + .enumerate() + .for_each(|(index, chunk)| { + let x = ((index + shift as usize) % width as usize) as u32; + let y = (index / width as usize) as u32; + + let a = 0xFF; + let r = u32::min(((width - x) * 0xFF) / width, ((height - y) * 0xFF) / height); + let g = u32::min((x * 0xFF) / width, ((height - y) * 0xFF) / height); + let b = u32::min(((width - x) * 0xFF) / width, (y * 0xFF) / height); + let color = (a << 24) + (r << 16) + (g << 8) + b; + + let array: &mut [u8; 4] = chunk.try_into().unwrap(); + *array = color.to_le_bytes(); + }); + + if let Some(shift) = &mut self.shift { + *shift = (*shift + 1) % width; + } + } + + // Damage the entire window + self.layer + .wl_surface() + .damage_buffer(0, 0, width as i32, height as i32); + + // Request our next frame + self.layer + .wl_surface() + .frame(qh, self.layer.wl_surface().clone()); + + // Attach and commit to present. + buffer + .attach_to(self.layer.wl_surface()) + .expect("buffer attach"); + self.layer.commit(); + + // TODO save and reuse buffer when the window size is unchanged. This is especially + // useful if you do damage tracking, since you don't need to redraw the undamaged parts + // of the canvas. + } +} diff --git a/src/seat_handling.rs b/src/seat_handling.rs new file mode 100644 index 0000000..a2c77ca --- /dev/null +++ b/src/seat_handling.rs @@ -0,0 +1,58 @@ +use smithay_client_toolkit::seat::{Capability, SeatHandler, SeatState}; +use wayland_client::{Connection, QueueHandle, protocol::wl_seat}; + +use crate::simple_layer::SimpleLayer; + +impl SeatHandler for SimpleLayer { + fn seat_state(&mut self) -> &mut SeatState { + &mut self.seat_state + } + + fn new_seat(&mut self, _: &Connection, _: &QueueHandle, _: wl_seat::WlSeat) {} + + fn new_capability( + &mut self, + _conn: &Connection, + qh: &QueueHandle, + seat: wl_seat::WlSeat, + capability: Capability, + ) { + if capability == Capability::Keyboard && self.keyboard.is_none() { + println!("Set keyboard capability"); + let keyboard = self + .seat_state + .get_keyboard(qh, &seat, None) + .expect("Failed to create keyboard"); + self.keyboard = Some(keyboard); + } + + if capability == Capability::Pointer && self.pointer.is_none() { + println!("Set pointer capability"); + let pointer = self + .seat_state + .get_pointer(qh, &seat) + .expect("Failed to create pointer"); + self.pointer = Some(pointer); + } + } + + fn remove_capability( + &mut self, + _conn: &Connection, + _: &QueueHandle, + _: wl_seat::WlSeat, + capability: Capability, + ) { + if capability == Capability::Keyboard && self.keyboard.is_some() { + println!("Unset keyboard capability"); + self.keyboard.take().unwrap().release(); + } + + if capability == Capability::Pointer && self.pointer.is_some() { + println!("Unset pointer capability"); + self.pointer.take().unwrap().release(); + } + } + + fn remove_seat(&mut self, _: &Connection, _: &QueueHandle, _: wl_seat::WlSeat) {} +} diff --git a/src/shm_handler.rs b/src/shm_handler.rs new file mode 100644 index 0000000..639e60d --- /dev/null +++ b/src/shm_handler.rs @@ -0,0 +1,9 @@ +use smithay_client_toolkit::shm::{Shm, ShmHandler}; + +use crate::simple_layer::SimpleLayer; + +impl ShmHandler for SimpleLayer { + fn shm_state(&mut self) -> &mut Shm { + &mut self.shm + } +} diff --git a/src/simple_layer.rs b/src/simple_layer.rs new file mode 100644 index 0000000..8b0927d --- /dev/null +++ b/src/simple_layer.rs @@ -0,0 +1,56 @@ +use smithay_client_toolkit::{ + output::OutputState, + registry::RegistryState, + seat::SeatState, + shell::wlr_layer::LayerSurface, + shm::{Shm, slot::SlotPool}, +}; +use wayland_client::protocol::{wl_keyboard, wl_pointer}; + +pub struct SimpleLayer { + pub registry_state: RegistryState, + pub seat_state: SeatState, + pub output_state: OutputState, + pub shm: Shm, + + pub exit: bool, + pub first_configure: bool, + pub pool: SlotPool, + pub width: u32, + pub height: u32, + pub layer: LayerSurface, + pub keyboard: Option, + pub keyboard_focus: bool, + pub pointer: Option, +} + +impl SimpleLayer { + pub fn new( + registry_state: RegistryState, + seat_state: SeatState, + output_state: OutputState, + shm: Shm, + pool: SlotPool, + width: u32, + height: u32, + layer: LayerSurface, + keyboard: Option, + pointer: Option, + ) -> Self { + Self { + registry_state, + seat_state, + output_state, + shm, + exit: false, + first_configure: true, + pool, + width, + height, + layer, + keyboard, + keyboard_focus: false, + pointer, + } + } +}