From c523905c493617de72ff3dbbfc5aed1431dfee9f Mon Sep 17 00:00:00 2001 From: IoIxD Date: Sat, 4 Jul 2026 22:57:08 -0700 Subject: [PATCH] slightly better code --- .gitmodules | 3 + Cargo.lock | 556 +++++++++++++++++++++++++++++---- Cargo.toml | 2 +- smithay | 1 + src/backend/mod.rs | 4 - src/backend/winit.rs | 56 ++-- src/main.rs | 1 - src/{state.rs => state/mod.rs} | 392 +++++++---------------- src/state/xdg.rs | 283 +++++++++++++++++ src/{ => state}/xwayland.rs | 11 +- 10 files changed, 928 insertions(+), 381 deletions(-) create mode 100644 .gitmodules create mode 160000 smithay rename src/{state.rs => state/mod.rs} (51%) create mode 100644 src/state/xdg.rs rename src/{ => state}/xwayland.rs (92%) diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b8fc6c6 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "smithay"] + path = smithay + url = https://github.com/Smithay/smithay diff --git a/Cargo.lock b/Cargo.lock index 7b60191..f1a75df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,7 +149,26 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "borsh" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "bytes", + "cfg_aliases", ] [[package]] @@ -223,6 +242,18 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", +] + [[package]] name = "cc" version = "1.2.65" @@ -363,6 +394,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", +] + [[package]] name = "dlib" version = "0.5.3" @@ -433,6 +474,26 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -618,9 +679,9 @@ dependencies = [ [[package]] name = "input" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdc09524a91f9cacd26f16734ff63d7dc650daffadd2b6f84d17a285bd875a9" +checksum = "f9793345a65d71317763a33066b5d8351f8760dde8d4930fe9e39b5f14a7959d" dependencies = [ "bitflags 2.13.0", "input-sys", @@ -724,6 +785,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keyboard-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" +dependencies = [ + "bitflags 2.13.0", + "serde", +] + [[package]] name = "khronos_api" version = "3.1.0" @@ -844,7 +915,7 @@ dependencies = [ "smithay", "wayland-protocols", "wayland-server", - "winit", + "winit 0.30.13", ] [[package]] @@ -924,6 +995,15 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-app-kit" version = "0.2.2" @@ -931,15 +1011,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ "bitflags 2.13.0", - "block2", + "block2 0.5.1", "libc", - "objc2", + "objc2 0.5.2", "objc2-core-data", "objc2-core-image", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-quartz-core", ] +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-cloud-kit" version = "0.2.2" @@ -947,10 +1039,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ "bitflags 2.13.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -959,9 +1051,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -971,9 +1063,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ "bitflags 2.13.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "dispatch2", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.0", + "libc", + "objc2-core-foundation", ] [[package]] @@ -982,9 +1097,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -994,10 +1109,21 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-contacts", - "objc2-foundation", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.13.0", + "objc2-core-foundation", + "objc2-core-graphics", ] [[package]] @@ -1013,10 +1139,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.13.0", - "block2", + "block2 0.5.1", "dispatch", "libc", - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-core-foundation", ] [[package]] @@ -1025,10 +1163,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -1038,9 +1176,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ "bitflags 2.13.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -1050,9 +1188,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ "bitflags 2.13.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -1062,8 +1200,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -1073,13 +1211,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ "bitflags 2.13.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-cloud-kit", "objc2-core-data", "objc2-core-image", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-link-presentation", "objc2-quartz-core", "objc2-symbols", @@ -1087,15 +1225,27 @@ dependencies = [ "objc2-user-notifications", ] +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-uniform-type-identifiers" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -1105,10 +1255,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ "bitflags 2.13.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -1379,6 +1529,18 @@ dependencies = [ "bitflags 2.13.0", ] +[[package]] +name = "reis" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3fedd2777cde52c1be5e572efbec485eac7b801c47820eda388d4f13b9c4b" +dependencies = [ + "calloop 0.14.4", + "enumflags2", + "log", + "rustix 1.1.4", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -1450,7 +1612,7 @@ dependencies = [ "ab_glyph", "log", "memmap2", - "smithay-client-toolkit", + "smithay-client-toolkit 0.19.2", "tiny-skia", ] @@ -1467,6 +1629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", + "serde_derive", ] [[package]] @@ -1537,8 +1700,6 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "smithay" version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740cea6927892bc182d5bf70c8f79806c8bc9f68f2fb96e55a30be171b63af98" dependencies = [ "aliasable", "appendlist", @@ -1566,6 +1727,7 @@ dependencies = [ "pkg-config", "profiling", "rand", + "reis", "rustix 1.1.4", "scopeguard", "sha2", @@ -1582,7 +1744,7 @@ dependencies = [ "wayland-protocols-misc", "wayland-protocols-wlr", "wayland-server", - "winit", + "winit 0.31.0-beta.2", "x11rb", "xkbcommon", ] @@ -1595,7 +1757,7 @@ checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ "bitflags 2.13.0", "calloop 0.13.0", - "calloop-wayland-source", + "calloop-wayland-source 0.3.0", "cursor-icon", "libc", "log", @@ -1612,6 +1774,33 @@ dependencies = [ "xkeysym", ] +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.13.0", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.4", + "thiserror 2.0.18", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + [[package]] name = "smol_str" version = "0.2.2" @@ -1621,6 +1810,16 @@ dependencies = [ "serde", ] +[[package]] +name = "smol_str" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" +dependencies = [ + "borsh", + "serde_core", +] + [[package]] name = "strict-num" version = "0.1.1" @@ -1965,6 +2164,19 @@ dependencies = [ "wayland-server", ] +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + [[package]] name = "wayland-protocols-misc" version = "0.3.12" @@ -1973,6 +2185,7 @@ checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ "bitflags 2.13.0", "wayland-backend", + "wayland-client", "wayland-protocols", "wayland-scanner", "wayland-server", @@ -2243,7 +2456,7 @@ dependencies = [ "android-activity", "atomic-waker", "bitflags 2.13.0", - "block2", + "block2 0.5.1", "bytemuck", "calloop 0.13.0", "cfg_aliases", @@ -2256,10 +2469,10 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "objc2-ui-kit", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit 0.2.2", "orbclient", "percent-encoding", "pin-project", @@ -2267,8 +2480,8 @@ dependencies = [ "redox_syscall 0.4.1", "rustix 0.38.44", "sctk-adwaita", - "smithay-client-toolkit", - "smol_str", + "smithay-client-toolkit 0.19.2", + "smol_str 0.2.2", "tracing", "unicode-segmentation", "wasm-bindgen", @@ -2285,6 +2498,230 @@ dependencies = [ "xkbcommon-dl", ] +[[package]] +name = "winit" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2879d2854d1a43e48f67322d4bd097afcb6eb8f8f775c8de0260a71aea1df1aa" +dependencies = [ + "bitflags 2.13.0", + "cfg_aliases", + "cursor-icon", + "dpi", + "libc", + "raw-window-handle", + "rustix 1.1.4", + "smol_str 0.3.6", + "tracing", + "winit-android", + "winit-appkit", + "winit-common", + "winit-core", + "winit-orbital", + "winit-uikit", + "winit-wayland", + "winit-web", + "winit-win32", + "winit-x11", +] + +[[package]] +name = "winit-android" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d9c0d2cd93efec3a9f9ad819cfaf0834782403af7c0d248c784ec0c61761df" +dependencies = [ + "android-activity", + "bitflags 2.13.0", + "dpi", + "ndk", + "raw-window-handle", + "smol_str 0.3.6", + "tracing", + "winit-core", +] + +[[package]] +name = "winit-appkit" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21310ca07851a49c348e0c2cc768e36b52ca65afda2c2354d78ed4b90074d8aa" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "dispatch2", + "dpi", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-video", + "objc2-foundation 0.3.2", + "raw-window-handle", + "smol_str 0.3.6", + "tracing", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-common" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45375fbac4cbb77260d83a30b1f9d8105880dbac99a9ae97f56656694680ff69" +dependencies = [ + "memmap2", + "objc2 0.6.4", + "objc2-core-foundation", + "smol_str 0.3.6", + "tracing", + "winit-core", + "x11-dl", + "xkbcommon-dl", +] + +[[package]] +name = "winit-core" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4f0ccd7abb43740e2c6124ac7cae7d865ecec74eec63783e8922577ac232583" +dependencies = [ + "bitflags 2.13.0", + "cursor-icon", + "dpi", + "keyboard-types", + "raw-window-handle", + "smol_str 0.3.6", + "web-time", +] + +[[package]] +name = "winit-orbital" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ea1fb262e7209f265f12bd0cc792c399b14355675e65531e9c8a87db287d46" +dependencies = [ + "bitflags 2.13.0", + "dpi", + "orbclient", + "raw-window-handle", + "redox_syscall 0.5.18", + "smol_str 0.3.6", + "tracing", + "winit-core", +] + +[[package]] +name = "winit-uikit" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680a356e798837d8eb274d4556e83bceaf81698194e31aafc5cfb8a9f2fab643" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "dispatch2", + "dpi", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", + "raw-window-handle", + "smol_str 0.3.6", + "tracing", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-wayland" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce5afb2ba07da603f84b722c95f9f9396d2cedae3944fb6c0cda4a6f88de545" +dependencies = [ + "ahash", + "bitflags 2.13.0", + "calloop 0.14.4", + "cursor-icon", + "dpi", + "libc", + "memmap2", + "raw-window-handle", + "rustix 1.1.4", + "smithay-client-toolkit 0.20.0", + "smol_str 0.3.6", + "tracing", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-web" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2490a953fb776fbbd5e295d54f1c3847f4f15b6c3929ec53c09acda6487a92" +dependencies = [ + "atomic-waker", + "bitflags 2.13.0", + "concurrent-queue", + "cursor-icon", + "dpi", + "js-sys", + "pin-project", + "raw-window-handle", + "smol_str 0.3.6", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "winit-core", +] + +[[package]] +name = "winit-win32" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644ea78af0e858aa3b092e5d1c67c41995a98220c81813f1353b28bc8bb91eaa" +dependencies = [ + "bitflags 2.13.0", + "cursor-icon", + "dpi", + "raw-window-handle", + "smol_str 0.3.6", + "tracing", + "unicode-segmentation", + "windows-sys 0.59.0", + "winit-core", +] + +[[package]] +name = "winit-x11" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa5b600756534c7041aa93cd0d244d44b09fca1b89e202bd1cd80dd9f3636c46" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "calloop 0.14.4", + "cursor-icon", + "dpi", + "libc", + "percent-encoding", + "raw-window-handle", + "rustix 1.1.4", + "smol_str 0.3.6", + "tracing", + "winit-common", + "winit-core", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winnow" version = "1.0.3" @@ -2324,6 +2761,7 @@ dependencies = [ "once_cell", "rustix 1.1.4", "x11rb-protocol", + "xcursor", ] [[package]] @@ -2340,9 +2778,9 @@ checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" [[package]] name = "xkbcommon" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" +checksum = "a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d" dependencies = [ "libc", "memmap2", diff --git a/Cargo.toml b/Cargo.toml index a9016b6..9441c32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] parking_lot = "0.12.5" -smithay = { version = "0.7.0", features = ["wayland-backend", "xwayland"] } +smithay = { path = "./smithay", features = ["desktop", "wayland-backend", "xwayland"] } wayland-protocols = { version = "0.32.13", features = ["wayland-server", "server"] } wayland-server = { version = "0.31.13", features = ["dlopen"] } winit = "0.30.13" diff --git a/smithay b/smithay new file mode 160000 index 0000000..cb1eb2a --- /dev/null +++ b/smithay @@ -0,0 +1 @@ +Subproject commit cb1eb2a3f48d95a7ea4b030159a2512ba667a2fb diff --git a/src/backend/mod.rs b/src/backend/mod.rs index d74f334..01328db 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -1,15 +1,11 @@ -use ::winit::raw_window_handle::{HasWindowHandle, RawWindowHandle}; use smithay::{ backend::{ renderer::{gles::GlesRenderer, RendererSuper}, winit::WinitGraphicsBackend, }, - reexports::calloop::LoopHandle, utils::{Physical, Size}, }; -use crate::state::State; - pub mod winit; pub trait Backend { diff --git a/src/backend/winit.rs b/src/backend/winit.rs index 5210a1d..49e1e3e 100644 --- a/src/backend/winit.rs +++ b/src/backend/winit.rs @@ -1,8 +1,10 @@ use std::time::Duration; -use ::winit::platform::pump_events::PumpStatus; use smithay::backend::input::ButtonState; +use smithay::input::pointer::MotionEvent; use smithay::reexports::calloop::EventLoop; +use smithay::reexports::winit::event_loop::pump_events::PumpStatus; +use smithay::utils::SERIAL_COUNTER; use smithay::{ backend::{ input::{AbsolutePositionEvent, Event, InputEvent, KeyboardKeyEvent, PointerButtonEvent}, @@ -19,23 +21,19 @@ use crate::state::State; pub fn run_winit() -> Result<(), Box> { let mut display: Display = Display::new()?; let mut event_loop = EventLoop::try_new()?; - - let mut state = State::new(&display, &event_loop)?; - state.setup_xwayland(&display)?; - let (mut backend, mut winit) = winit::init::()?; + let mut state = State::new(&display, &event_loop, backend.window_size())?; + state.setup_xwayland(&display)?; + let keyboard = state .seat .add_keyboard(Default::default(), 600, 25) .unwrap(); - let pointer = state.seat.add_pointer(); - unsafe { std::env::set_var("WAYLAND_DISPLAY", "wayland-5") }; std::process::Command::new("weston-terminal").spawn().ok(); let damage = Rectangle::from_size(backend.window_size()); - let mut i = 0; loop { let status = winit.dispatch_new_events(|event| match event { @@ -46,7 +44,7 @@ pub fn run_winit() -> Result<(), Box> { &mut state, event.key_code(), event.state(), - i.into(), + SERIAL_COUNTER.next_serial(), event.time_msec(), |_, _, _| { // @@ -60,43 +58,32 @@ pub fn run_winit() -> Result<(), Box> { let locationrel = event.position_transformed(Size::new(1, 1)); let ev = smithay::input::pointer::MotionEvent { location, - serial: i.into(), + serial: SERIAL_COUNTER.next_serial(), time: event.time_msec(), }; - state.motion_event(ev, &pointer, locationrel); + state.motion_event(ev, locationrel); } InputEvent::PointerButton { event } => { let ev = smithay::input::pointer::ButtonEvent { - serial: i.into(), + serial: SERIAL_COUNTER.next_serial(), time: event.time_msec(), button: event.button_code(), state: event.state(), }; if event.state() == ButtonState::Pressed { - if let Some(surface) = state.focused_surface() { - { - if let Some(ref surface) = surface.surface { - keyboard.set_focus( - &mut state, - Some(surface.wl_surface().clone()), - i.into(), - ); - } - if let Some(ref surface) = surface.xsurface { - keyboard.set_focus(&mut state, surface.wl_surface(), i.into()); - } - } - { - let mut space = state.space.lock(); - space.raise_element(&surface, true); - } + if let Some((surface, _)) = state.surface_under(state.pointer_location) { + keyboard.set_focus( + &mut state, + Some(surface), + SERIAL_COUNTER.next_serial(), + ); } else { - keyboard.set_focus(&mut state, None, i.into()); + keyboard.set_focus(&mut state, None, SERIAL_COUNTER.next_serial()); } } - state.button_event(ev, &pointer); + state.button_event(ev); } // InputEvent::PointerAxis { event } => todo!(), @@ -140,8 +127,11 @@ pub fn run_winit() -> Result<(), Box> { // swapping buffers because this operation may block. backend.submit(Some(&[damage]))?; - event_loop.dispatch(Duration::from_millis(1), &mut state)?; + { + let mut space = state.space.lock(); + space.refresh(); + } - i += 1; + event_loop.dispatch(Duration::from_millis(1), &mut state)?; } } diff --git a/src/main.rs b/src/main.rs index 9f02459..3543de1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ use backend::winit::run_winit; pub mod backend; pub mod state; -pub mod xwayland; fn main() -> Result<(), Box> { run_winit() diff --git a/src/state.rs b/src/state/mod.rs similarity index 51% rename from src/state.rs rename to src/state/mod.rs index 1e0f9fb..5406657 100644 --- a/src/state.rs +++ b/src/state/mod.rs @@ -1,54 +1,55 @@ +pub mod xdg; +pub mod xwayland; + use parking_lot::Mutex; use std::{sync::Arc, time::Instant}; use smithay::{ - backend::{renderer::{ - element::{ - surface::{render_elements_from_surface_tree, WaylandSurfaceRenderElement}, - AsRenderElements, Kind, + backend::{ + input::ButtonState, + renderer::{ + element::{ + surface::{render_elements_from_surface_tree, WaylandSurfaceRenderElement}, + AsRenderElements, Kind, + }, + gles::GlesRenderer, + utils::{draw_render_elements, on_commit_buffer_handler}, + Color32F, Frame, Renderer, }, - gles::GlesRenderer, - utils::{draw_render_elements, on_commit_buffer_handler}, - Color32F, Frame, Renderer, - }, input::ButtonState}, - delegate_compositor, delegate_data_device, delegate_seat, delegate_shm, delegate_xdg_shell, - desktop::{space::SpaceElement, Space, Window}, + }, + delegate_dispatch2, + desktop::{ + layer_map_for_output, space::SpaceElement, LayerSurface, Space, Window, WindowSurfaceType, + }, input::{ - pointer::{ - AxisFrame, ButtonEvent, Focus, GestureHoldBeginEvent, GestureHoldEndEvent, - GesturePinchBeginEvent, GesturePinchEndEvent, GesturePinchUpdateEvent, - GestureSwipeBeginEvent, GestureSwipeEndEvent, GestureSwipeUpdateEvent, GrabStartData, - MotionEvent, PointerGrab, PointerHandle, PointerInnerHandle, RelativeMotionEvent, - }, + dnd::DndGrabHandler, + pointer::{ButtonEvent, Focus, GrabStartData, MotionEvent, PointerHandle}, Seat, SeatHandler, SeatState, }, + output::{Mode, Output, PhysicalProperties, Subpixel}, reexports::{ calloop::{EventLoop, LoopHandle}, - wayland_server::{protocol::wl_seat, Display}, + rustix::fs::Stat, + wayland_server::Display, }, - utils::{IsAlive, Logical, Point, Rectangle, Scale, Serial, Transform}, + utils::{IsAlive, Logical, Physical, Point, Rectangle, Scale, Size, Transform}, wayland::{ buffer::BufferHandler, compositor::{ with_surface_tree_downward, CompositorClientState, CompositorHandler, CompositorState, SurfaceAttributes, TraversalAction, }, - seat::WaylandFocus, + output::OutputHandler, selection::{ - data_device::{ - ClientDndGrabHandler, DataDeviceHandler, DataDeviceState, ServerDndGrabHandler, - }, + data_device::{DataDeviceHandler, DataDeviceState, WaylandDndGrabHandler}, SelectionHandler, }, - shell::xdg::{ - PopupSurface, PositionerState, ToplevelSurface, XdgShellHandler, XdgShellState, - }, + shell::xdg::{ToplevelSurface, XdgShellHandler, XdgShellState}, shm::{ShmHandler, ShmState}, xwayland_shell::XWaylandShellState, }, - xwayland::{X11Surface, XWaylandClientData, xwm::ResizeEdge}, + xwayland::{X11Surface, XWaylandClientData}, }; -use wayland_protocols::xdg::shell::server::xdg_toplevel; use wayland_server::{ backend::{ClientData, ClientId, DisconnectReason}, protocol::{ @@ -58,16 +59,16 @@ use wayland_server::{ Client, ListeningSocket, }; -use crate::xwayland::XWaylandState; +use crate::state::{xdg::MoveGrab, xwayland::XWaylandState}; pub struct State { + output: Output, pub seat: Seat, pub space: Mutex>, clients: Mutex>, - pointer_location: Point, - pointer_location_rel: Point, + pub pointer_location: Point, start_time: Instant, listener: ListeningSocket, @@ -75,6 +76,8 @@ pub struct State { pub event_loop_handle: LoopHandle<'static, Self>, pub xwayland_state: XWaylandState, + pointer: Arc>, + start_data: GrabStartData, compositor_state: CompositorState, @@ -88,18 +91,48 @@ impl State { pub fn new( display: &Display, event_loop: &EventLoop<'static, Self>, + size: Size, ) -> Result> { let dh = display.handle(); let compositor_state = CompositorState::new::(&dh); let shm_state = ShmState::new::(&dh, vec![]); let mut seat_state = SeatState::new(); - let seat = seat_state.new_wl_seat(&dh, "milkyway_seat"); - let space = Space::default(); + let mut seat = seat_state.new_wl_seat(&dh, "milkyway_seat"); + let mut space = Space::default(); let listener = ListeningSocket::bind("wayland-5").unwrap(); let event_loop_handle = event_loop.handle(); + + let pointer = Arc::new(seat.add_pointer()); + + let mode = Mode { + size, + refresh: 60_000, + }; + let output = Output::new( + "winit".to_string(), + PhysicalProperties { + size: (0, 0).into(), + subpixel: Subpixel::Unknown, + make: "Smithay".into(), + model: "Winit".into(), + serial_number: "Unknown".into(), + }, + ); + let _global = output.create_global::(&dh); + output.change_current_state( + Some(mode), + Some(Transform::Flipped180), + None, + Some((0, 0).into()), + ); + output.set_preferred(mode); + + space.map_output(&output, (0, 0)); + Ok(State { + output, compositor_state, xdg_shell_state: XdgShellState::new::(&dh), shm_state, @@ -110,8 +143,8 @@ impl State { listener, clients: Mutex::new(vec![]), space: Mutex::new(space), + pointer, pointer_location: Point::new(0.0, 0.0), - pointer_location_rel: Point::new(0.0, 0.0), event_loop_handle, xwayland_state: XWaylandState { xwm: None, @@ -141,25 +174,12 @@ impl State { let mut elements = space .elements() .flat_map(|element| { - if let Some(surface) = element.surface.clone() { - return render_elements_from_surface_tree( - renderer, - surface.wl_surface(), - (0, 0), - 1.0, - 1.0, - Kind::Unspecified, - ); - } - if let Some(surface) = element.xsurface.clone() { - return surface.render_elements( - renderer, - Point::new(0, 0), - Scale { x: 1.0, y: 1.0 }, - 1.0, - ); - } - panic!() + let loc = space.element_location(element).unwrap_or(Point::new(0, 0)); + let position = + loc.to_physical_precise_round(self.output.current_scale().fractional_scale()); + element + .window + .render_elements(renderer, position, Scale { x: 1.0, y: 1.0 }, 1.0) }) .collect::>>(); @@ -192,6 +212,41 @@ impl State { Ok(()) } + // pub fn focused_surface(&mut self) -> Option { + // let space = self.space.lock(); + // // let mut surfaces = vec![]; + // let mut elements = space.elements().collect::>(); + // elements.reverse(); + // for window in elements { + // if window.is_in_input_region(&self.pointer_location) { + // return Some(window.clone()); + // } + // } + + // None + // } + + pub fn surface_under( + &self, + pos: Point, + ) -> Option<(WlSurface, Point)> { + self.space + .lock() + .element_under(pos) + .and_then(|(window, location)| { + window + .window + .surface_under(pos - location.to_f64(), WindowSurfaceType::ALL) + .map(|(s, p)| (s, (p + location).to_f64())) + }) + } + + pub fn button_event(&mut self, ev: ButtonEvent) { + let pointer = self.pointer.clone(); + pointer.button(self, &ev); + pointer.frame(self); + } + pub fn focused_surface(&mut self) -> Option { let space = self.space.lock(); // let mut surfaces = vec![]; @@ -206,26 +261,9 @@ impl State { None } - pub fn button_event(&mut self, ev: ButtonEvent, pointer: &PointerHandle) { - if ev.state == ButtonState::Pressed && let Some(app) = self.focused_surface() { - let space = self.space.lock(); - - let initial_rect = space.element_geometry(&app).unwrap(); - - println!("{:?}",initial_rect); - }; - - pointer.button(self, &ev); - } - - pub fn motion_event( - &mut self, - ev: MotionEvent, - pointer: &PointerHandle, - locationrel: Point, - ) { + pub fn motion_event(&mut self, ev: MotionEvent, locationrel: Point) { + let pointer = self.pointer.clone(); self.pointer_location = ev.location; - self.pointer_location_rel = locationrel; if let Some(surface) = self.focused_surface() { if let Some(surface) = surface.surface { pointer.motion(self, Some((surface.wl_surface().clone(), locationrel)), &ev); @@ -271,49 +309,14 @@ impl BufferHandler for State { fn buffer_destroyed(&mut self, _buffer: &wl_buffer::WlBuffer) {} } -impl XdgShellHandler for State { - fn xdg_shell_state(&mut self) -> &mut XdgShellState { - &mut self.xdg_shell_state - } - - fn new_toplevel(&mut self, surface: ToplevelSurface) { - surface.with_pending_state(|state| { - state.states.set(xdg_toplevel::State::Activated); - }); - surface.send_configure(); - - let mut space = self.space.lock(); - - space.map_element(AppWrapper::new_wayland(surface), (0, 0), true); - } - - fn new_popup(&mut self, _surface: PopupSurface, _positioner: PositionerState) { - // Handle popup creation here - } - - fn grab(&mut self, _surface: PopupSurface, _seat: wl_seat::WlSeat, _serial: Serial) { - // Handle popup grab here - } - - fn reposition_request( - &mut self, - _surface: PopupSurface, - _positioner: PositionerState, - _token: u32, - ) { - // Handle popup reposition here - } -} - impl SelectionHandler for State { type SelectionUserData = (); } -impl ClientDndGrabHandler for State {} -impl ServerDndGrabHandler for State {} +impl WaylandDndGrabHandler for State {} impl DataDeviceHandler for State { - fn data_device_state(&self) -> &DataDeviceState { - &self.data_device_state + fn data_device_state(&mut self) -> &mut DataDeviceState { + &mut self.data_device_state } } @@ -361,168 +364,7 @@ impl SeatHandler for State { } } -pub struct MoveGrab { - start_data: GrabStartData, - window: Window, - initial_window_location: Point, -} - -impl PointerGrab for MoveGrab { - fn motion( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - _focus: Option<(::PointerFocus, Point)>, - event: &MotionEvent, - ) { - handle.motion(data, None, event); - - // let delta = event.location - self.start_data.location; - - // let mut new_width = self.initial_rect.size.w; - // let mut new_height = self.initial_rect.size.h; - - // if self.edges.intersects(ResizeEdge::LEFT | ResizeEdge::RIGHT) { - // new_width = if self.edges.intersects(ResizeEdge::LEFT) { - // (self.initial_rect.size.w as f64 - delta.x) as i32 - // } else { - // (self.initial_rect.size.w as f64 + delta.x) as i32 - // }; - // } - // if self.edges.intersects(ResizeEdge::TOP | ResizeEdge::BOTTOM) { - // new_height = if self.edges.intersects(ResizeEdge::TOP) { - // (self.initial_rect.size.h as f64 - delta.y) as i32 - // } else { - // (self.initial_rect.size.h as f64 + delta.y) as i32 - // }; - // } - - // // clamp to whatever min/max you enforce - // let (min_size, max_size) = (Size::from((100, 100)), Size::from((i32::MAX, i32::MAX))); - // new_width = new_width.clamp(min_size.w, max_size.w); - // new_height = new_height.clamp(min_size.h, max_size.h); - - // self.last_window_size = (new_width, new_height).into(); - - // if let Some(toplevel) = self.window.toplevel() { - // toplevel.with_pending_state(|state| { - // state.size = Some(self.last_window_size); - // state.states.set(xdg_toplevel::State::Resizing); - // }); - // toplevel.send_pending_configure(); - // } - } - - fn relative_motion( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - focus: Option<(::PointerFocus, Point)>, - event: &RelativeMotionEvent, - ) { - handle.relative_motion(data, focus, event); - } - - fn button( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &ButtonEvent, - ) { - handle.button(data, event); - } - - fn axis( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - details: AxisFrame, - ) { - handle.axis(data, details) - } - - fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<'_, State>) { - handle.frame(data); - } - - fn gesture_swipe_begin( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GestureSwipeBeginEvent, - ) { - handle.gesture_swipe_begin(data, event); - } - - fn gesture_swipe_update( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GestureSwipeUpdateEvent, - ) { - handle.gesture_swipe_update(data, event); - } - - fn gesture_swipe_end( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GestureSwipeEndEvent, - ) { - handle.gesture_swipe_end(data, event); - } - - fn gesture_pinch_begin( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GesturePinchBeginEvent, - ) { - handle.gesture_pinch_begin(data, event); - } - - fn gesture_pinch_update( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GesturePinchUpdateEvent, - ) { - handle.gesture_pinch_update(data, event); - } - - fn gesture_pinch_end( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GesturePinchEndEvent, - ) { - handle.gesture_pinch_end(data, event); - } - - fn gesture_hold_begin( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GestureHoldBeginEvent, - ) { - handle.gesture_hold_begin(data, event); - } - - fn gesture_hold_end( - &mut self, - data: &mut State, - handle: &mut PointerInnerHandle<'_, State>, - event: &GestureHoldEndEvent, - ) { - handle.gesture_hold_end(data, event); - } - - fn start_data(&self) -> &GrabStartData { - &self.start_data - } - - fn unset(&mut self, data: &mut State) {} -} +impl DndGrabHandler for State {} #[derive(PartialEq, Clone)] pub struct AppWrapper { @@ -616,9 +458,7 @@ impl ClientData for ClientState { } } +impl OutputHandler for State {} + // Macros used to delegate protocol handling to types in the app state. -delegate_xdg_shell!(State); -delegate_compositor!(State); -delegate_shm!(State); -delegate_seat!(State); -delegate_data_device!(State); +delegate_dispatch2!(State); diff --git a/src/state/xdg.rs b/src/state/xdg.rs new file mode 100644 index 0000000..17e7b7d --- /dev/null +++ b/src/state/xdg.rs @@ -0,0 +1,283 @@ +use smithay::desktop::Window; +use smithay::input::pointer::{ + AxisFrame, ButtonEvent, Focus, GestureHoldBeginEvent, GestureHoldEndEvent, + GesturePinchBeginEvent, GesturePinchEndEvent, GesturePinchUpdateEvent, GestureSwipeBeginEvent, + GestureSwipeEndEvent, GestureSwipeUpdateEvent, GrabStartData, MotionEvent, PointerGrab, + PointerInnerHandle, RelativeMotionEvent, +}; +use smithay::input::SeatHandler; +use smithay::utils::{Logical, Point}; +use smithay::wayland::shell::xdg::PopupSurface; +use smithay::{ + utils::Serial, + wayland::shell::xdg::{PositionerState, ToplevelSurface, XdgShellHandler, XdgShellState}, +}; +use wayland_protocols::xdg::shell::server::xdg_toplevel; +use wayland_server::protocol::{wl_output, wl_seat}; + +use super::{AppWrapper, State}; + +impl XdgShellHandler for State { + fn xdg_shell_state(&mut self) -> &mut XdgShellState { + &mut self.xdg_shell_state + } + + fn new_toplevel(&mut self, surface: ToplevelSurface) { + surface.with_pending_state(|state| { + state.states.set(xdg_toplevel::State::Activated); + }); + surface.send_configure(); + + let mut space = self.space.lock(); + + space.map_element(AppWrapper::new_wayland(surface), (0, 0), true); + } + + fn new_popup(&mut self, _surface: PopupSurface, _positioner: PositionerState) { + // Handle popup creation here + } + + fn grab(&mut self, _surface: PopupSurface, _seat: wl_seat::WlSeat, _serial: Serial) { + // Handle popup grab here + } + + fn reposition_request( + &mut self, + _surface: PopupSurface, + _positioner: PositionerState, + _token: u32, + ) { + // Handle popup reposition here + } + + fn move_request(&mut self, wl_surface: ToplevelSurface, seat: wl_seat::WlSeat, serial: Serial) { + let window = { + let space = self.space.lock(); + space + .elements() + .find(|w| { + if let Some(surface) = w.surface.clone() { + surface == wl_surface + } else { + false + } + }) + .unwrap() + .clone() + }; + let pointer = self.pointer.clone(); + let loc = { + let space = self.space.lock(); + space.element_location(&window).unwrap() + }; + + let start_data = self.pointer.grab_start_data().unwrap(); + + pointer.set_grab( + self, + MoveGrab { + start_data, + window: window.window.clone(), + initial_window_location: loc, + app: window, + }, + serial, + Focus::Clear, + ); + } + + fn resize_request( + &mut self, + surface: ToplevelSurface, + seat: wl_seat::WlSeat, + serial: Serial, + edges: xdg_toplevel::ResizeEdge, + ) { + // println!( + // "resize {:?}", + // self.pointer_location_og - self.pointer_location + // ); + } + + // fn maximize_request(&mut self, surface: ToplevelSurface) { + // surface.send_configure(); + // } + + // fn unmaximize_request(&mut self, surface: ToplevelSurface) {} + + // fn fullscreen_request( + // &mut self, + // surface: ToplevelSurface, + // output: Option, + // ) { + // surface.send_configure(); + // } + + // fn unfullscreen_request(&mut self, surface: ToplevelSurface) {} + + // fn minimize_request(&mut self, surface: ToplevelSurface) {} + + // fn show_window_menu( + // &mut self, + // surface: ToplevelSurface, + // seat: wl_seat::WlSeat, + // serial: Serial, + // location: smithay::utils::Point, + // ) { + // } + + // fn client_destroyed(&mut self, client: smithay::wayland::shell::xdg::ShellClient) {} + + // fn toplevel_destroyed(&mut self, surface: ToplevelSurface) {} + + // fn popup_destroyed(&mut self, surface: PopupSurface) {} + + // fn app_id_changed(&mut self, surface: ToplevelSurface) {} + + // fn title_changed(&mut self, surface: ToplevelSurface) {} + + // fn parent_changed(&mut self, surface: ToplevelSurface) {} +} + +pub struct MoveGrab { + pub start_data: GrabStartData, + pub window: Window, + pub initial_window_location: Point, + pub app: AppWrapper, +} + +impl PointerGrab for MoveGrab { + fn motion( + &mut self, + state: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + focus: Option<(::PointerFocus, Point)>, + event: &MotionEvent, + ) { + handle.motion(state, None, event); + let delta = event.location - self.start_data.location; + let new_location = self.initial_window_location.to_f64() + delta; + + let mut space = state.space.lock(); + space.map_element(self.app.clone(), new_location.to_i32_round(), true); + } + + fn relative_motion( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + focus: Option<(::PointerFocus, Point)>, + event: &RelativeMotionEvent, + ) { + handle.relative_motion(data, focus, event); + } + + fn button( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &ButtonEvent, + ) { + handle.button(data, event); + + // The button is a button code as defined in the + // Linux kernel's linux/input-event-codes.h header file, e.g. BTN_LEFT. + const BTN_LEFT: u32 = 0x110; + + if !handle.current_pressed().contains(&BTN_LEFT) { + // No more buttons are pressed, release the grab. + handle.unset_grab(self, data, event.serial, event.time, true); + } + } + + fn axis( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + details: AxisFrame, + ) { + handle.axis(data, details) + } + + fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<'_, State>) { + handle.frame(data); + } + + fn gesture_swipe_begin( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GestureSwipeBeginEvent, + ) { + handle.gesture_swipe_begin(data, event); + } + + fn gesture_swipe_update( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GestureSwipeUpdateEvent, + ) { + handle.gesture_swipe_update(data, event); + } + + fn gesture_swipe_end( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GestureSwipeEndEvent, + ) { + handle.gesture_swipe_end(data, event); + } + + fn gesture_pinch_begin( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GesturePinchBeginEvent, + ) { + handle.gesture_pinch_begin(data, event); + } + + fn gesture_pinch_update( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GesturePinchUpdateEvent, + ) { + handle.gesture_pinch_update(data, event); + } + + fn gesture_pinch_end( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GesturePinchEndEvent, + ) { + handle.gesture_pinch_end(data, event); + } + + fn gesture_hold_begin( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GestureHoldBeginEvent, + ) { + handle.gesture_hold_begin(data, event); + } + + fn gesture_hold_end( + &mut self, + data: &mut State, + handle: &mut PointerInnerHandle<'_, State>, + event: &GestureHoldEndEvent, + ) { + handle.gesture_hold_end(data, event); + } + + fn start_data(&self) -> &GrabStartData { + &self.start_data + } + + fn unset(&mut self, data: &mut State) {} +} diff --git a/src/xwayland.rs b/src/state/xwayland.rs similarity index 92% rename from src/xwayland.rs rename to src/state/xwayland.rs index ef9c685..f7804cf 100644 --- a/src/xwayland.rs +++ b/src/state/xwayland.rs @@ -1,8 +1,7 @@ use std::process::Stdio; use smithay::{ - delegate_xwayland_shell, - reexports::calloop::EventLoop, + delegate_dispatch2, utils::{Logical, Rectangle}, wayland::xwayland_shell::{XWaylandShellHandler, XWaylandShellState}, xwayland::{ @@ -33,7 +32,6 @@ impl XwmHandler for State { let mut space = self.space.lock(); - let z_index = space.elements().len(); space.map_element(AppWrapper::new_x11(window), (0, 0), true); // insert it into your Space/window management here @@ -42,7 +40,7 @@ impl XwmHandler for State { fn mapped_override_redirect_window(&mut self, _xwm: XwmId, _window: X11Surface) {} fn unmapped_window(&mut self, _xwm: XwmId, _window: X11Surface) { - let mut space = self.space.lock(); + // let mut space = self.space.lock(); } fn destroyed_window(&mut self, _xwm: XwmId, _window: X11Surface) {} @@ -99,6 +97,7 @@ impl State { &dh, None, std::iter::empty::<(String, String)>(), + std::iter::empty::(), true, Stdio::null(), Stdio::null(), @@ -113,7 +112,7 @@ impl State { display_number, } => { let event_loop = state.event_loop_handle.clone(); - let wm = X11Wm::start_wm(event_loop, x11_socket, client.clone()) + let wm = X11Wm::start_wm(event_loop, &dh, x11_socket, client.clone()) .expect("failed to start X11 wm"); state.xwayland_state.xwm = Some(wm); @@ -130,5 +129,3 @@ impl State { Ok(()) } } - -delegate_xwayland_shell!(State);