sketch for key code transfer

This commit is contained in:
Mona Mayrhofer 2026-03-02 22:06:15 +01:00
parent 966fdbbd50
commit a2b086a779
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: 374AB152BDEBA1AE
23 changed files with 2231 additions and 229 deletions

View file

@ -0,0 +1 @@
/nix/store/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source

View file

@ -0,0 +1 @@
/nix/store/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source

View file

@ -1 +0,0 @@
/nix/store/anbs72p9zzvyk3a227k0zmas73l56gxl-source

View file

@ -1 +0,0 @@
/nix/store/bv5inqjinipycnjqqq0iabp6xi8hjb09-source

View file

@ -0,0 +1 @@
/nix/store/fxlr459mkipn4j7ff86h7z21zyiwxs62-source

View file

@ -1 +0,0 @@
/nix/store/j1r5yym7jdsgyb40ykfwwrd7wyf2z2k7-source

View file

@ -1 +0,0 @@
/nix/store/j5qcw5x2dm0jlffwwymp6yav62l3pdqm-source

View file

@ -0,0 +1 @@
/nix/store/jh41lavwqi3qdwypiv713yipf3dxi3nx-source

View file

@ -0,0 +1 @@
/nix/store/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source

View file

@ -1 +0,0 @@
/nix/store/w0x3nihmdb6cwdqh0i0h4fs95alvv770-source

View file

@ -1 +1 @@
/nix/store/05p6k4yj5qk1qapc1xi02mwfgkhi1dfw-my-project-env /nix/store/mq0i12vdknm9wx5w5n7md59xn1z15ag3-my-project-env

View file

