sketch for key code transfer
This commit is contained in:
parent
966fdbbd50
commit
a2b086a779
23 changed files with 2231 additions and 229 deletions
1
.direnv/flake-inputs/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source
Symbolic link
1
.direnv/flake-inputs/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/nix/store/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source
|
||||
1
.direnv/flake-inputs/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source
Symbolic link
1
.direnv/flake-inputs/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/nix/store/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source
|
||||
|
|
@ -1 +0,0 @@
|
|||
/nix/store/anbs72p9zzvyk3a227k0zmas73l56gxl-source
|
||||
|
|
@ -1 +0,0 @@
|
|||
/nix/store/bv5inqjinipycnjqqq0iabp6xi8hjb09-source
|
||||
1
.direnv/flake-inputs/fxlr459mkipn4j7ff86h7z21zyiwxs62-source
Symbolic link
1
.direnv/flake-inputs/fxlr459mkipn4j7ff86h7z21zyiwxs62-source
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/nix/store/fxlr459mkipn4j7ff86h7z21zyiwxs62-source
|
||||
|
|
@ -1 +0,0 @@
|
|||
/nix/store/j1r5yym7jdsgyb40ykfwwrd7wyf2z2k7-source
|
||||
|
|
@ -1 +0,0 @@
|
|||
/nix/store/j5qcw5x2dm0jlffwwymp6yav62l3pdqm-source
|
||||
1
.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source
Symbolic link
1
.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/nix/store/jh41lavwqi3qdwypiv713yipf3dxi3nx-source
|
||||
1
.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source
Symbolic link
1
.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/nix/store/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source
|
||||
|
|
@ -1 +0,0 @@
|
|||
/nix/store/w0x3nihmdb6cwdqh0i0h4fs95alvv770-source
|
||||
|
|
@ -1 +1 @@
|
|||
/nix/store/05p6k4yj5qk1qapc1xi02mwfgkhi1dfw-my-project-env
|
||||
/nix/store/mq0i12vdknm9wx5w5n7md59xn1z15ag3-my-project-env
|
||||
|
|
@ -18,7 +18,7 @@ DEVENV_DOTFILE='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.devenv'
|
|||
export DEVENV_DOTFILE
|
||||
DEVENV_FLAKE_SHELL='default'
|
||||
export DEVENV_FLAKE_SHELL
|
||||
DEVENV_PROFILE='/nix/store/pdpsbmrx88izi8zb6zl4z9rpy2y713bq-devenv-profile'
|
||||
DEVENV_PROFILE='/nix/store/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile'
|
||||
export DEVENV_PROFILE
|
||||
DEVENV_ROOT='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app'
|
||||
export DEVENV_ROOT
|
||||
|
|
@ -26,12 +26,12 @@ DEVENV_RUNTIME='/tmp/devenv-b51d30d'
|
|||
export DEVENV_RUNTIME
|
||||
DEVENV_STATE='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/.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
|
||||
DEVENV_TASK_FILE='/nix/store/xziksgq8wrc27h4a4vpa723s4jgiq1l1-tasks.json'
|
||||
DEVENV_TASK_FILE='/nix/store/r04g3f96h64qk8xzpm7z0vd17w5b494d-tasks.json'
|
||||
export DEVENV_TASK_FILE
|
||||
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
|
||||
IFS='
|
||||
'
|
||||
|
|
@ -39,6 +39,8 @@ IN_NIX_SHELL='impure'
|
|||
export IN_NIX_SHELL
|
||||
LD='ld'
|
||||
export LD
|
||||
LIBCLANG_PATH='/nix/store/xibf2ayyaljj1r7wgjf4n7n4vg5z8n2v-clang-21.1.8-lib/lib'
|
||||
export LIBCLANG_PATH
|
||||
LINENO='79'
|
||||
MACHTYPE='x86_64-pc-linux-gnu'
|
||||
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
|
||||
NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1'
|
||||
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
|
||||
NIX_ENFORCE_NO_NATIVE='1'
|
||||
export NIX_ENFORCE_NO_NATIVE
|
||||
NIX_HARDENING_ENABLE='bindnow format fortify fortify3 libcxxhardeningextensive libcxxhardeningfast pic relro stackclashprotection stackprotector strictoverflow zerocallusedregs'
|
||||
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
|
||||
NIX_NO_SELF_RPATH='1'
|
||||
NIX_PKG_CONFIG_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1'
|
||||
|
|
@ -74,14 +76,16 @@ OLDPWD=''
|
|||
export OLDPWD
|
||||
OPTERR='1'
|
||||
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
|
||||
PC_CONFIG_FILES='/nix/store/81xv1l07mgr9bi2ng7xqdjnwi5z9h8f8-process-compose.yaml'
|
||||
PC_CONFIG_FILES='/nix/store/f90qf91rzv18zpk3y4yf5saigawqw9nm-process-compose.yaml'
|
||||
export PC_CONFIG_FILES
|
||||
PC_SOCKET_PATH='/tmp/devenv-b51d30d/pc.sock'
|
||||
export PC_SOCKET_PATH
|
||||
PKG_CONFIG='pkg-config'
|
||||
export PKG_CONFIG
|
||||
PKG_CONFIG_PATH='/nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/lib/pkgconfig'
|
||||
export PKG_CONFIG_PATH
|
||||
PS4='+ '
|
||||
RANLIB='ranlib'
|
||||
export RANLIB
|
||||
|
|
@ -97,7 +101,7 @@ STRINGS='strings'
|
|||
export STRINGS
|
||||
STRIP='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
|
||||
__structuredAttrs=''
|
||||
export __structuredAttrs
|
||||
|
|
@ -147,8 +151,8 @@ export dontAddDisableDepTrack
|
|||
declare -a envBuildBuildHooks=()
|
||||
declare -a envBuildHostHooks=()
|
||||
declare -a envBuildTargetHooks=()
|
||||
declare -a envHostHostHooks=('pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' )
|
||||
declare -a envHostTargetHooks=('pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' )
|
||||
declare -a envHostHostHooks=('ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' 'pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' )
|
||||
declare -a envHostTargetHooks=('ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' 'pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' )
|
||||
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' )
|
||||
hardeningDisable=''
|
||||
|
|
@ -158,7 +162,7 @@ mesonFlags=''
|
|||
export mesonFlags
|
||||
name='my-project-env'
|
||||
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
|
||||
out='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out'
|
||||
export out
|
||||
|
|
@ -179,9 +183,9 @@ phases='buildPhase'
|
|||
export phases
|
||||
pkg='/nix/store/a245z3cvf9x9sn0xlk6k8j9xhxbhda1z-gcc-wrapper-15.2.0'
|
||||
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 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 pkgsTargetTarget=()
|
||||
declare -a postFixupHooks=('noBrokenSymlinksInAllOutputs' '_makeSymlinksRelative' '_multioutPropagateDev' )
|
||||
|
|
@ -227,9 +231,9 @@ if [ ! type -p direnv &>/dev/null && -f .envrc ]; then
|
|||
fi
|
||||
|
||||
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
|
||||
ln -snf /nix/store/pdpsbmrx88izi8zb6zl4z9rpy2y713bq-devenv-profile "$DEVENV_DOTFILE/profile"
|
||||
ln -snf /nix/store/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile "$DEVENV_DOTFILE/profile"
|
||||
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
|
||||
|
||||
|
|
@ -237,10 +241,10 @@ mkdir -p /tmp/devenv-b51d30d
|
|||
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
|
||||
/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
|
||||
source "$DEVENV_DOTFILE/load-exports"
|
||||
fi
|
||||
|
|
|
|||
197
Cargo.lock
generated
197
Cargo.lock
generated
|
|
@ -231,6 +231,28 @@ version = "0.22.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
|
|
@ -332,6 +354,15 @@ version = "1.1.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
|
||||
|
||||
[[package]]
|
||||
name = "cexpr"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
|
||||
dependencies = [
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfb"
|
||||
version = "0.7.3"
|
||||
|
|
@ -415,6 +446,17 @@ dependencies = [
|
|||
"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]]
|
||||
name = "cocoa"
|
||||
version = "0.26.1"
|
||||
|
|
@ -715,10 +757,15 @@ name = "cursor-move-webapp"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"dioxus",
|
||||
"memfile",
|
||||
"rustix 1.1.4",
|
||||
"serde",
|
||||
"tokio",
|
||||
"wayland-client",
|
||||
"wayland-protocols",
|
||||
"wayland-protocols-misc",
|
||||
"wayland-protocols-wlr",
|
||||
"xkb",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1605,6 +1652,12 @@ version = "1.0.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||
|
||||
[[package]]
|
||||
name = "encoding_rs"
|
||||
version = "0.8.35"
|
||||
|
|
@ -1989,7 +2042,7 @@ version = "1.1.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
|
||||
dependencies = [
|
||||
"rustix",
|
||||
"rustix 1.1.4",
|
||||
"windows-link 0.2.1",
|
||||
]
|
||||
|
||||
|
|
@ -2123,6 +2176,12 @@ dependencies = [
|
|||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
|
||||
|
||||
[[package]]
|
||||
name = "global-hotkey"
|
||||
version = "0.7.0"
|
||||
|
|
@ -2341,6 +2400,15 @@ version = "0.5.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "html5ever"
|
||||
version = "0.29.1"
|
||||
|
|
@ -2750,6 +2818,12 @@ version = "1.5.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "lazycell"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
|
|
@ -2835,6 +2909,12 @@ dependencies = [
|
|||
"x11",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.12.1"
|
||||
|
|
@ -3013,7 +3093,16 @@ version = "0.6.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227"
|
||||
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]]
|
||||
|
|
@ -3050,6 +3139,12 @@ dependencies = [
|
|||
"unicase",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.8.9"
|
||||
|
|
@ -3168,6 +3263,16 @@ version = "0.1.14"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "num-conv"
|
||||
version = "0.2.0"
|
||||
|
|
@ -3424,6 +3529,12 @@ dependencies = [
|
|||
"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]]
|
||||
name = "percent-encoding"
|
||||
version = "2.3.2"
|
||||
|
|
@ -3964,6 +4075,18 @@ dependencies = [
|
|||
"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]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
|
|
@ -4084,6 +4207,19 @@ dependencies = [
|
|||
"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]]
|
||||
name = "rustix"
|
||||
version = "1.1.4"
|
||||
|
|
@ -4093,7 +4229,7 @@ dependencies = [
|
|||
"bitflags 2.11.0",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"linux-raw-sys 0.12.1",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
|
|
@ -4718,7 +4854,7 @@ dependencies = [
|
|||
"fastrand",
|
||||
"getrandom 0.4.1",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"rustix 1.1.4",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
|
|
@ -5462,7 +5598,7 @@ checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
|
|||
dependencies = [
|
||||
"cc",
|
||||
"downcast-rs",
|
||||
"rustix",
|
||||
"rustix 1.1.4",
|
||||
"smallvec",
|
||||
"wayland-sys",
|
||||
]
|
||||
|
|
@ -5474,7 +5610,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
|
||||
dependencies = [
|
||||
"bitflags 2.11.0",
|
||||
"rustix",
|
||||
"rustix 1.1.4",
|
||||
"wayland-backend",
|
||||
"wayland-scanner",
|
||||
]
|
||||
|
|
@ -5491,6 +5627,19 @@ dependencies = [
|
|||
"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]]
|
||||
name = "wayland-protocols-wlr"
|
||||
version = "0.3.10"
|
||||
|
|
@ -5649,6 +5798,18 @@ dependencies = [
|
|||
"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]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
|
|
@ -6262,7 +6423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
|
||||
dependencies = [
|
||||
"gethostname",
|
||||
"rustix",
|
||||
"rustix 1.1.4",
|
||||
"x11rb-protocol",
|
||||
]
|
||||
|
||||
|
|
@ -6272,6 +6433,28 @@ version = "0.13.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "xkeysym"
|
||||
version = "0.2.1"
|
||||
|
|
|
|||
|
|
@ -13,6 +13,11 @@ serde = { version = "1.0.228", features = ["derive"] }
|
|||
wayland-client = { version = "0.31.12", optional = true }
|
||||
wayland-protocols-wlr = { version = "0.3.10", features = ["client"], 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]
|
||||
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
|
||||
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
|
||||
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]
|
||||
workspace = true
|
||||
|
|
|
|||
|
|
@ -7,5 +7,7 @@
|
|||
|
||||
& > * {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,4 +2,5 @@
|
|||
background-color: white;
|
||||
|
||||
touch-action: none;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
use dioxus::{
|
||||
fullstack::{CborEncoding, WebSocketOptions, Websocket, extract::State, use_websocket},
|
||||
html::geometry::{ElementSpace, euclid::Point2D},
|
||||
html::{
|
||||
geometry::{ElementSpace, euclid::Point2D},
|
||||
input_data::MouseButton,
|
||||
},
|
||||
logger::tracing,
|
||||
prelude::*,
|
||||
};
|
||||
|
|
@ -28,11 +31,8 @@ pub fn MouseArea() -> Element {
|
|||
}
|
||||
});
|
||||
|
||||
rsx! {
|
||||
div {
|
||||
class: Styles::mouse_area,
|
||||
|
||||
onpointermove: move |evt| {
|
||||
let pointer_move_handler = use_callback(move |evt: Event<PointerData>| {
|
||||
if evt.held_buttons().contains(MouseButton::Primary) {
|
||||
evt.prevent_default();
|
||||
let point = evt.element_coordinates();
|
||||
let last_position = last_cursor_position.write().replace(point);
|
||||
|
|
@ -41,14 +41,60 @@ pub fn MouseArea() -> Element {
|
|||
let delta = point - last_position;
|
||||
|
||||
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();
|
||||
*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)]
|
||||
enum ClientEvent {
|
||||
MouseMove { dx: f64, dy: f64 },
|
||||
Click,
|
||||
KeyEvent { key: String, is_pressed: bool },
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
|
|
@ -65,15 +113,25 @@ enum ServerEvent {
|
|||
}
|
||||
|
||||
#[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(
|
||||
options: WebSocketOptions
|
||||
) -> Result<Websocket<ClientEvent, ServerEvent, CborEncoding>> {
|
||||
Ok(options.on_upgrade(move |mut socket| async move {
|
||||
_ = 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;
|
||||
},
|
||||
ClientEvent::Click => {
|
||||
mouse_service.click().await;
|
||||
},
|
||||
ClientEvent::KeyEvent { key, is_pressed } => {
|
||||
mouse_service.key_event(key, is_pressed).await;
|
||||
},
|
||||
}
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,11 +30,11 @@ fn main() {
|
|||
// before launching our app.
|
||||
#[cfg(feature = "server")]
|
||||
dioxus::serve(|| async move {
|
||||
use crate::server::mouse_service::MouseService;
|
||||
use crate::server::input_proxy_service::InputProxyService;
|
||||
use dioxus::server::axum::Extension;
|
||||
|
||||
let router = dioxus::server::router(App);
|
||||
let router = router.layer(Extension(MouseService::start()));
|
||||
let router = router.layer(Extension(InputProxyService::start()));
|
||||
|
||||
Ok(router)
|
||||
});
|
||||
|
|
|
|||
408
crates/cursor-move-webapp/src/server/input_proxy_service.rs
Normal file
408
crates/cursor-move-webapp/src/server/input_proxy_service.rs
Normal 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!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
1464
crates/cursor-move-webapp/src/server/keymap.rs
Normal file
1464
crates/cursor-move-webapp/src/server/keymap.rs
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1 +1,2 @@
|
|||
pub mod mouse_service;
|
||||
pub mod input_proxy_service;
|
||||
pub mod keymap;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
14
flake.nix
14
flake.nix
|
|
@ -65,8 +65,9 @@
|
|||
fnx.targets.wasm32-unknown-unknown.latest.rust-std
|
||||
];
|
||||
|
||||
|
||||
wasmBindgen = with pkgs; rustPlatform.buildRustPackage rec {
|
||||
wasmBindgen =
|
||||
with pkgs;
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "wasm-bindgen-cli";
|
||||
version = "0.2.114";
|
||||
|
||||
|
|
@ -100,6 +101,10 @@
|
|||
{
|
||||
name = "my-project";
|
||||
|
||||
env = {
|
||||
LIBCLANG_PATH = "${pkgs.libclang.lib}/lib";
|
||||
};
|
||||
|
||||
packages = [
|
||||
pkgs.dioxus-cli
|
||||
pkgs.cargo-expand
|
||||
|
|
@ -111,6 +116,11 @@
|
|||
fnx.rust-analyzer
|
||||
wasmBindgen
|
||||
|
||||
pkgs.libxkbcommon
|
||||
|
||||
pkgs.clang
|
||||
pkgs.llvmPackages.libclang
|
||||
|
||||
];
|
||||
|
||||
scripts.checkall.exec = ''
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue