Active-session device access manager
0

Configure Feed

Select the types of activity you want to include in your feed.

prepare basic udev + hyprwire setup

r0chd (Jul 17, 2026, 8:50 PM +0200) 10237c8d d2f2ec2a

+1196 -3
+621
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "aho-corasick" 7 + version = "1.1.4" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 10 + dependencies = [ 11 + "memchr", 12 + ] 13 + 14 + [[package]] 15 + name = "anstream" 16 + version = "1.0.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" 19 + dependencies = [ 20 + "anstyle", 21 + "anstyle-parse", 22 + "anstyle-query", 23 + "anstyle-wincon", 24 + "colorchoice", 25 + "is_terminal_polyfill", 26 + "utf8parse", 27 + ] 28 + 29 + [[package]] 30 + name = "anstyle" 31 + version = "1.0.14" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" 34 + 35 + [[package]] 36 + name = "anstyle-parse" 37 + version = "1.0.0" 38 + source = "registry+https://github.com/rust-lang/crates.io-index" 39 + checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" 40 + dependencies = [ 41 + "utf8parse", 42 + ] 43 + 44 + [[package]] 45 + name = "anstyle-query" 46 + version = "1.1.5" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 49 + dependencies = [ 50 + "windows-sys 0.61.2", 51 + ] 52 + 53 + [[package]] 54 + name = "anstyle-wincon" 55 + version = "3.0.11" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 58 + dependencies = [ 59 + "anstyle", 60 + "once_cell_polyfill", 61 + "windows-sys 0.61.2", 62 + ] 63 + 64 + [[package]] 65 + name = "anyhow" 66 + version = "1.0.103" 67 + source = "registry+https://github.com/rust-lang/crates.io-index" 68 + checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" 69 + 70 + [[package]] 71 + name = "bitflags" 72 + version = "1.3.2" 73 + source = "registry+https://github.com/rust-lang/crates.io-index" 74 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 75 + 76 + [[package]] 77 + name = "bitflags" 78 + version = "2.13.1" 79 + source = "registry+https://github.com/rust-lang/crates.io-index" 80 + checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" 81 + 82 + [[package]] 83 + name = "calloop" 84 + version = "0.14.4" 85 + source = "registry+https://github.com/rust-lang/crates.io-index" 86 + checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" 87 + dependencies = [ 88 + "bitflags 2.13.1", 89 + "polling", 90 + "rustix", 91 + "slab", 92 + "tracing", 93 + ] 94 + 95 + [[package]] 96 + name = "cfg-if" 97 + version = "1.0.4" 98 + source = "registry+https://github.com/rust-lang/crates.io-index" 99 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 100 + 101 + [[package]] 102 + name = "colorchoice" 103 + version = "1.0.5" 104 + source = "registry+https://github.com/rust-lang/crates.io-index" 105 + checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" 106 + 107 + [[package]] 108 + name = "concurrent-queue" 109 + version = "2.5.0" 110 + source = "registry+https://github.com/rust-lang/crates.io-index" 111 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 112 + dependencies = [ 113 + "crossbeam-utils", 114 + ] 115 + 116 + [[package]] 117 + name = "crossbeam-utils" 118 + version = "0.8.22" 119 + source = "registry+https://github.com/rust-lang/crates.io-index" 120 + checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" 121 + 122 + [[package]] 123 + name = "defmt" 124 + version = "1.1.1" 125 + source = "registry+https://github.com/rust-lang/crates.io-index" 126 + checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" 127 + dependencies = [ 128 + "bitflags 1.3.2", 129 + "defmt-macros", 130 + ] 131 + 132 + [[package]] 133 + name = "defmt-macros" 134 + version = "1.1.1" 135 + source = "registry+https://github.com/rust-lang/crates.io-index" 136 + checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" 137 + dependencies = [ 138 + "defmt-parser", 139 + "proc-macro2", 140 + "quote", 141 + "syn", 142 + ] 143 + 144 + [[package]] 145 + name = "defmt-parser" 146 + version = "1.0.0" 147 + source = "registry+https://github.com/rust-lang/crates.io-index" 148 + checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" 149 + dependencies = [ 150 + "thiserror", 151 + ] 152 + 153 + [[package]] 154 + name = "env_filter" 155 + version = "2.0.0" 156 + source = "registry+https://github.com/rust-lang/crates.io-index" 157 + checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" 158 + dependencies = [ 159 + "log", 160 + "regex", 161 + ] 162 + 163 + [[package]] 164 + name = "env_logger" 165 + version = "0.11.11" 166 + source = "registry+https://github.com/rust-lang/crates.io-index" 167 + checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" 168 + dependencies = [ 169 + "anstream", 170 + "anstyle", 171 + "env_filter", 172 + "jiff", 173 + "log", 174 + ] 175 + 176 + [[package]] 177 + name = "errno" 178 + version = "0.3.14" 179 + source = "registry+https://github.com/rust-lang/crates.io-index" 180 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 181 + dependencies = [ 182 + "libc", 183 + "windows-sys 0.61.2", 184 + ] 185 + 186 + [[package]] 187 + name = "hermit-abi" 188 + version = "0.3.9" 189 + source = "registry+https://github.com/rust-lang/crates.io-index" 190 + checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 191 + 192 + [[package]] 193 + name = "hermit-abi" 194 + version = "0.5.2" 195 + source = "registry+https://github.com/rust-lang/crates.io-index" 196 + checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" 197 + 198 + [[package]] 199 + name = "hyprwire" 200 + version = "0.4.4" 201 + source = "registry+https://github.com/rust-lang/crates.io-index" 202 + checksum = "a78fe1e67d8bd1ae09ed3c58ab50fcea11061f518ad68c2f2cfb23c927a5dd23" 203 + dependencies = [ 204 + "hyprwire-core", 205 + "hyprwire-scanner", 206 + "polling", 207 + "rustix", 208 + ] 209 + 210 + [[package]] 211 + name = "hyprwire-core" 212 + version = "0.4.4" 213 + source = "registry+https://github.com/rust-lang/crates.io-index" 214 + checksum = "59b355b3c182b462e5d0f005873c2127290da6a05c71424df5cc711637682d6d" 215 + 216 + [[package]] 217 + name = "hyprwire-scanner" 218 + version = "0.4.4" 219 + source = "registry+https://github.com/rust-lang/crates.io-index" 220 + checksum = "152a5485f7b170087eb346de9f624b1c2d61e987fe0d82429c2c8c4e99b49c9d" 221 + dependencies = [ 222 + "hyprwire-core", 223 + "prettyplease", 224 + "proc-macro2", 225 + "quick-xml", 226 + "quote", 227 + "syn", 228 + ] 229 + 230 + [[package]] 231 + name = "io-lifetimes" 232 + version = "1.0.11" 233 + source = "registry+https://github.com/rust-lang/crates.io-index" 234 + checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" 235 + dependencies = [ 236 + "hermit-abi 0.3.9", 237 + "libc", 238 + "windows-sys 0.48.0", 239 + ] 240 + 241 + [[package]] 242 + name = "is_terminal_polyfill" 243 + version = "1.70.2" 244 + source = "registry+https://github.com/rust-lang/crates.io-index" 245 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 246 + 247 + [[package]] 248 + name = "jiff" 249 + version = "0.2.32" 250 + source = "registry+https://github.com/rust-lang/crates.io-index" 251 + checksum = "961d16382652bfdd8c6f68b223b26a8c93e0d475c672f414411db31c6c5c900e" 252 + dependencies = [ 253 + "defmt", 254 + "jiff-static", 255 + "log", 256 + "portable-atomic", 257 + "portable-atomic-util", 258 + "serde_core", 259 + ] 260 + 261 + [[package]] 262 + name = "jiff-static" 263 + version = "0.2.32" 264 + source = "registry+https://github.com/rust-lang/crates.io-index" 265 + checksum = "d0879bd39df99c4c5e2c6615ccc026391a423dde10532c573e6086eb94a802cc" 266 + dependencies = [ 267 + "proc-macro2", 268 + "quote", 269 + "syn", 270 + ] 271 + 272 + [[package]] 273 + name = "libc" 274 + version = "0.2.186" 275 + source = "registry+https://github.com/rust-lang/crates.io-index" 276 + checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" 277 + 278 + [[package]] 279 + name = "libudev-sys" 280 + version = "0.1.4" 281 + source = "registry+https://github.com/rust-lang/crates.io-index" 282 + checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" 283 + dependencies = [ 284 + "libc", 285 + "pkg-config", 286 + ] 287 + 288 + [[package]] 289 + name = "linux-raw-sys" 290 + version = "0.12.1" 291 + source = "registry+https://github.com/rust-lang/crates.io-index" 292 + checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" 293 + 294 + [[package]] 295 + name = "log" 296 + version = "0.4.33" 297 + source = "registry+https://github.com/rust-lang/crates.io-index" 298 + checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" 299 + 300 + [[package]] 301 + name = "memchr" 302 + version = "2.8.3" 303 + source = "registry+https://github.com/rust-lang/crates.io-index" 304 + checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" 305 + 306 + [[package]] 307 + name = "once_cell_polyfill" 308 + version = "1.70.2" 309 + source = "registry+https://github.com/rust-lang/crates.io-index" 310 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 311 + 312 + [[package]] 313 + name = "pin-project-lite" 314 + version = "0.2.17" 315 + source = "registry+https://github.com/rust-lang/crates.io-index" 316 + checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" 317 + 318 + [[package]] 319 + name = "pkg-config" 320 + version = "0.3.33" 321 + source = "registry+https://github.com/rust-lang/crates.io-index" 322 + checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" 323 + 324 + [[package]] 325 + name = "polling" 326 + version = "3.11.0" 327 + source = "registry+https://github.com/rust-lang/crates.io-index" 328 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 329 + dependencies = [ 330 + "cfg-if", 331 + "concurrent-queue", 332 + "hermit-abi 0.5.2", 333 + "pin-project-lite", 334 + "rustix", 335 + "windows-sys 0.61.2", 336 + ] 337 + 338 + [[package]] 339 + name = "portable-atomic" 340 + version = "1.14.0" 341 + source = "registry+https://github.com/rust-lang/crates.io-index" 342 + checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" 343 + 344 + [[package]] 345 + name = "portable-atomic-util" 346 + version = "0.2.7" 347 + source = "registry+https://github.com/rust-lang/crates.io-index" 348 + checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" 349 + dependencies = [ 350 + "portable-atomic", 351 + ] 352 + 353 + [[package]] 354 + name = "prettyplease" 355 + version = "0.2.37" 356 + source = "registry+https://github.com/rust-lang/crates.io-index" 357 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 358 + dependencies = [ 359 + "proc-macro2", 360 + "syn", 361 + ] 362 + 363 + [[package]] 364 + name = "proc-macro2" 365 + version = "1.0.106" 366 + source = "registry+https://github.com/rust-lang/crates.io-index" 367 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 368 + dependencies = [ 369 + "unicode-ident", 370 + ] 371 + 372 + [[package]] 373 + name = "quick-xml" 374 + version = "0.37.5" 375 + source = "registry+https://github.com/rust-lang/crates.io-index" 376 + checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 377 + dependencies = [ 378 + "memchr", 379 + ] 380 + 381 + [[package]] 382 + name = "quote" 383 + version = "1.0.46" 384 + source = "registry+https://github.com/rust-lang/crates.io-index" 385 + checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" 386 + dependencies = [ 387 + "proc-macro2", 388 + ] 389 + 390 + [[package]] 391 + name = "regex" 392 + version = "1.13.1" 393 + source = "registry+https://github.com/rust-lang/crates.io-index" 394 + checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" 395 + dependencies = [ 396 + "aho-corasick", 397 + "memchr", 398 + "regex-automata", 399 + "regex-syntax", 400 + ] 401 + 402 + [[package]] 403 + name = "regex-automata" 404 + version = "0.4.16" 405 + source = "registry+https://github.com/rust-lang/crates.io-index" 406 + checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" 407 + dependencies = [ 408 + "aho-corasick", 409 + "memchr", 410 + "regex-syntax", 411 + ] 412 + 413 + [[package]] 414 + name = "regex-syntax" 415 + version = "0.8.11" 416 + source = "registry+https://github.com/rust-lang/crates.io-index" 417 + checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" 418 + 419 + [[package]] 420 + name = "rustix" 421 + version = "1.1.4" 422 + source = "registry+https://github.com/rust-lang/crates.io-index" 423 + checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" 424 + dependencies = [ 425 + "bitflags 2.13.1", 426 + "errno", 427 + "libc", 428 + "linux-raw-sys", 429 + "windows-sys 0.61.2", 430 + ] 431 + 432 + [[package]] 433 + name = "serde_core" 434 + version = "1.0.228" 435 + source = "registry+https://github.com/rust-lang/crates.io-index" 436 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 437 + dependencies = [ 438 + "serde_derive", 439 + ] 440 + 441 + [[package]] 442 + name = "serde_derive" 443 + version = "1.0.228" 444 + source = "registry+https://github.com/rust-lang/crates.io-index" 445 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 446 + dependencies = [ 447 + "proc-macro2", 448 + "quote", 449 + "syn", 450 + ] 451 + 452 + [[package]] 453 + name = "sessiond-uaccess" 454 + version = "0.1.0" 455 + dependencies = [ 456 + "anyhow", 457 + "calloop", 458 + "env_logger", 459 + "hyprwire", 460 + "hyprwire-scanner", 461 + "udev", 462 + ] 463 + 464 + [[package]] 465 + name = "slab" 466 + version = "0.4.12" 467 + source = "registry+https://github.com/rust-lang/crates.io-index" 468 + checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 469 + 470 + [[package]] 471 + name = "syn" 472 + version = "2.0.119" 473 + source = "registry+https://github.com/rust-lang/crates.io-index" 474 + checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" 475 + dependencies = [ 476 + "proc-macro2", 477 + "quote", 478 + "unicode-ident", 479 + ] 480 + 481 + [[package]] 482 + name = "thiserror" 483 + version = "2.0.18" 484 + source = "registry+https://github.com/rust-lang/crates.io-index" 485 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 486 + dependencies = [ 487 + "thiserror-impl", 488 + ] 489 + 490 + [[package]] 491 + name = "thiserror-impl" 492 + version = "2.0.18" 493 + source = "registry+https://github.com/rust-lang/crates.io-index" 494 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 495 + dependencies = [ 496 + "proc-macro2", 497 + "quote", 498 + "syn", 499 + ] 500 + 501 + [[package]] 502 + name = "tracing" 503 + version = "0.1.44" 504 + source = "registry+https://github.com/rust-lang/crates.io-index" 505 + checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 506 + dependencies = [ 507 + "log", 508 + "pin-project-lite", 509 + "tracing-core", 510 + ] 511 + 512 + [[package]] 513 + name = "tracing-core" 514 + version = "0.1.36" 515 + source = "registry+https://github.com/rust-lang/crates.io-index" 516 + checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" 517 + 518 + [[package]] 519 + name = "udev" 520 + version = "0.9.3" 521 + source = "registry+https://github.com/rust-lang/crates.io-index" 522 + checksum = "af4e37e9ea4401fc841ff54b9ddfc9be1079b1e89434c1a6a865dd68980f7e9f" 523 + dependencies = [ 524 + "io-lifetimes", 525 + "libc", 526 + "libudev-sys", 527 + "pkg-config", 528 + ] 529 + 530 + [[package]] 531 + name = "unicode-ident" 532 + version = "1.0.24" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 535 + 536 + [[package]] 537 + name = "utf8parse" 538 + version = "0.2.2" 539 + source = "registry+https://github.com/rust-lang/crates.io-index" 540 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 541 + 542 + [[package]] 543 + name = "windows-link" 544 + version = "0.2.1" 545 + source = "registry+https://github.com/rust-lang/crates.io-index" 546 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 547 + 548 + [[package]] 549 + name = "windows-sys" 550 + version = "0.48.0" 551 + source = "registry+https://github.com/rust-lang/crates.io-index" 552 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 553 + dependencies = [ 554 + "windows-targets", 555 + ] 556 + 557 + [[package]] 558 + name = "windows-sys" 559 + version = "0.61.2" 560 + source = "registry+https://github.com/rust-lang/crates.io-index" 561 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 562 + dependencies = [ 563 + "windows-link", 564 + ] 565 + 566 + [[package]] 567 + name = "windows-targets" 568 + version = "0.48.5" 569 + source = "registry+https://github.com/rust-lang/crates.io-index" 570 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 571 + dependencies = [ 572 + "windows_aarch64_gnullvm", 573 + "windows_aarch64_msvc", 574 + "windows_i686_gnu", 575 + "windows_i686_msvc", 576 + "windows_x86_64_gnu", 577 + "windows_x86_64_gnullvm", 578 + "windows_x86_64_msvc", 579 + ] 580 + 581 + [[package]] 582 + name = "windows_aarch64_gnullvm" 583 + version = "0.48.5" 584 + source = "registry+https://github.com/rust-lang/crates.io-index" 585 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 586 + 587 + [[package]] 588 + name = "windows_aarch64_msvc" 589 + version = "0.48.5" 590 + source = "registry+https://github.com/rust-lang/crates.io-index" 591 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 592 + 593 + [[package]] 594 + name = "windows_i686_gnu" 595 + version = "0.48.5" 596 + source = "registry+https://github.com/rust-lang/crates.io-index" 597 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 598 + 599 + [[package]] 600 + name = "windows_i686_msvc" 601 + version = "0.48.5" 602 + source = "registry+https://github.com/rust-lang/crates.io-index" 603 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 604 + 605 + [[package]] 606 + name = "windows_x86_64_gnu" 607 + version = "0.48.5" 608 + source = "registry+https://github.com/rust-lang/crates.io-index" 609 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 610 + 611 + [[package]] 612 + name = "windows_x86_64_gnullvm" 613 + version = "0.48.5" 614 + source = "registry+https://github.com/rust-lang/crates.io-index" 615 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 616 + 617 + [[package]] 618 + name = "windows_x86_64_msvc" 619 + version = "0.48.5" 620 + source = "registry+https://github.com/rust-lang/crates.io-index" 621 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+8
Cargo.toml
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 + anyhow = "1.0.103" 8 + calloop = "0.14.4" 9 + env_logger = "0.11.11" 10 + hyprwire = "0.4.4" 11 + udev = "0.9.3" 12 + 13 + [build-dependencies] 14 + hyprwire-scanner = "0.4.4"
+9
build.rs
··· 1 + use std::io; 2 + 3 + fn main() -> io::Result<()> { 4 + hyprwire_scanner::configure() 5 + .with_targets(hyprwire_scanner::Targets::CLIENT) 6 + .compile(&["./protocols/session_core_v1.xml"])?; 7 + 8 + Ok(()) 9 + }
+2 -1
nix/shell.nix
··· 9 9 rust-analyzer-unwrapped 10 10 nixd 11 11 npins 12 - dinit 12 + pkg-config 13 + eudev 13 14 ; 14 15 }; 15 16
+426
protocols/session_core_v1.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <protocol name="session_core_v1" version="1"> 3 + <object name="session_core_manager" version="1"> 4 + <description summary="session observer"> 5 + Unprivileged read-only interface for observing active sessions. 6 + </description> 7 + <s2c name="session_added"> 8 + <description summary="a new session was created"> 9 + Broadcast to all connected clients when any session is created. Sent 10 + once for each already-active session when the manager is first created. 11 + </description> 12 + <arg name="session_id" type="uint" summary="new session identifier"/> 13 + </s2c> 14 + <s2c name="done"> 15 + <description summary="initial field dump complete"/> 16 + </s2c> 17 + <s2c name="error"> 18 + <description summary="last operation failed"/> 19 + <arg name="code" type="enum" interface="error_code" summary="error kind"/> 20 + <arg name="message" type="varchar" summary="human-readable error detail"/> 21 + </s2c> 22 + <c2s name="get_session"> 23 + <description summary="create a per-session info object"> 24 + Creates a `session_core_session` object for the given session_id. 25 + The daemon immediately pushes all fields, followed by done. 26 + If the session does not exist, destroyed is sent instead. 27 + </description> 28 + <arg name="session_id" type="uint" summary="session to query"/> 29 + <returns iface="session_core_session"/> 30 + </c2s> 31 + <c2s name="get_session_by_pid"> 32 + <description summary="create a per-session info object by leader PID"> 33 + Creates a session_core_session object for the session whose leader 34 + PID matches the given pid. The daemon immediately pushes all fields, 35 + followed by done. If no matching session exists, destroyed is sent instead. 36 + </description> 37 + <arg name="pid" type="uint" summary="leader PID of the session to query"/> 38 + <returns iface="session_core_session"/> 39 + </c2s> 40 + <c2s name="get_session_by_uid"> 41 + <description summary="create a per-session info object by user ID"> 42 + Creates a session_core_session object for the session whose user ID 43 + matches the given uid. The daemon immediately pushes all fields, 44 + followed by done. If no matching session exists, destroyed is sent instead. 45 + </description> 46 + <arg name="uid" type="uint" summary="user ID of the session to query"/> 47 + <returns iface="session_core_session"/> 48 + </c2s> 49 + <c2s name="get_user"> 50 + <description summary="create a per-user info object"> 51 + Creates a session_core_user object for the given uid. The daemon 52 + immediately pushes all fields, followed by done. If uid does not 53 + correspond to a known user, not_found is sent instead. 54 + </description> 55 + <arg name="uid" type="uint" summary="user ID to query"/> 56 + <returns iface="session_core_user"/> 57 + </c2s> 58 + <c2s name="get_seat"> 59 + <description summary="create a per-seat info object"> 60 + Creates a session_core_seat object for the seat with the given name. 61 + The daemon immediately pushes the seat fields, followed by done, and 62 + re-sends fields as they change. If no matching seat exists, destroyed 63 + is sent instead. 64 + </description> 65 + <arg name="seat" type="varchar" summary="seat name to query"/> 66 + <returns iface="session_core_seat"/> 67 + </c2s> 68 + <c2s name="reboot"> 69 + <description summary="reboot the system"/> 70 + </c2s> 71 + <c2s name="poweroff"> 72 + <description summary="power off the system"/> 73 + </c2s> 74 + <c2s name="suspend"> 75 + <description summary="suspend the system"/> 76 + </c2s> 77 + <c2s name="hibernate"> 78 + <description summary="hibernate the system"/> 79 + </c2s> 80 + <c2s name="destroy" destructor="true"> 81 + <description summary="destroy this object"/> 82 + </c2s> 83 + <s2c name="can_control_power"> 84 + <description summary="client may run power operations"> 85 + Non-zero if this client can reboot, power off, suspend, or hibernate 86 + without first closing other users' sessions. 87 + </description> 88 + <arg name="can_control_power" type="uint" summary="non-zero if power operations are currently allowed"/> 89 + </s2c> 90 + </object> 91 + <object name="session_core_session" version="1"> 92 + <description summary="per-session information"> 93 + Provides information about a single session. All fields are pushed 94 + immediately on creation and re-sent if they change. 95 + </description> 96 + <s2c name="session_id"> 97 + <arg name="session_id" type="uint" summary="session identifier"/> 98 + </s2c> 99 + <s2c name="uid"> 100 + <arg name="uid" type="uint" summary="user id"/> 101 + </s2c> 102 + <s2c name="username"> 103 + <arg name="username" type="varchar" summary="username"/> 104 + </s2c> 105 + <s2c name="vt"> 106 + <arg name="vt" type="uint" summary="virtual terminal number"/> 107 + </s2c> 108 + <s2c name="seat"> 109 + <arg name="seat" type="varchar" summary="seat name"/> 110 + </s2c> 111 + <s2c name="leader"> 112 + <arg name="leader" type="uint" summary="PID of the session-creating process"/> 113 + </s2c> 114 + <s2c name="timestamp"> 115 + <arg name="timestamp" type="uint" summary="session start time (seconds since Unix epoch)"/> 116 + </s2c> 117 + <s2c name="is_local"> 118 + <arg name="is_local" type="uint" summary="non-zero if the session originates from the local machine, zero if remote"/> 119 + </s2c> 120 + <s2c name="remote_host"> 121 + <arg name="remote_host" type="varchar" summary="remote host name, empty for local sessions"/> 122 + </s2c> 123 + <s2c name="active"> 124 + <description summary="session active state"/> 125 + <arg name="state" type="enum" interface="active_state" summary="session active state"/> 126 + </s2c> 127 + <s2c name="locked"> 128 + <description summary="session is locked"/> 129 + </s2c> 130 + <s2c name="unlocked"> 131 + <description summary="session is unlocked"/> 132 + </s2c> 133 + <s2c name="done"> 134 + <description summary="initial field dump complete"/> 135 + </s2c> 136 + <s2c name="destroyed"> 137 + <description summary="session has ended or did not exist"> 138 + Sent when the session is destroyed or if the `session_id` passed to 139 + `get_session` was not found. The client should release this object. 140 + </description> 141 + </s2c> 142 + <s2c name="ok"> 143 + <description summary="last operation completed successfully"/> 144 + </s2c> 145 + <s2c name="error"> 146 + <description summary="last operation failed"/> 147 + <arg name="code" type="enum" interface="error_code" summary="error kind"/> 148 + <arg name="message" type="varchar" summary="human-readable error detail"/> 149 + </s2c> 150 + <c2s name="lock"> 151 + <description summary="lock the session"/> 152 + </c2s> 153 + <c2s name="unlock"> 154 + <description summary="unlock the session"/> 155 + </c2s> 156 + <c2s name="terminate"> 157 + <description summary="send SIGTERM to all processes in the session"/> 158 + </c2s> 159 + <c2s name="kill"> 160 + <description summary="forcibly kill all processes in the session via cgroup.kill"/> 161 + </c2s> 162 + <c2s name="destroy" destructor="true"> 163 + <description summary="destroy this object"/> 164 + </c2s> 165 + <s2c name="can_modify"> 166 + <description summary="client may modify this session"> 167 + Non-zero if this client may lock, unlock, terminate, or kill this session. 168 + </description> 169 + <arg name="can_modify" type="uint" summary="non-zero if mutating requests are allowed"/> 170 + </s2c> 171 + </object> 172 + 173 + <object name="session_core_seat" version="1"> 174 + <description summary="per-seat information"> 175 + Provides information about a single seat. All fields are pushed 176 + immediately on creation and re-sent if they change. 177 + </description> 178 + <s2c name="seat"> 179 + <arg name="seat" type="varchar" summary="seat name"/> 180 + </s2c> 181 + <s2c name="mode"> 182 + <arg name="mode" type="enum" interface="seat_mode" summary="seat mode"/> 183 + </s2c> 184 + <s2c name="current_vt"> 185 + <arg name="vt" type="uint" summary="current virtual terminal, 0 if none or not VT-bound"/> 186 + </s2c> 187 + <s2c name="client_added"> 188 + <description summary="seat client added"> 189 + Sent once per client during the initial dump and whenever a new client 190 + joins the seat. Use get_client with this PID to retrieve 191 + the client's status object. 192 + </description> 193 + <arg name="pid" type="uint" summary="PID of the client that opened the seat"/> 194 + </s2c> 195 + <c2s name="get_client"> 196 + <description summary="create a per-seat-client info object"> 197 + Creates a session_core_seat_client object for the client with the given PID 198 + on this seat. The daemon immediately pushes the client fields, followed by 199 + done, and re-sends fields as they change. If no matching client exists, 200 + destroyed is sent instead. 201 + </description> 202 + <arg name="pid" type="uint" summary="PID of the client that opened the seat"/> 203 + <returns iface="session_core_seat_client"/> 204 + </c2s> 205 + <c2s name="terminate"> 206 + <description summary="send SIGTERM to all sessions on the seat"/> 207 + </c2s> 208 + <s2c name="done"> 209 + <description summary="initial field dump complete"/> 210 + </s2c> 211 + <s2c name="destroyed"> 212 + <description summary="seat has been removed or did not exist"> 213 + Sent when the seat is destroyed or if the seat name passed to get_seat 214 + was not found. The client should release this object. 215 + </description> 216 + </s2c> 217 + <s2c name="ok"> 218 + <description summary="last operation completed successfully"/> 219 + </s2c> 220 + <s2c name="error"> 221 + <description summary="last operation failed"/> 222 + <arg name="code" type="enum" interface="error_code" summary="error kind"/> 223 + <arg name="message" type="varchar" summary="human-readable error detail"/> 224 + </s2c> 225 + <c2s name="destroy" destructor="true"> 226 + <description summary="destroy this object"/> 227 + </c2s> 228 + <s2c name="can_modify"> 229 + <description summary="client may modify this seat"> 230 + Non-zero if this client may terminate all sessions on this seat. 231 + </description> 232 + <arg name="can_modify" type="uint" summary="non-zero if mutating requests are allowed"/> 233 + </s2c> 234 + </object> 235 + 236 + <object name="session_core_seat_client" version="1"> 237 + <description summary="per-seat-client information"> 238 + Provides information about a single client attached to a seat. All fields 239 + are pushed immediately on creation and re-sent if they change. 240 + </description> 241 + <s2c name="session"> 242 + <arg name="session" type="uint" summary="seat client session identifier"/> 243 + </s2c> 244 + <s2c name="state"> 245 + <arg name="state" type="enum" interface="seat_client_state" summary="seat client state"/> 246 + </s2c> 247 + <s2c name="active"> 248 + <arg name="active" type="uint" summary="non-zero if this is the active seat client"/> 249 + </s2c> 250 + <s2c name="next"> 251 + <arg name="next" type="uint" summary="non-zero if this client is queued to become active"/> 252 + </s2c> 253 + <s2c name="pid"> 254 + <arg name="pid" type="uint" summary="PID of the client that opened the seat"/> 255 + </s2c> 256 + <s2c name="uid"> 257 + <arg name="uid" type="uint" summary="UID of the client that opened the seat"/> 258 + </s2c> 259 + <s2c name="gid"> 260 + <arg name="gid" type="uint" summary="GID of the client that opened the seat"/> 261 + </s2c> 262 + <s2c name="device_added"> 263 + <description summary="seat client device added"> 264 + Sent once per device during the initial dump and whenever a new device is 265 + assigned to this client. Use get_device with this device_id to retrieve 266 + the device status object. 267 + </description> 268 + <arg name="device_id" type="uint" summary="device id scoped to the seat client"/> 269 + </s2c> 270 + <s2c name="device_removed"> 271 + <description summary="seat client device removed"/> 272 + <arg name="device_id" type="uint" summary="device id scoped to the seat client"/> 273 + </s2c> 274 + <s2c name="done"> 275 + <description summary="initial field dump complete"/> 276 + </s2c> 277 + <s2c name="destroyed"> 278 + <description summary="seat client has been removed or did not exist"> 279 + Sent when the client is removed or if the PID passed to get_client 280 + was not found. The client should release this object. 281 + </description> 282 + </s2c> 283 + <c2s name="get_device"> 284 + <description summary="create a per-seat-device info object"> 285 + Creates a session_core_seat_device object for the device with the given 286 + id on this seat client. The daemon immediately pushes the device fields, 287 + followed by done, and re-sends fields as they change. If no matching 288 + device exists, destroyed is sent instead. 289 + </description> 290 + <arg name="device_id" type="uint" summary="device id scoped to the seat client"/> 291 + <returns iface="session_core_seat_device"/> 292 + </c2s> 293 + <c2s name="destroy" destructor="true"> 294 + <description summary="destroy this object"/> 295 + </c2s> 296 + </object> 297 + 298 + <object name="session_core_seat_device" version="1"> 299 + <description summary="per-seat-device information"> 300 + Provides information about a single device assigned to a seat client. All 301 + fields are pushed immediately on creation and re-sent if they change. 302 + </description> 303 + <s2c name="device_id"> 304 + <arg name="device_id" type="uint" summary="device id scoped to the seat client"/> 305 + </s2c> 306 + <s2c name="path"> 307 + <arg name="path" type="varchar" summary="device path"/> 308 + </s2c> 309 + <s2c name="kind"> 310 + <arg name="kind" type="enum" interface="seat_device_kind" summary="device kind"/> 311 + </s2c> 312 + <s2c name="active"> 313 + <arg name="active" type="uint" summary="non-zero if this device is currently active"/> 314 + </s2c> 315 + <s2c name="done"> 316 + <description summary="initial field dump complete"/> 317 + </s2c> 318 + <s2c name="destroyed"> 319 + <description summary="seat device has been removed or did not exist"> 320 + Sent when the device is removed or if the device_id passed to get_device 321 + was not found. The client should release this object. 322 + </description> 323 + </s2c> 324 + <c2s name="destroy" destructor="true"> 325 + <description summary="destroy this object"/> 326 + </c2s> 327 + </object> 328 + 329 + <object name="session_core_user" version="1"> 330 + <description summary="per-user information"> 331 + Provides information about a single user, identified by uid. 332 + All fields are pushed immediately on creation, followed by done. 333 + </description> 334 + <s2c name="uid"> 335 + <arg name="uid" type="uint" summary="user id"/> 336 + </s2c> 337 + <s2c name="username"> 338 + <arg name="username" type="varchar" summary="username"/> 339 + </s2c> 340 + <s2c name="lingering"> 341 + <arg name="lingering" type="uint" summary="non-zero if the user has lingering enabled"/> 342 + </s2c> 343 + <s2c name="state"> 344 + <description summary="aggregate user state"> 345 + Reflects whether the user currently has sessions and whether any of 346 + them is in the foreground, combined with the lingering flag. 347 + Re-sent whenever it changes. 348 + </description> 349 + <arg name="state" type="enum" interface="user_state" summary="user state"/> 350 + </s2c> 351 + <s2c name="done"> 352 + <description summary="initial field dump complete"/> 353 + </s2c> 354 + <s2c name="not_found"> 355 + <description summary="no such user"> 356 + Sent when the uid passed to get_user does not correspond to a known 357 + user. The client should release this object. 358 + </description> 359 + </s2c> 360 + <s2c name="ok"> 361 + <description summary="last operation completed successfully"/> 362 + </s2c> 363 + <s2c name="error"> 364 + <description summary="last operation failed"/> 365 + <arg name="code" type="enum" interface="error_code" summary="error kind"/> 366 + <arg name="message" type="varchar" summary="human-readable error detail"/> 367 + </s2c> 368 + <c2s name="terminate"> 369 + <description summary="terminate the user"/> 370 + </c2s> 371 + <c2s name="kill"> 372 + <description summary="kill the user"/> 373 + </c2s> 374 + <c2s name="destroy" destructor="true"> 375 + <description summary="destroy this object"/> 376 + </c2s> 377 + <s2c name="can_modify"> 378 + <description summary="client may modify this user"> 379 + Non-zero if this client may terminate or kill this user's sessions. 380 + </description> 381 + <arg name="can_modify" type="uint" summary="non-zero if mutating requests are allowed"/> 382 + </s2c> 383 + </object> 384 + 385 + <enum name="user_state"> 386 + <value idx="0" name="offline" summary="no sessions and lingering disabled"/> 387 + <value idx="1" name="lingering" summary="no sessions but lingering enabled"/> 388 + <value idx="2" name="online" summary="has a session, none in the foreground"/> 389 + <value idx="3" name="active" summary="has a session in the foreground"/> 390 + <value idx="4" name="closing" summary="has sessions, all of them closing"/> 391 + </enum> 392 + 393 + <enum name="active_state"> 394 + <value idx="0" name="online" summary="session is logged in but not in the foreground"/> 395 + <value idx="1" name="active" summary="session is in the foreground"/> 396 + <value idx="2" name="closing" summary="session is being destroyed"/> 397 + <value idx="3" name="opening" summary="session is being created"/> 398 + </enum> 399 + 400 + <enum name="seat_mode"> 401 + <value idx="0" name="vt_bound" summary="seat follows the active virtual terminal"/> 402 + <value idx="1" name="non_vt_bound" summary="seat is not bound to virtual terminals"/> 403 + </enum> 404 + 405 + <enum name="seat_client_state"> 406 + <value idx="0" name="new" summary="client is not yet enabled"/> 407 + <value idx="1" name="enabled" summary="client may use seat devices"/> 408 + <value idx="2" name="pending_disabled" summary="client must acknowledge disabled state"/> 409 + <value idx="3" name="disabled" summary="client is inactive"/> 410 + </enum> 411 + 412 + <enum name="seat_device_kind"> 413 + <value idx="0" name="drm" summary="DRM device"/> 414 + <value idx="1" name="evdev" summary="evdev input device"/> 415 + <value idx="2" name="hidraw" summary="hidraw device"/> 416 + <value idx="3" name="wscons" summary="wscons device"/> 417 + <value idx="4" name="unknown" summary="unknown or unsupported device kind"/> 418 + </enum> 419 + 420 + <enum name="error_code"> 421 + <value idx="0" name="not_found" summary="session or cgroup not found"/> 422 + <value idx="1" name="permission_denied" summary="insufficient permissions to signal processes"/> 423 + <value idx="2" name="io" summary="generic I/O error"/> 424 + <value idx="3" name="active_sessions" summary="other sessions are active"/> 425 + </enum> 426 + </protocol>
+130 -2
src/main.rs
··· 1 - fn main() { 2 - println!("Hello, world!"); 1 + mod session_core_v1 { 2 + hyprwire::include_protocol!("session_core_v1"); 3 + pub use client::*; 4 + } 5 + 6 + use calloop::generic; 7 + use hyprwire::client; 8 + use session_core_v1::{session_core_manager, session_core_session}; 9 + use std::os::fd::AsRawFd; 10 + 11 + impl hyprwire::Dispatch<session_core_manager::SessionCoreManager> for SessiondUaccess { 12 + fn event( 13 + &mut self, 14 + object: &session_core_manager::SessionCoreManager, 15 + event: <session_core_manager::SessionCoreManager as hyprwire::Object>::Event<'_>, 16 + ) { 17 + if let session_core_manager::Event::SessionAdded { session_id } = event 18 + && let Some(session) = object.send_get_session::<Self>(session_id) 19 + { 20 + self.sessions.push(Session { object: session }); 21 + } 22 + } 23 + } 24 + 25 + impl hyprwire::Dispatch<session_core_session::SessionCoreSession> for SessiondUaccess { 26 + fn event( 27 + &mut self, 28 + object: &session_core_session::SessionCoreSession, 29 + event: <session_core_session::SessionCoreSession as hyprwire::Object>::Event<'_>, 30 + ) { 31 + match event { 32 + session_core_session::Event::SessionId { session_id } => {} 33 + session_core_session::Event::Uid { uid } => {} 34 + session_core_session::Event::Username { username } => {} 35 + session_core_session::Event::Vt { vt } => {} 36 + session_core_session::Event::Seat { seat } => {} 37 + session_core_session::Event::Leader { leader } => {} 38 + session_core_session::Event::Timestamp { timestamp } => {} 39 + session_core_session::Event::IsLocal { is_local } => {} 40 + session_core_session::Event::RemoteHost { remote_host } => {} 41 + session_core_session::Event::Active { state } => {} 42 + session_core_session::Event::Locked => {} 43 + session_core_session::Event::Unlocked => {} 44 + session_core_session::Event::Done => {} 45 + session_core_session::Event::Destroyed => {} 46 + session_core_session::Event::Ok => {} 47 + session_core_session::Event::Error { code, message } => {} 48 + session_core_session::Event::CanModify { can_modify } => {} 49 + } 50 + } 51 + } 52 + 53 + struct SessiondUaccess { 54 + sessions: Vec<Session>, 55 + } 56 + 57 + struct Session { 58 + object: session_core_session::SessionCoreSession, 59 + } 60 + 61 + fn main() -> anyhow::Result<()> { 62 + env_logger::Builder::from_env(env_logger::Env::default().filter_or("LOG_LEVEL", "info")).init(); 63 + 64 + let mut sessiond_uaccess = SessiondUaccess { 65 + sessions: Vec::new(), 66 + }; 67 + 68 + let mut event_loop = calloop::EventLoop::try_new()?; 69 + 70 + let mut socket = client::Client::connect("/run/sessiond.sock")?; 71 + let eq = socket.new_event_queue(); 72 + 73 + socket.add_implementation::<session_core_v1::SessionCoreV1Impl>(); 74 + 75 + eq.wait_for_handshake(&mut sessiond_uaccess)?; 76 + 77 + let session_core_manager = socket.bind::<session_core_manager::SessionCoreManager, _>( 78 + &eq, 79 + &mut sessiond_uaccess, 80 + 1, 81 + )?; 82 + 83 + eq.roundtrip(&mut sessiond_uaccess)?; 84 + 85 + let fd_wrapper = unsafe { generic::FdWrapper::new(socket.extract_loop_fd().as_raw_fd()) }; 86 + let source = generic::Generic::new( 87 + fd_wrapper, 88 + calloop::Interest { 89 + readable: true, 90 + writable: false, 91 + }, 92 + calloop::Mode::Level, 93 + ); 94 + event_loop 95 + .handle() 96 + .insert_source(source, move |_, _, state| { 97 + _ = eq.dispatch_events(state, false); 98 + Ok(calloop::PostAction::Continue) 99 + })?; 100 + 101 + let monitor = udev::MonitorBuilder::new_kernel()?.listen()?; 102 + 103 + event_loop 104 + .handle() 105 + .insert_source( 106 + generic::Generic::new(monitor, calloop::Interest::READ, calloop::Mode::Level), 107 + |_, monitor, _| { 108 + for event in monitor.iter() { 109 + match event.event_type() { 110 + udev::EventType::Add => { 111 + println!("added: {:?}", event.devnode()); 112 + } 113 + udev::EventType::Remove => { 114 + println!("removed: {:?}", event.devnode()); 115 + } 116 + udev::EventType::Change => { 117 + println!("changed: {:?}", event.devnode()); 118 + } 119 + _ => {} 120 + } 121 + } 122 + 123 + Ok(calloop::PostAction::Continue) 124 + }, 125 + ) 126 + .map_err(|e| anyhow::anyhow!("{e}"))?; 127 + 128 + event_loop.run(None, &mut sessiond_uaccess, move |_| {})?; 129 + 130 + Ok(()) 3 131 }