@ -18,7 +18,7 @@ DEVENV_DOTFILE='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv'
export DEVENV_DOTFILE export DEVENV_DOTFILE
DEVENV_FLAKE_SHELL='default' DEVENV_FLAKE_SHELL='default'
export DEVENV_FLAKE_SHELL export DEVENV_FLAKE_SHELL
DEVENV_PROFILE='/nix/store/pdpsbmrx88izi8zb6zl4z9rpy2y713bq-devenv-profile' DEVENV_PROFILE='/nix/store/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile'
export DEVENV_PROFILE export DEVENV_PROFILE
DEVENV_ROOT='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app' DEVENV_ROOT='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app'
export DEVENV_ROOT export DEVENV_ROOT
@ -26,12 +26,12 @@ DEVENV_RUNTIME='/tmp/devenv-b51d30d'
export DEVENV_RUNTIME export DEVENV_RUNTIME
DEVENV_STATE='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv/state' DEVENV_STATE='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv/state'
export DEVENV_STATE export DEVENV_STATE
DEVENV_TASKS='[{"after":[],"before":[],"command":"/nix/store/i4ywp92ry1w8d1ql1k83dmrsyxvyfdm6-devenv-enterShell","cwd":null,"description":"Runs when entering the shell","env":{},"exec_if_modified":[],"input":{},"name":"devenv:enterShell","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"},{"after":["devenv:enterShell"],"before":[],"command":null,"cwd":null,"description":"Runs when entering the test environment","env":{},"exec_if_modified":[],"input":{},"name":"devenv:enterTest","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"},{"after":[],"before":[],"command":null,"cwd":null,"description":"","env":{},"exec_if_modified":[],"input":{},"name":"devenv:files","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"},{"after":[],"before":["devenv:files","devenv:enterShell"],"command":"/nix/store/8bwf8iw1bffd1k762alc7kjkivjq1f9m-devenv-files-cleanup","cwd":null,"description":"Cleanup orphaned files","env":{},"exec_if_modified":[],"input":{},"name":"devenv:files:cleanup","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"}]' DEVENV_TASKS='[{"after":[],"before":[],"command":"/nix/store/k1ypf97i4pvsgpc5adjc8w0zwnlqvzwd-devenv-container-copy","cwd":null,"description":"","env":{},"exec_if_modified":[],"input":{},"name":"devenv:container:copy","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"start":{"enable":true},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":true,"status":null,"type":"oneshot"},{"after":[],"before":[],"command":"/nix/store/i4ywp92ry1w8d1ql1k83dmrsyxvyfdm6-devenv-enterShell","cwd":null,"description":"Runs when entering the shell","env":{},"exec_if_modified":[],"input":{},"name":"devenv:enterShell","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"start":{"enable":true},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"},{"after":["devenv:enterShell"],"before":[],"command":null,"cwd":null,"description":"Runs when entering the test environment","env":{},"exec_if_modified":[],"input":{},"name":"devenv:enterTest","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"start":{"enable":true},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"},{"after":[],"before":[],"command":null,"cwd":null,"description":"","env":{},"exec_if_modified":[],"input":{},"name":"devenv:files","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"start":{"enable":true},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"},{"after":[],"before":["devenv:files","devenv:enterShell"],"command":"/nix/store/8bwf8iw1bffd1k762alc7kjkivjq1f9m-devenv-files-cleanup","cwd":null,"description":"Cleanup orphaned files","env":{},"exec_if_modified":[],"input":{},"name":"devenv:files:cleanup","process":{"listen":[],"ports":{},"ready":null,"restart":{"max":5,"on":"on_failure","window":null},"start":{"enable":true},"watch":{"extensions":[],"ignore":[],"paths":[]},"watchdog":null},"show_output":false,"status":null,"type":"oneshot"}]'
export DEVENV_TASKS export DEVENV_TASKS
DEVENV_TASK_FILE='/nix/store/xziksgq8wrc27h4a4vpa723s4jgiq1l1-tasks.json' DEVENV_TASK_FILE='/nix/store/r04g3f96h64qk8xzpm7z0vd17w5b494d-tasks.json'
export DEVENV_TASK_FILE export DEVENV_TASK_FILE
HOSTTYPE='x86_64' HOSTTYPE='x86_64'
HOST_PATH='/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin:/nix/store/16wfacfgap3chf7mcjnd8dwi85dj4qqi-findutils-4.10.0/bin:/nix/store/3p87h6dn5i87i3iq9364imzbqgwvkg2p-diffutils-3.12/bin:/nix/store/ryz8kcrm2bxpccllfqlb7qldsfnqp5c2-gnused-4.9/bin:/nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin:/nix/store/2xq9rayckw8zq26k274xxlikn77jn60j-gawk-5.3.2/bin:/nix/store/qyg62bc2xnpwz0fa9prqxvvk00zj4g9q-gnutar-1.35/bin:/nix/store/84yyzmxs7mb8nhkvcfv9n1l9irpb6mnq-gzip-1.14/bin:/nix/store/90yw24gqmwph4xjp4mqhpx1y1gcrvqla-bzip2-1.0.8-bin/bin:/nix/store/vbah5c4rzy1q1hbqhginyxjhj8d4dj8j-gnumake-4.4.1/bin:/nix/store/f15k3dpilmiyv6zgpib289rnjykgr1r4-bash-5.3p9/bin:/nix/store/wwij6563c6wbg4kzgjhng7vlhf7api19-patch-2.8/bin:/nix/store/zys6d102zp171wpwcs08g632886w2qxs-xz-5.8.2-bin/bin:/nix/store/nyy0bvgjwd98x7ih8pl6pr79qjljgsf7-file-5.45/bin' HOST_PATH='/nix/store/idl8schy78hxa05jyndj4nmb4wzgcln2-compiler-rt-libc-21.1.8/bin:/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin:/nix/store/16wfacfgap3chf7mcjnd8dwi85dj4qqi-findutils-4.10.0/bin:/nix/store/3p87h6dn5i87i3iq9364imzbqgwvkg2p-diffutils-3.12/bin:/nix/store/ryz8kcrm2bxpccllfqlb7qldsfnqp5c2-gnused-4.9/bin:/nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin:/nix/store/2xq9rayckw8zq26k274xxlikn77jn60j-gawk-5.3.2/bin:/nix/store/qyg62bc2xnpwz0fa9prqxvvk00zj4g9q-gnutar-1.35/bin:/nix/store/84yyzmxs7mb8nhkvcfv9n1l9irpb6mnq-gzip-1.14/bin:/nix/store/90yw24gqmwph4xjp4mqhpx1y1gcrvqla-bzip2-1.0.8-bin/bin:/nix/store/vbah5c4rzy1q1hbqhginyxjhj8d4dj8j-gnumake-4.4.1/bin:/nix/store/f15k3dpilmiyv6zgpib289rnjykgr1r4-bash-5.3p9/bin:/nix/store/wwij6563c6wbg4kzgjhng7vlhf7api19-patch-2.8/bin:/nix/store/zys6d102zp171wpwcs08g632886w2qxs-xz-5.8.2-bin/bin:/nix/store/nyy0bvgjwd98x7ih8pl6pr79qjljgsf7-file-5.45/bin'
export HOST_PATH export HOST_PATH
IFS=' IFS='
' '
@ -39,6 +39,8 @@ IN_NIX_SHELL='impure'
export IN_NIX_SHELL export IN_NIX_SHELL
LD='ld' LD='ld'
export LD export LD
LIBCLANG_PATH='/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib/lib'
export LIBCLANG_PATH
LINENO='79' LINENO='79'
MACHTYPE='x86_64-pc-linux-gnu' MACHTYPE='x86_64-pc-linux-gnu'
NIX_BINTOOLS='/nix/store/i6ppbrlpp6yki8qvka7nyv091xa8dchx-binutils-wrapper-2.44' NIX_BINTOOLS='/nix/store/i6ppbrlpp6yki8qvka7nyv091xa8dchx-binutils-wrapper-2.44'
@ -51,13 +53,13 @@ NIX_CC='/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0'
export NIX_CC export NIX_CC
NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1' NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1'
export NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu export NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu
NIX_CFLAGS_COMPILE=' -frandom-seed=05p6k4yj5q -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include' NIX_CFLAGS_COMPILE=' -frandom-seed=mq0i12vdkn -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/include -isystem /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/include -isystem /nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev/include -isystem /nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev/include -isystem /nix/store/i5vppnbl2qnrvm4h5azwq83rr9gm7sdy-compiler-rt-libc-21.1.8-dev/include -isystem /nix/store/i5vppnbl2qnrvm4h5azwq83rr9gm7sdy-compiler-rt-libc-21.1.8-dev/include -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/include -isystem /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/include -isystem /nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev/include -isystem /nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev/include -isystem /nix/store/i5vppnbl2qnrvm4h5azwq83rr9gm7sdy-compiler-rt-libc-21.1.8-dev/include -isystem /nix/store/i5vppnbl2qnrvm4h5azwq83rr9gm7sdy-compiler-rt-libc-21.1.8-dev/include'
export NIX_CFLAGS_COMPILE export NIX_CFLAGS_COMPILE
NIX_ENFORCE_NO_NATIVE='1' NIX_ENFORCE_NO_NATIVE='1'
export NIX_ENFORCE_NO_NATIVE export NIX_ENFORCE_NO_NATIVE
NIX_HARDENING_ENABLE='bindnow format fortify fortify3 libcxxhardeningextensive libcxxhardeningfast pic relro stackclashprotection stackprotector strictoverflow zerocallusedregs' NIX_HARDENING_ENABLE='bindnow format fortify fortify3 libcxxhardeningextensive libcxxhardeningfast pic relro stackclashprotection stackprotector strictoverflow zerocallusedregs'
export NIX_HARDENING_ENABLE export NIX_HARDENING_ENABLE
NIX_LDFLAGS='-rpath /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/ngqmd36qxwr8d75h3bnssapbgrkwx7db-rust-mixed/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/ngqmd36qxwr8d75h3bnssapbgrkwx7db-rust-mixed/lib' NIX_LDFLAGS='-rpath /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/lib -L/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/lib -L/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/lib -L/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/lib -L/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib/lib -L/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/lib -L/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/lib -L/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/lib -L/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/lib -L/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib/lib -L/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib/lib'
export NIX_LDFLAGS export NIX_LDFLAGS
NIX_NO_SELF_RPATH='1' NIX_NO_SELF_RPATH='1'
NIX_PKG_CONFIG_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1' NIX_PKG_CONFIG_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1'
@ -74,14 +76,16 @@ OLDPWD=''
export OLDPWD export OLDPWD
OPTERR='1' OPTERR='1'
OSTYPE='linux-gnu' OSTYPE='linux-gnu'
PATH='/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0/bin:/nix/store/f53d7gw5jh2yc1rv62kp670gnqq3vwwz-checkall/bin:/nix/store/py79xv22ipf2ycg4qks55wwai9g4w2qg-dioxus-cli-0.7.3/bin:/nix/store/9dpg06rzbppmxi5q8rms8zyybz56sa6r-cargo-expand-1.0.119/bin:/nix/store/fl02yv3ax1qf1xkq64ik8qz5bjxyyd71-cargo-deny-0.19.0/bin:/nix/store/hadf76x1xknx2w6ydp05gzl2w3j40hqy-cargo-nextest-0.9.124/bin:/nix/store/s4rgqv7brrcq2jm8m00dyair22knq10s-typos-1.42.3/bin:/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/bin:/nix/store/ngqmd36qxwr8d75h3bnssapbgrkwx7db-rust-mixed/bin:/nix/store/6r3frw6cahjafghfv58vj6a4v1g2zxad-rust-analyzer-nightly-17304e9c7e11d26139672d3d77aa498b1cae0d69/bin:/nix/store/8njkmn9yfcka8yid251wk109n7a6sz1y-wasm-bindgen-cli-0.2.114/bin:/nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2/bin:/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2/bin:/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0/bin:/nix/store/mjf8jlq9grydcdvyw6hb063x5c34g5gf-gcc-15.2.0/bin:/nix/store/0bdqq2z98kg2hfn3k60if6pb5fd5p10h-glibc-2.42-47-bin/bin:/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin:/nix/store/i6ppbrlpp6yki8qvka7nyv091xa8dchx-binutils-wrapper-2.44/bin:/nix/store/47mn80zqpygykqailwzw8zlag4cgl75q-binutils-2.44/bin:/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin:/nix/store/16wfacfgap3chf7mcjnd8dwi85dj4qqi-findutils-4.10.0/bin:/nix/store/3p87h6dn5i87i3iq9364imzbqgwvkg2p-diffutils-3.12/bin:/nix/store/ryz8kcrm2bxpccllfqlb7qldsfnqp5c2-gnused-4.9/bin:/nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin:/nix/store/2xq9rayckw8zq26k274xxlikn77jn60j-gawk-5.3.2/bin:/nix/store/qyg62bc2xnpwz0fa9prqxvvk00zj4g9q-gnutar-1.35/bin:/nix/store/84yyzmxs7mb8nhkvcfv9n1l9irpb6mnq-gzip-1.14/bin:/nix/store/90yw24gqmwph4xjp4mqhpx1y1gcrvqla-bzip2-1.0.8-bin/bin:/nix/store/vbah5c4rzy1q1hbqhginyxjhj8d4dj8j-gnumake-4.4.1/bin:/nix/store/f15k3dpilmiyv6zgpib289rnjykgr1r4-bash-5.3p9/bin:/nix/store/wwij6563c6wbg4kzgjhng7vlhf7api19-patch-2.8/bin:/nix/store/zys6d102zp171wpwcs08g632886w2qxs-xz-5.8.2-bin/bin:/nix/store/nyy0bvgjwd98x7ih8pl6pr79qjljgsf7-file-5.45/bin' PATH='/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0/bin:/nix/store/f53d7gw5jh2yc1rv62kp670gnqq3vwwz-checkall/bin:/nix/store/py79xv22ipf2ycg4qks55wwai9g4w2qg-dioxus-cli-0.7.3/bin:/nix/store/9dpg06rzbppmxi5q8rms8zyybz56sa6r-cargo-expand-1.0.119/bin:/nix/store/fl02yv3ax1qf1xkq64ik8qz5bjxyyd71-cargo-deny-0.19.0/bin:/nix/store/hadf76x1xknx2w6ydp05gzl2w3j40hqy-cargo-nextest-0.9.124/bin:/nix/store/s4rgqv7brrcq2jm8m00dyair22knq10s-typos-1.42.3/bin:/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/bin:/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/bin:/nix/store/m05d7wi0zxg35937jbp6rp7zsvbb5qv4-rust-analyzer-nightly-a96b6a9b887008bae01839543f9ca8e1f67f4ebe/bin:/nix/store/8njkmn9yfcka8yid251wk109n7a6sz1y-wasm-bindgen-cli-0.2.114/bin:/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/bin:/nix/store/6n5r46icm0bl55s9p5z2zgcv93m39r5l-clang-wrapper-21.1.8/bin:/nix/store/rm8isfm4fd14is3fv3h4m459rbiy91bx-clang-21.1.8/bin:/nix/store/0bdqq2z98kg2hfn3k60if6pb5fd5p10h-glibc-2.42-47-bin/bin:/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin:/nix/store/m0rbbdfsbkdqpr6bs621jwi21ra1br4g-binutils-wrapper-2.44/bin:/nix/store/47mn80zqpygykqailwzw8zlag4cgl75q-binutils-2.44/bin:/nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev/bin:/nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2/bin:/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2/bin:/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0/bin:/nix/store/mjf8jlq9grydcdvyw6hb063x5c34g5gf-gcc-15.2.0/bin:/nix/store/i6ppbrlpp6yki8qvka7nyv091xa8dchx-binutils-wrapper-2.44/bin:/nix/store/idl8schy78hxa05jyndj4nmb4wzgcln2-compiler-rt-libc-21.1.8/bin:/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin:/nix/store/16wfacfgap3chf7mcjnd8dwi85dj4qqi-findutils-4.10.0/bin:/nix/store/3p87h6dn5i87i3iq9364imzbqgwvkg2p-diffutils-3.12/bin:/nix/store/ryz8kcrm2bxpccllfqlb7qldsfnqp5c2-gnused-4.9/bin:/nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin:/nix/store/2xq9rayckw8zq26k274xxlikn77jn60j-gawk-5.3.2/bin:/nix/store/qyg62bc2xnpwz0fa9prqxvvk00zj4g9q-gnutar-1.35/bin:/nix/store/84yyzmxs7mb8nhkvcfv9n1l9irpb6mnq-gzip-1.14/bin:/nix/store/90yw24gqmwph4xjp4mqhpx1y1gcrvqla-bzip2-1.0.8-bin/bin:/nix/store/vbah5c4rzy1q1hbqhginyxjhj8d4dj8j-gnumake-4.4.1/bin:/nix/store/f15k3dpilmiyv6zgpib289rnjykgr1r4-bash-5.3p9/bin:/nix/store/wwij6563c6wbg4kzgjhng7vlhf7api19-patch-2.8/bin:/nix/store/zys6d102zp171wpwcs08g632886w2qxs-xz-5.8.2-bin/bin:/nix/store/nyy0bvgjwd98x7ih8pl6pr79qjljgsf7-file-5.45/bin'
export PATH export PATH
PC_CONFIG_FILES='/nix/store/81xv1l07mgr9bi2ng7xqdjnwi5z9h8f8-process-compose.yaml' PC_CONFIG_FILES='/nix/store/f90qf91rzv18zpk3y4yf5saigawqw9nm-process-compose.yaml'
export PC_CONFIG_FILES export PC_CONFIG_FILES
PC_SOCKET_PATH='/tmp/devenv-b51d30d/pc.sock' PC_SOCKET_PATH='/tmp/devenv-b51d30d/pc.sock'
export PC_SOCKET_PATH export PC_SOCKET_PATH
PKG_CONFIG='pkg-config' PKG_CONFIG='pkg-config'
export PKG_CONFIG export PKG_CONFIG
PKG_CONFIG_PATH='/nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/lib/pkgconfig'
export PKG_CONFIG_PATH
PS4='+ ' PS4='+ '
RANLIB='ranlib' RANLIB='ranlib'
export RANLIB export RANLIB
@ -97,7 +101,7 @@ STRINGS='strings'
export STRINGS export STRINGS
STRIP='strip' STRIP='strip'
export STRIP export STRIP
XDG_DATA_DIRS='/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0/share:/nix/store/ngqmd36qxwr8d75h3bnssapbgrkwx7db-rust-mixed/share:/nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2/share:/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2/share' XDG_DATA_DIRS='/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0/share:/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/share:/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/share:/nix/store/rm8isfm4fd14is3fv3h4m459rbiy91bx-clang-21.1.8/share:/nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2/share:/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2/share'
export XDG_DATA_DIRS export XDG_DATA_DIRS
__structuredAttrs='' __structuredAttrs=''
export __structuredAttrs export __structuredAttrs
@ -147,8 +151,8 @@ export dontAddDisableDepTrack
declare -a envBuildBuildHooks=() declare -a envBuildBuildHooks=()
declare -a envBuildHostHooks=() declare -a envBuildHostHooks=()
declare -a envBuildTargetHooks=() declare -a envBuildTargetHooks=()
declare -a envHostHostHooks=('pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' ) declare -a envHostHostHooks=('ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' 'pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' )
declare -a envHostTargetHooks=('pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' ) declare -a envHostTargetHooks=('ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' 'pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' )
declare -a envTargetTargetHooks=() declare -a envTargetTargetHooks=()
declare -a fixupOutputHooks=('if [ -z "${dontPatchELF-}" ]; then patchELF "$prefix"; fi' 'if [[ -z "${noAuditTmpdir-}" && -e "$prefix" ]]; then auditTmpdir "$prefix"; fi' 'if [ -z "${dontGzipMan-}" ]; then compressManPages "$prefix"; fi' '_moveLib64' '_moveSbin' '_moveSystemdUserUnits' 'patchShebangsAuto' '_pruneLibtoolFiles' '_doStrip' ) declare -a fixupOutputHooks=('if [ -z "${dontPatchELF-}" ]; then patchELF "$prefix"; fi' 'if [[ -z "${noAuditTmpdir-}" && -e "$prefix" ]]; then auditTmpdir "$prefix"; fi' 'if [ -z "${dontGzipMan-}" ]; then compressManPages "$prefix"; fi' '_moveLib64' '_moveSbin' '_moveSystemdUserUnits' 'patchShebangsAuto' '_pruneLibtoolFiles' '_doStrip' )
hardeningDisable='' hardeningDisable=''
@ -158,7 +162,7 @@ mesonFlags=''
export mesonFlags export mesonFlags
name='my-project-env' name='my-project-env'
export name export name
nativeBuildInputs='/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0 /nix/store/f53d7gw5jh2yc1rv62kp670gnqq3vwwz-checkall /nix/store/py79xv22ipf2ycg4qks55wwai9g4w2qg-dioxus-cli-0.7.3 /nix/store/9dpg06rzbppmxi5q8rms8zyybz56sa6r-cargo-expand-1.0.119 /nix/store/fl02yv3ax1qf1xkq64ik8qz5bjxyyd71-cargo-deny-0.19.0 /nix/store/hadf76x1xknx2w6ydp05gzl2w3j40hqy-cargo-nextest-0.9.124 /nix/store/s4rgqv7brrcq2jm8m00dyair22knq10s-typos-1.42.3 /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125 /nix/store/ngqmd36qxwr8d75h3bnssapbgrkwx7db-rust-mixed /nix/store/6r3frw6cahjafghfv58vj6a4v1g2zxad-rust-analyzer-nightly-17304e9c7e11d26139672d3d77aa498b1cae0d69 /nix/store/8njkmn9yfcka8yid251wk109n7a6sz1y-wasm-bindgen-cli-0.2.114 /nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2' nativeBuildInputs='/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0 /nix/store/f53d7gw5jh2yc1rv62kp670gnqq3vwwz-checkall /nix/store/py79xv22ipf2ycg4qks55wwai9g4w2qg-dioxus-cli-0.7.3 /nix/store/9dpg06rzbppmxi5q8rms8zyybz56sa6r-cargo-expand-1.0.119 /nix/store/fl02yv3ax1qf1xkq64ik8qz5bjxyyd71-cargo-deny-0.19.0 /nix/store/hadf76x1xknx2w6ydp05gzl2w3j40hqy-cargo-nextest-0.9.124 /nix/store/s4rgqv7brrcq2jm8m00dyair22knq10s-typos-1.42.3 /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125 /nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed /nix/store/m05d7wi0zxg35937jbp6rp7zsvbb5qv4-rust-analyzer-nightly-a96b6a9b887008bae01839543f9ca8e1f67f4ebe /nix/store/8njkmn9yfcka8yid251wk109n7a6sz1y-wasm-bindgen-cli-0.2.114 /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev /nix/store/6n5r46icm0bl55s9p5z2zgcv93m39r5l-clang-wrapper-21.1.8 /nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev /nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2'
export nativeBuildInputs export nativeBuildInputs
out='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out' out='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out'
export out export out
@ -179,9 +183,9 @@ phases='buildPhase'
export phases export phases
pkg='/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0' pkg='/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0'
declare -a pkgsBuildBuild=() declare -a pkgsBuildBuild=()
declare -a pkgsBuildHost=('/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0' '/nix/store/f53d7gw5jh2yc1rv62kp670gnqq3vwwz-checkall' '/nix/store/py79xv22ipf2ycg4qks55wwai9g4w2qg-dioxus-cli-0.7.3' '/nix/store/9dpg06rzbppmxi5q8rms8zyybz56sa6r-cargo-expand-1.0.119' '/nix/store/fl02yv3ax1qf1xkq64ik8qz5bjxyyd71-cargo-deny-0.19.0' '/nix/store/hadf76x1xknx2w6ydp05gzl2w3j40hqy-cargo-nextest-0.9.124' '/nix/store/s4rgqv7brrcq2jm8m00dyair22knq10s-typos-1.42.3' '/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125' '/nix/store/ngqmd36qxwr8d75h3bnssapbgrkwx7db-rust-mixed' '/nix/store/6r3frw6cahjafghfv58vj6a4v1g2zxad-rust-analyzer-nightly-17304e9c7e11d26139672d3d77aa498b1cae0d69' '/nix/store/8njkmn9yfcka8yid251wk109n7a6sz1y-wasm-bindgen-cli-0.2.114' '/nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2' '/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2' '/nix/store/y03z7y8cgdck7vk8qpim30vps4d22gzv-update-autotools-gnu-config-scripts-hook' '/nix/store/0y5xmdb7qfvimjwbq7ibg1xdgkgjwqng-no-broken-symlinks.sh' '/nix/store/cv1d7p48379km6a85h4zp6kr86brh32q-audit-tmpdir.sh' '/nix/store/85clx3b0xkdf58jn161iy80y5223ilbi-compress-man-pages.sh' '/nix/store/p3l1a5y7nllfyrjn2krlwgcc3z0cd3fq-make-symlinks-relative.sh' '/nix/store/5yzw0vhkyszf2d179m0qfkgxmp5wjjx4-move-docs.sh' '/nix/store/fyaryjvghbkpfnsyw97hb3lyb37s1pd6-move-lib64.sh' '/nix/store/kd4xwxjpjxi71jkm6ka0np72if9rm3y0-move-sbin.sh' '/nix/store/pag6l61paj1dc9sv15l7bm5c17xn5kyk-move-systemd-user-units.sh' '/nix/store/cmzya9irvxzlkh7lfy6i82gbp0saxqj3-multiple-outputs.sh' '/nix/store/x8c40nfigps493a07sdr2pm5s9j1cdc0-patch-shebangs.sh' '/nix/store/cickvswrvann041nqxb0rxilc46svw1n-prune-libtool-files.sh' '/nix/store/xyff06pkhki3qy1ls77w10s0v79c9il0-reproducible-builds.sh' '/nix/store/z7k98578dfzi6l3hsvbivzm7hfqlk0zc-set-source-date-epoch-to-latest.sh' '/nix/store/pilsssjjdxvdphlg2h19p0bfx5q0jzkn-strip.sh' '/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0' '/nix/store/i6ppbrlpp6yki8qvka7nyv091xa8dchx-binutils-wrapper-2.44' ) declare -a pkgsBuildHost=('/nix/store/xgixy092whsar7fwm9lmcn4mv9kqn983-process-compose-1.87.0' '/nix/store/f53d7gw5jh2yc1rv62kp670gnqq3vwwz-checkall' '/nix/store/py79xv22ipf2ycg4qks55wwai9g4w2qg-dioxus-cli-0.7.3' '/nix/store/9dpg06rzbppmxi5q8rms8zyybz56sa6r-cargo-expand-1.0.119' '/nix/store/fl02yv3ax1qf1xkq64ik8qz5bjxyyd71-cargo-deny-0.19.0' '/nix/store/hadf76x1xknx2w6ydp05gzl2w3j40hqy-cargo-nextest-0.9.124' '/nix/store/s4rgqv7brrcq2jm8m00dyair22knq10s-typos-1.42.3' '/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125' '/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed' '/nix/store/m05d7wi0zxg35937jbp6rp7zsvbb5qv4-rust-analyzer-nightly-a96b6a9b887008bae01839543f9ca8e1f67f4ebe' '/nix/store/8njkmn9yfcka8yid251wk109n7a6sz1y-wasm-bindgen-cli-0.2.114' '/nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev' '/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0' '/nix/store/6n5r46icm0bl55s9p5z2zgcv93m39r5l-clang-wrapper-21.1.8' '/nix/store/m0rbbdfsbkdqpr6bs621jwi21ra1br4g-binutils-wrapper-2.44' '/nix/store/rszqwjpka3yy6x72d4n3j12a3gxkqbpn-clang-21.1.8-dev' '/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib' '/nix/store/rm8isfm4fd14is3fv3h4m459rbiy91bx-clang-21.1.8' '/nix/store/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2' '/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2' '/nix/store/y03z7y8cgdck7vk8qpim30vps4d22gzv-update-autotools-gnu-config-scripts-hook' '/nix/store/0y5xmdb7qfvimjwbq7ibg1xdgkgjwqng-no-broken-symlinks.sh' '/nix/store/cv1d7p48379km6a85h4zp6kr86brh32q-audit-tmpdir.sh' '/nix/store/85clx3b0xkdf58jn161iy80y5223ilbi-compress-man-pages.sh' '/nix/store/p3l1a5y7nllfyrjn2krlwgcc3z0cd3fq-make-symlinks-relative.sh' '/nix/store/5yzw0vhkyszf2d179m0qfkgxmp5wjjx4-move-docs.sh' '/nix/store/fyaryjvghbkpfnsyw97hb3lyb37s1pd6-move-lib64.sh' '/nix/store/kd4xwxjpjxi71jkm6ka0np72if9rm3y0-move-sbin.sh' '/nix/store/pag6l61paj1dc9sv15l7bm5c17xn5kyk-move-systemd-user-units.sh' '/nix/store/cmzya9irvxzlkh7lfy6i82gbp0saxqj3-multiple-outputs.sh' '/nix/store/x8c40nfigps493a07sdr2pm5s9j1cdc0-patch-shebangs.sh' '/nix/store/cickvswrvann041nqxb0rxilc46svw1n-prune-libtool-files.sh' '/nix/store/xyff06pkhki3qy1ls77w10s0v79c9il0-reproducible-builds.sh' '/nix/store/z7k98578dfzi6l3hsvbivzm7hfqlk0zc-set-source-date-epoch-to-latest.sh' '/nix/store/pilsssjjdxvdphlg2h19p0bfx5q0jzkn-strip.sh' '/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0' '/nix/store/i6ppbrlpp6yki8qvka7nyv091xa8dchx-binutils-wrapper-2.44' )
declare -a pkgsBuildTarget=() declare -a pkgsBuildTarget=()
declare -a pkgsHostHost=() declare -a pkgsHostHost=('/nix/store/i5vppnbl2qnrvm4h5azwq83rr9gm7sdy-compiler-rt-libc-21.1.8-dev' '/nix/store/idl8schy78hxa05jyndj4nmb4wzgcln2-compiler-rt-libc-21.1.8' )
declare -a pkgsHostTarget=() declare -a pkgsHostTarget=()
declare -a pkgsTargetTarget=() declare -a pkgsTargetTarget=()
declare -a postFixupHooks=('noBrokenSymlinksInAllOutputs' '_makeSymlinksRelative' '_multioutPropagateDev' ) declare -a postFixupHooks=('noBrokenSymlinksInAllOutputs' '_makeSymlinksRelative' '_multioutPropagateDev' )
@ -227,9 +231,9 @@ if [ ! type -p direnv &>/dev/null && -f .envrc ]; then
fi fi
mkdir -p "$DEVENV_STATE" mkdir -p "$DEVENV_STATE"
if [ ! -L "$DEVENV_DOTFILE/profile" ] || [ "$(/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin/readlink $DEVENV_DOTFILE/profile)" != "/nix/store/pdpsbmrx88izi8zb6zl4z9rpy2y713bq-devenv-profile" ] if [ ! -L "$DEVENV_DOTFILE/profile" ] || [ "$(/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin/readlink $DEVENV_DOTFILE/profile)" != "/nix/store/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile" ]
then then
ln -snf /nix/store/pdpsbmrx88izi8zb6zl4z9rpy2y713bq-devenv-profile "$DEVENV_DOTFILE/profile" ln -snf /nix/store/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile "$DEVENV_DOTFILE/profile"
fi fi
unset HOST_PATH NIX_BUILD_CORES __structuredAttrs buildInputs buildPhase builder depsBuildBuild depsBuildBuildPropagated depsBuildTarget depsBuildTargetPropagated depsHostHost depsHostHostPropagated depsTargetTarget depsTargetTargetPropagated dontAddDisableDepTrack doCheck doInstallCheck nativeBuildInputs out outputs patches phases preferLocalBuild propagatedBuildInputs propagatedNativeBuildInputs shell shellHook stdenv strictDeps unset HOST_PATH NIX_BUILD_CORES __structuredAttrs buildInputs buildPhase builder depsBuildBuild depsBuildBuildPropagated depsBuildTarget depsBuildTargetPropagated depsHostHost depsHostHostPropagated depsTargetTarget depsTargetTargetPropagated dontAddDisableDepTrack doCheck doInstallCheck nativeBuildInputs out outputs patches phases preferLocalBuild propagatedBuildInputs propagatedNativeBuildInputs shell shellHook stdenv strictDeps
@ -237,10 +241,10 @@ mkdir -p /tmp/devenv-b51d30d
ln -snf /tmp/devenv-b51d30d /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv/run ln -snf /tmp/devenv-b51d30d /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv/run
export PATH=/nix/store/kyla2jwmaq948l0gg4pyhf47s8x730s4-devenv-flake-compat/bin:$PATH export PATH=/nix/store/c0xxs40qc5szabj2yiimh0cziknji84q-devenv-flake-compat/bin:$PATH
if [ -z "${DEVENV_SKIP_TASKS:-}" ]; then if [ -z "${DEVENV_SKIP_TASKS:-}" ]; then
/nix/store/9imm2xd6c90bavp6cp8adx9l7m52v842-devenv-tasks-2.0.0/bin/devenv-tasks run devenv:enterShell --mode all --cache-dir /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv --runtime-dir /tmp/devenv-b51d30d || exit $? /nix/store/vjc136ikp6is5m8jv4r5s24gwcfl2naf-devenv-tasks-2.0.0/bin/devenv-tasks run devenv:enterShell --mode all --cache-dir /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv --runtime-dir /tmp/devenv-b51d30d || exit $?
if [ -f "$DEVENV_DOTFILE/load-exports" ]; then if [ -f "$DEVENV_DOTFILE/load-exports" ]; then
source "$DEVENV_DOTFILE/load-exports" source "$DEVENV_DOTFILE/load-exports"
fi fi

197
Cargo.lock generated
View file

@ -231,6 +231,28 @@ version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "bindgen"
version = "0.63.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36d860121800b2a9a94f9b5604b332d5cffb234ce17609ea479d723dbc9d3885"
dependencies = [
"bitflags 1.3.2",
"cexpr",
"clang-sys",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"proc-macro2",
"quote",
"regex",
"rustc-hash 1.1.0",
"shlex",
"syn 1.0.109",
"which",
]
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -332,6 +354,15 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
[[package]]
name = "cexpr"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
"nom",
]
[[package]] [[package]]
name = "cfb" name = "cfb"
version = "0.7.3" version = "0.7.3"
@ -415,6 +446,17 @@ dependencies = [
"half", "half",
] ]
[[package]]
name = "clang-sys"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
dependencies = [
"glob",
"libc",
"libloading 0.8.9",
]
[[package]] [[package]]
name = "cocoa" name = "cocoa"
version = "0.26.1" version = "0.26.1"
@ -715,10 +757,15 @@ name = "cursor-move-webapp"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"dioxus", "dioxus",
"memfile",
"rustix 1.1.4",
"serde", "serde",
"tokio", "tokio",
"wayland-client", "wayland-client",
"wayland-protocols",
"wayland-protocols-misc",
"wayland-protocols-wlr", "wayland-protocols-wlr",
"xkb",
] ]
[[package]] [[package]]
@ -1605,6 +1652,12 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]]
name = "either"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
version = "0.8.35" version = "0.8.35"
@ -1989,7 +2042,7 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
dependencies = [ dependencies = [
"rustix", "rustix 1.1.4",
"windows-link 0.2.1", "windows-link 0.2.1",
] ]
@ -2123,6 +2176,12 @@ dependencies = [
"system-deps", "system-deps",
] ]
[[package]]
name = "glob"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
[[package]] [[package]]
name = "global-hotkey" name = "global-hotkey"
version = "0.7.0" version = "0.7.0"
@ -2341,6 +2400,15 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "home"
version = "0.5.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d"
dependencies = [
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "html5ever" name = "html5ever"
version = "0.29.1" version = "0.29.1"
@ -2750,6 +2818,12 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "lazycell"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]] [[package]]
name = "leb128fmt" name = "leb128fmt"
version = "0.1.0" version = "0.1.0"
@ -2835,6 +2909,12 @@ dependencies = [
"x11", "x11",
] ]
[[package]]
name = "linux-raw-sys"
version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.12.1" version = "0.12.1"
@ -3013,7 +3093,16 @@ version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227"
dependencies = [ dependencies = [
"rustix", "rustix 1.1.4",
]
[[package]]
name = "memfile"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f64636fdb65a5f0740f920c4281f3dbb76a71e25e25914b6d27000739897d40e"
dependencies = [
"libc",
] ]
[[package]] [[package]]
@ -3050,6 +3139,12 @@ dependencies = [
"unicase", "unicase",
] ]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.9" version = "0.8.9"
@ -3168,6 +3263,16 @@ version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]] [[package]]
name = "num-conv" name = "num-conv"
version = "0.2.0" version = "0.2.0"
@ -3424,6 +3529,12 @@ dependencies = [
"windows-link 0.2.1", "windows-link 0.2.1",
] ]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.3.2" version = "2.3.2"
@ -3964,6 +4075,18 @@ dependencies = [
"thiserror 2.0.18", "thiserror 2.0.18",
] ]
[[package]]
name = "regex"
version = "1.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.4.14" version = "0.4.14"
@ -4084,6 +4207,19 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "rustix"
version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [
"bitflags 2.11.0",
"errno",
"libc",
"linux-raw-sys 0.4.15",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "1.1.4" version = "1.1.4"
@ -4093,7 +4229,7 @@ dependencies = [
"bitflags 2.11.0", "bitflags 2.11.0",
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys 0.12.1",
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
@ -4718,7 +4854,7 @@ dependencies = [
"fastrand", "fastrand",
"getrandom 0.4.1", "getrandom 0.4.1",
"once_cell", "once_cell",
"rustix", "rustix 1.1.4",
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
@ -5462,7 +5598,7 @@ checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
dependencies = [ dependencies = [
"cc", "cc",
"downcast-rs", "downcast-rs",
"rustix", "rustix 1.1.4",
"smallvec", "smallvec",
"wayland-sys", "wayland-sys",
] ]
@ -5474,7 +5610,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
dependencies = [ dependencies = [
"bitflags 2.11.0", "bitflags 2.11.0",
"rustix", "rustix 1.1.4",
"wayland-backend", "wayland-backend",
"wayland-scanner", "wayland-scanner",
] ]
@ -5491,6 +5627,19 @@ dependencies = [
"wayland-scanner", "wayland-scanner",
] ]
[[package]]
name = "wayland-protocols-misc"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e"
dependencies = [
"bitflags 2.11.0",
"wayland-backend",
"wayland-client",
"wayland-protocols",
"wayland-scanner",
]
[[package]] [[package]]
name = "wayland-protocols-wlr" name = "wayland-protocols-wlr"
version = "0.3.10" version = "0.3.10"
@ -5649,6 +5798,18 @@ dependencies = [
"windows-core 0.61.2", "windows-core 0.61.2",
] ]
[[package]]
name = "which"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
dependencies = [
"either",
"home",
"once_cell",
"rustix 0.38.44",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.9" version = "0.3.9"
@ -6262,7 +6423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
dependencies = [ dependencies = [
"gethostname", "gethostname",
"rustix", "rustix 1.1.4",
"x11rb-protocol", "x11rb-protocol",
] ]
@ -6272,6 +6433,28 @@ version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
[[package]]
name = "xkb"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2819e26f5465d84288b45c72864c40d55ac0684daea1973494caa3b2cea2e0f"
dependencies = [
"bitflags 1.3.2",
"libc",
"xkbcommon-sys",
]
[[package]]
name = "xkbcommon-sys"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f7dbb61bc8fd714a64f750e9c259952f079afe701256dd2118602c0ae15c90"
dependencies = [
"bindgen",
"libc",
"pkg-config",
]
[[package]] [[package]]
name = "xkeysym" name = "xkeysym"
version = "0.2.1" version = "0.2.1"

View file

@ -13,6 +13,11 @@ serde = { version = "1.0.228", features = ["derive"] }
wayland-client = { version = "0.31.12", optional = true } wayland-client = { version = "0.31.12", optional = true }
wayland-protocols-wlr = { version = "0.3.10", features = ["client"], optional = true } wayland-protocols-wlr = { version = "0.3.10", features = ["client"], optional = true }
tokio = {version = "1.49.0", optional = true} tokio = {version = "1.49.0", optional = true}
rustix = { version = "1.1.4", optional = true, features = ["time"] }
wayland-protocols-misc = { version = "0.3.10", features = ["client"], optional = true }
wayland-protocols = { version = "0.32.10", features = ["client", "staging"], optional = true }
xkb = {version = "0.3.0", optional = true}
memfile = {version = "0.3.2", optional = true}
[features] [features]
default = ["web"] default = ["web"]
@ -23,7 +28,16 @@ desktop = ["dioxus/desktop"]
# The feature that are only required for the mobile = ["dioxus/mobile"] build target should be optional and only enabled in the mobile = ["dioxus/mobile"] feature # The feature that are only required for the mobile = ["dioxus/mobile"] build target should be optional and only enabled in the mobile = ["dioxus/mobile"] feature
mobile = ["dioxus/mobile"] mobile = ["dioxus/mobile"]
# The feature that are only required for the server = ["dioxus/server"] build target should be optional and only enabled in the server = ["dioxus/server"] feature # The feature that are only required for the server = ["dioxus/server"] build target should be optional and only enabled in the server = ["dioxus/server"] feature
server = ["dioxus/server", "dep:wayland-client", "dep:wayland-protocols-wlr", "dep:tokio"] server = ["dioxus/server",
"dep:wayland-client",
"dep:wayland-protocols-wlr",
"dep:wayland-protocols-misc",
"dep:wayland-protocols",
"dep:tokio",
"dep:rustix",
"dep:xkb",
"dep:memfile"
]
[lints] [lints]
workspace = true workspace = true

View file

@ -7,5 +7,7 @@
& > * { & > * {
flex-grow: 1; flex-grow: 1;
display: flex;
flex-direction: column;
} }
} }

View file

@ -2,4 +2,5 @@
background-color: white; background-color: white;
touch-action: none; touch-action: none;
flex-grow: 1;
} }

View file

@ -1,6 +1,9 @@
use dioxus::{ use dioxus::{
fullstack::{CborEncoding, WebSocketOptions, Websocket, extract::State, use_websocket}, fullstack::{CborEncoding, WebSocketOptions, Websocket, extract::State, use_websocket},
html::geometry::{ElementSpace, euclid::Point2D}, html::{
geometry::{ElementSpace, euclid::Point2D},
input_data::MouseButton,
},
logger::tracing, logger::tracing,
prelude::*, prelude::*,
}; };
@ -28,11 +31,8 @@ pub fn MouseArea() -> Element {
} }
}); });
rsx! { let pointer_move_handler = use_callback(move |evt: Event<PointerData>| {
div { if evt.held_buttons().contains(MouseButton::Primary) {
class: Styles::mouse_area,
onpointermove: move |evt| {
evt.prevent_default(); evt.prevent_default();
let point = evt.element_coordinates(); let point = evt.element_coordinates();
let last_position = last_cursor_position.write().replace(point); let last_position = last_cursor_position.write().replace(point);
@ -41,14 +41,60 @@ pub fn MouseArea() -> Element {
let delta = point - last_position; let delta = point - last_position;
spawn(async move { spawn(async move {
_ = socket.send(ClientEvent::MouseMove { dx: delta.x, dy: delta.y }).await; _ = socket
.send(ClientEvent::MouseMove {
dx: delta.x,
dy: delta.y,
})
.await;
}); });
} }
}, }
});
onpointerdown: move |evt| { let pointer_down_handler = use_callback(move |evt: Event<PointerData>| {
let point = evt.element_coordinates(); let point = evt.element_coordinates();
*last_cursor_position.write() = Some(point); *last_cursor_position.write() = Some(point);
});
let pointer_click_handler = use_callback(move |evt: Event<MouseData>| {
spawn(async move {
_ = socket.send(ClientEvent::Click).await;
});
});
let key_down_handler = use_callback(move |evt: Event<KeyboardData>| {
tracing::info!("Keydown");
spawn(async move {
_ = socket
.send(ClientEvent::KeyEvent {
key: evt.key().to_string(),
is_pressed: true,
})
.await;
});
});
let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
spawn(async move {
_ = socket
.send(ClientEvent::KeyEvent {
key: evt.key().to_string(),
is_pressed: false,
})
.await;
});
});
rsx! {
div {
input { onkeydown: key_down_handler, onkeyup: key_up_handler}
div {
class: Styles::mouse_area,
onpointermove: pointer_move_handler,
onpointerdown: pointer_down_handler,
onclick: pointer_click_handler
} }
} }
} }
@ -57,6 +103,8 @@ pub fn MouseArea() -> Element {
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
enum ClientEvent { enum ClientEvent {
MouseMove { dx: f64, dy: f64 }, MouseMove { dx: f64, dy: f64 },
Click,
KeyEvent { key: String, is_pressed: bool },
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
@ -65,15 +113,25 @@ enum ServerEvent {
} }
#[expect(clippy::unused_async)] #[expect(clippy::unused_async)]
#[get("/api/mouse_move_ws", mouse_service: State<crate::server::mouse_service::MouseService>)] #[get("/api/mouse_move_ws", mouse_service: State<crate::server::input_proxy_service::InputProxyService>)]
async fn mouse_move( async fn mouse_move(
options: WebSocketOptions options: WebSocketOptions
) -> Result<Websocket<ClientEvent, ServerEvent, CborEncoding>> { ) -> Result<Websocket<ClientEvent, ServerEvent, CborEncoding>> {
Ok(options.on_upgrade(move |mut socket| async move { Ok(options.on_upgrade(move |mut socket| async move {
_ = socket.send(ServerEvent::Ping).await; _ = socket.send(ServerEvent::Ping).await;
while let Ok(ClientEvent::MouseMove { dx, dy }) = socket.recv().await { while let Ok(event) = socket.recv().await {
match event {
ClientEvent::MouseMove { dx, dy } => {
mouse_service.move_mouse(dx, dy).await; mouse_service.move_mouse(dx, dy).await;
},
ClientEvent::Click => {
mouse_service.click().await;
},
ClientEvent::KeyEvent { key, is_pressed } => {
mouse_service.key_event(key, is_pressed).await;
},
}
} }
})) }))
} }

View file

@ -30,11 +30,11 @@ fn main() {
// before launching our app. // before launching our app.
#[cfg(feature = "server")] #[cfg(feature = "server")]
dioxus::serve(|| async move { dioxus::serve(|| async move {
use crate::server::mouse_service::MouseService; use crate::server::input_proxy_service::InputProxyService;
use dioxus::server::axum::Extension; use dioxus::server::axum::Extension;
let router = dioxus::server::router(App); let router = dioxus::server::router(App);
let router = router.layer(Extension(MouseService::start())); let router = router.layer(Extension(InputProxyService::start()));
Ok(router) Ok(router)
}); });

View file

@ -0,0 +1,408 @@
use std::{io::Write, str::FromStr, sync::Arc, time::Duration};
use dioxus::{
fullstack::{FullstackContext, extract::FromRef},
html::Key,
logger::tracing,
};
use memfile::MemFile;
use rustix::time::{ClockId, clock_gettime};
use tokio::sync::Mutex;
use wayland_client::{
Connection, Dispatch, EventQueue, Proxy, QueueHandle,
protocol::{
wl_pointer::ButtonState,
wl_registry::{Event, WlRegistry},
wl_seat::{self, WlSeat},
},
};
use wayland_protocols_misc::zwp_virtual_keyboard_v1::client::{
zwp_virtual_keyboard_manager_v1::ZwpVirtualKeyboardManagerV1,
zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1,
};
use wayland_protocols_wlr::virtual_pointer::v1::client::{
zwlr_virtual_pointer_manager_v1::ZwlrVirtualPointerManagerV1,
zwlr_virtual_pointer_v1::ZwlrVirtualPointerV1,
};
use crate::server::keymap;
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h
const BUTTON_LEFT: u32 = 0x110;
const BTN_RIGHT: u32 = 0x111;
const BTN_MIDDLE: u32 = 0x112;
// https://wayland.app/protocols/wayland#wl_keyboard:enum:keymap_format
const NO_KEYMAP: u32 = 0;
const XKB_V1: u32 = 1;
pub fn get_wayland_timestamp() -> u32 {
let ts = clock_gettime(ClockId::Monotonic);
u32::try_from(
Duration::new(
u64::try_from(ts.tv_sec).unwrap(),
u32::try_from(ts.tv_nsec).unwrap(),
)
.as_millis(),
)
.unwrap()
}
#[derive(Clone)]
pub struct InputProxyService {
input_proxy_service_state: Arc<Mutex<InputProxy>>,
}
impl InputProxyService {
pub fn start() -> Self {
Self {
input_proxy_service_state: Arc::new(Mutex::new(InputProxy::new())),
}
}
pub async fn move_mouse(
&self,
dx: f64,
dy: f64,
) {
let guard = self.input_proxy_service_state.lock().await;
if let Some(pointer) = &guard.state.virtual_pointer() {
let time = get_wayland_timestamp();
pointer.motion(time, dx, dy);
pointer.frame();
guard.event_queue.flush().unwrap();
}
}
pub async fn click(&self) {
let guard = self.input_proxy_service_state.lock().await;
if let Some(pointer) = &guard.state.virtual_pointer() {
tracing::info!("Do click");
let time = get_wayland_timestamp();
pointer.button(time, BUTTON_LEFT, ButtonState::Pressed);
pointer.frame();
pointer.button(time, BUTTON_LEFT, ButtonState::Released);
pointer.frame();
guard.event_queue.flush().unwrap();
}
}
pub async fn key_event(
&self,
key: String,
is_pressed: bool,
) {
let guard = self.input_proxy_service_state.lock().await;
if let Some(keyboard) = &guard.state.virtual_keyboard() {
let time = get_wayland_timestamp();
let key = Key::from_str(key.as_str()).unwrap().legacy_charcode();
keyboard.key(time, key, if is_pressed { 1 } else { 0 });
guard.event_queue.flush().unwrap();
}
}
}
impl FromRef<FullstackContext> for InputProxyService {
fn from_ref(state: &FullstackContext) -> Self {
state.extension::<Self>().unwrap()
}
}
pub struct InputProxy {
state: InputProxyServiceState,
event_queue: EventQueue<InputProxyServiceState>,
}
impl InputProxy {
pub fn new() -> Self {
let connection = Connection::connect_to_env().unwrap();
let display = connection.display();
let mut event_queue = connection.new_event_queue();
let queue_handle = event_queue.handle();
let _ = display.get_registry(&queue_handle, ());
let mut input_proxy_service_state = InputProxyServiceState::new(queue_handle);
event_queue
.roundtrip(&mut input_proxy_service_state)
.unwrap();
Self {
state: input_proxy_service_state,
event_queue,
}
}
}
struct Keymap {
file: MemFile,
size: u32,
}
enum InputProxyServiceState {
Incomplete {
queue_handle: QueueHandle<Self>,
seat: Option<WlSeat>,
virtual_pointer_manager: Option<ZwlrVirtualPointerManagerV1>,
virtual_keyboard_manager: Option<ZwpVirtualKeyboardManagerV1>,
keymap: Keymap,
},
Running {
seat: WlSeat,
virtual_pointer_manager: ZwlrVirtualPointerManagerV1,
virtual_keyboard_manager: ZwpVirtualKeyboardManagerV1,
virtual_pointer: ZwlrVirtualPointerV1,
virtual_keyboard: ZwpVirtualKeyboardV1,
},
}
impl InputProxyServiceState {
fn new(queue_handle: QueueHandle<Self>) -> Self {
let filestr = keymap::KEYMAP;
let mut file = memfile::CreateOptions::new().create("keymap").unwrap();
file.write_all(filestr.as_bytes()).unwrap();
let keymap = Keymap {
file,
size: u32::try_from(filestr.len()).unwrap(),
};
Self::Incomplete {
queue_handle,
keymap,
seat: None,
virtual_pointer_manager: None,
virtual_keyboard_manager: None,
}
}
const fn virtual_keyboard(&self) -> Option<&ZwpVirtualKeyboardV1> {
match self {
Self::Running {
virtual_keyboard, ..
} => Some(virtual_keyboard),
Self::Incomplete { .. } => None,
}
}
const fn virtual_pointer(&self) -> Option<&ZwlrVirtualPointerV1> {
match self {
Self::Running {
virtual_pointer, ..
} => Some(virtual_pointer),
Self::Incomplete { .. } => None,
}
}
pub fn set_seat(
&mut self,
seat: WlSeat,
) {
if let Self::Incomplete {
seat: existing @ None,
..
} = self
{
*existing = Some(seat);
tracing::info!("Obtained Seat!");
self.try_upgrade();
} else {
tracing::info!("Received duplicate wl_seat");
}
}
pub fn set_virtual_pointer_manager(
&mut self,
virtual_pointer_manager: ZwlrVirtualPointerManagerV1,
) {
if let Self::Incomplete {
virtual_pointer_manager: existing @ None,
..
} = self
{
*existing = Some(virtual_pointer_manager);
tracing::info!("Obtained Virtual Pointer Manager!");
self.try_upgrade();
} else {
tracing::info!("Received duplicate ZwlrVirtualPointerManagerV1");
}
}
pub fn set_virtual_keyboard_manager(
&mut self,
virtual_keyboard_manager: ZwpVirtualKeyboardManagerV1,
) {
if let Self::Incomplete {
virtual_keyboard_manager: existing @ None,
..
} = self
{
*existing = Some(virtual_keyboard_manager);
tracing::info!("Obtained Virtual Keyboard Manager!");
self.try_upgrade();
} else {
tracing::info!("Received duplicate ZwpVirtualKeyboardManagerV1");
}
}
pub fn try_upgrade(&mut self) {
if let Self::Incomplete {
queue_handle,
keymap,
seat: oseat @ Some(..),
virtual_pointer_manager: ovpm @ Some(..),
virtual_keyboard_manager: ovkm @ Some(..),
} = self
{
let virtual_keyboard = ovkm.as_ref().unwrap().create_virtual_keyboard(
oseat.as_ref().unwrap(),
queue_handle,
(),
);
virtual_keyboard.keymap(XKB_V1, keymap.file.as_fd(), keymap.size);
let virtual_pointer = ovpm.as_ref().unwrap().create_virtual_pointer(
Some(oseat.as_ref().unwrap()),
queue_handle,
(),
);
tracing::info!("InputProxyServiceState upgraded to running");
*self = Self::Running {
seat: oseat.take().unwrap(),
virtual_pointer_manager: ovpm.take().unwrap(),
virtual_keyboard_manager: ovkm.take().unwrap(),
virtual_pointer,
virtual_keyboard,
};
}
}
}
impl Dispatch<ZwlrVirtualPointerV1, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &ZwlrVirtualPointerV1,
_event: <ZwlrVirtualPointerV1 as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
// No events for ZwlrVirtualPointerV1: https://wayland.app/protocols/wlr-virtual-pointer-unstable-v1
tracing::warn!("Unknown event received from ZwlrVirtualPointerV1");
}
}
impl Dispatch<ZwpVirtualKeyboardV1, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &ZwpVirtualKeyboardV1,
_event: <ZwpVirtualKeyboardV1 as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
// No events for ZwpVirtualKeyboardV1: https://wayland.app/protocols/virtual-keyboard-unstable-v1
tracing::warn!("Unknown event received from ZwpVirtualKeyboardV1");
}
}
impl Dispatch<ZwlrVirtualPointerManagerV1, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &ZwlrVirtualPointerManagerV1,
_event: <ZwlrVirtualPointerManagerV1 as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
// No events for ZwlrVirtualPointerManagerV1: https://wayland.app/protocols/wlr-virtual-pointer-unstable-v1
tracing::warn!("Unknown event received from ZwlrVirtualPointerManagerV1");
}
}
impl Dispatch<ZwpVirtualKeyboardManagerV1, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &ZwpVirtualKeyboardManagerV1,
_event: <ZwpVirtualKeyboardManagerV1 as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
// No events for ZwpVirtualKeyboardManagerV1: https://wayland.app/protocols/virtual-keyboard-unstable-v1
tracing::warn!("Unknown event received from ZwpVirtualKeyboardManagerV1");
}
}
impl Dispatch<WlSeat, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &WlSeat,
event: <WlSeat as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
match event {
wl_seat::Event::Capabilities { capabilities } => {
tracing::info!("WlSeat capabilities: {:?}", capabilities);
},
wl_seat::Event::Name { name } => {
tracing::info!("WlSeat name: {:?}", name);
},
_ => {
tracing::warn!("Unknown event received from WlSeat");
},
}
}
}
impl Dispatch<WlRegistry, ()> for InputProxyServiceState {
fn event(
app_data: &mut Self,
registry: &WlRegistry,
event: Event,
_udata: &(),
_conn: &Connection,
queue_handle: &QueueHandle<Self>,
) {
match event {
Event::Global {
name,
interface,
version,
} => match interface.as_str() {
"wl_seat" => {
let seat = registry.bind::<WlSeat, _, _>(name, version, queue_handle, ());
app_data.set_seat(seat);
},
"zwlr_virtual_pointer_manager_v1" => {
let manager = registry.bind::<ZwlrVirtualPointerManagerV1, _, _>(
name,
version,
queue_handle,
(),
);
app_data.set_virtual_pointer_manager(manager);
},
"zwp_virtual_keyboard_manager_v1" => {
let manager = registry.bind::<ZwpVirtualKeyboardManagerV1, _, _>(
name,
version,
queue_handle,
(),
);
app_data.set_virtual_keyboard_manager(manager);
},
_ => {},
},
Event::GlobalRemove { .. } => todo!(),
_ => todo!(),
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1 +1,2 @@
pub mod mouse_service; pub mod input_proxy_service;
pub mod keymap;

View file

@ -1,143 +0,0 @@
use std::{
sync::Arc,
time::{SystemTime, UNIX_EPOCH},
};
use dioxus::{
fullstack::{FullstackContext, extract::FromRef},
logger::tracing,
};
use tokio::sync::Mutex;
use wayland_client::{Connection, Dispatch, EventQueue, Proxy, QueueHandle, protocol::wl_registry};
use wayland_protocols_wlr::virtual_pointer::v1::client::{
zwlr_virtual_pointer_manager_v1::ZwlrVirtualPointerManagerV1,
zwlr_virtual_pointer_v1::ZwlrVirtualPointerV1,
};
#[derive(Clone)]
pub struct MouseService {
input_proxy_service_state: Arc<Mutex<InputProxy>>,
}
impl MouseService {
pub fn start() -> Self {
Self {
input_proxy_service_state: Arc::new(Mutex::new(InputProxy::new())),
}
}
pub async fn move_mouse(
&self,
dx: f64,
dy: f64,
) {
let guard = self.input_proxy_service_state.lock().await;
if let Some(pointer) = &guard.state.virtual_pointer {
let time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis();
pointer.motion(time as u32, dx, dy);
pointer.frame();
guard.event_queue.flush().unwrap();
}
}
}
impl FromRef<FullstackContext> for MouseService {
fn from_ref(state: &FullstackContext) -> Self {
state.extension::<Self>().unwrap()
}
}
pub struct InputProxy {
state: InputProxyServiceState,
event_queue: EventQueue<InputProxyServiceState>,
}
impl InputProxy {
pub fn new() -> Self {
let connection = Connection::connect_to_env().unwrap();
let display = connection.display();
let mut event_queue = connection.new_event_queue();
let queue_handle = event_queue.handle();
let _ = display.get_registry(&queue_handle, ());
let mut input_proxy_service_state = InputProxyServiceState::default();
event_queue
.roundtrip(&mut input_proxy_service_state)
.unwrap();
Self {
state: input_proxy_service_state,
event_queue,
}
}
}
#[derive(Default)]
struct InputProxyServiceState {
virtual_pointer: Option<ZwlrVirtualPointerV1>,
}
impl Dispatch<ZwlrVirtualPointerV1, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &ZwlrVirtualPointerV1,
_event: <ZwlrVirtualPointerV1 as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
tracing::info!("VPointerData");
}
}
impl Dispatch<ZwlrVirtualPointerManagerV1, ()> for InputProxyServiceState {
fn event(
_state: &mut Self,
_proxy: &ZwlrVirtualPointerManagerV1,
_event: <ZwlrVirtualPointerManagerV1 as Proxy>::Event,
_data: &(),
_conn: &Connection,
_qhandle: &QueueHandle<Self>,
) {
tracing::info!("ZwlrEvent");
}
}
impl Dispatch<wl_registry::WlRegistry, ()> for InputProxyServiceState {
fn event(
app_data: &mut Self,
registry: &wl_registry::WlRegistry,
event: wl_registry::Event,
_udata: &(),
_conn: &Connection,
queue_handle: &QueueHandle<Self>,
) {
println!("WlRegistry Event");
if let wl_registry::Event::Global {
name,
interface,
version,
} = event
&& interface == "zwlr_virtual_pointer_manager_v1"
{
app_data.virtual_pointer.get_or_insert_with(|| {
let manager = registry.bind::<ZwlrVirtualPointerManagerV1, _, _>(
name,
version,
queue_handle,
(),
);
let pointer = manager.create_virtual_pointer(None, queue_handle, ());
println!("Virtual pointer manager created");
pointer
});
}
}
}

View file

@ -65,8 +65,9 @@
fnx.targets.wasm32-unknown-unknown.latest.rust-std fnx.targets.wasm32-unknown-unknown.latest.rust-std
]; ];
wasmBindgen =
wasmBindgen = with pkgs; rustPlatform.buildRustPackage rec { with pkgs;
rustPlatform.buildRustPackage rec {
pname = "wasm-bindgen-cli"; pname = "wasm-bindgen-cli";
version = "0.2.114"; version = "0.2.114";
@ -100,6 +101,10 @@
{ {
name = "my-project"; name = "my-project";
env = {
LIBCLANG_PATH = "${pkgs.libclang.lib}/lib";
};
packages = [ packages = [
pkgs.dioxus-cli pkgs.dioxus-cli
pkgs.cargo-expand pkgs.cargo-expand
@ -111,6 +116,11 @@
fnx.rust-analyzer fnx.rust-analyzer
wasmBindgen wasmBindgen
pkgs.libxkbcommon
pkgs.clang
pkgs.llvmPackages.libclang
]; ];
scripts.checkall.exec = '' scripts.checkall.exec = ''