diff --git a/.direnv/flake-inputs/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source b/.direnv/flake-inputs/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source new file mode 120000 index 0000000..d37c01a --- /dev/null +++ b/.direnv/flake-inputs/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source @@ -0,0 +1 @@ +/nix/store/2a9ylipb88x2sp2xn6cg58p5xm6qamai-source \ No newline at end of file diff --git a/.direnv/flake-inputs/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source b/.direnv/flake-inputs/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source new file mode 120000 index 0000000..1443576 --- /dev/null +++ b/.direnv/flake-inputs/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source @@ -0,0 +1 @@ +/nix/store/7a4jq2c49dwdqxb2b9fd5har64gkxd9w-source \ No newline at end of file diff --git a/.direnv/flake-inputs/anbs72p9zzvyk3a227k0zmas73l56gxl-source b/.direnv/flake-inputs/anbs72p9zzvyk3a227k0zmas73l56gxl-source deleted file mode 120000 index d32be41..0000000 --- a/.direnv/flake-inputs/anbs72p9zzvyk3a227k0zmas73l56gxl-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/anbs72p9zzvyk3a227k0zmas73l56gxl-source \ No newline at end of file diff --git a/.direnv/flake-inputs/bv5inqjinipycnjqqq0iabp6xi8hjb09-source b/.direnv/flake-inputs/bv5inqjinipycnjqqq0iabp6xi8hjb09-source deleted file mode 120000 index c41430c..0000000 --- a/.direnv/flake-inputs/bv5inqjinipycnjqqq0iabp6xi8hjb09-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/bv5inqjinipycnjqqq0iabp6xi8hjb09-source \ No newline at end of file diff --git a/.direnv/flake-inputs/fxlr459mkipn4j7ff86h7z21zyiwxs62-source b/.direnv/flake-inputs/fxlr459mkipn4j7ff86h7z21zyiwxs62-source new file mode 120000 index 0000000..d8d3527 --- /dev/null +++ b/.direnv/flake-inputs/fxlr459mkipn4j7ff86h7z21zyiwxs62-source @@ -0,0 +1 @@ +/nix/store/fxlr459mkipn4j7ff86h7z21zyiwxs62-source \ No newline at end of file diff --git a/.direnv/flake-inputs/j1r5yym7jdsgyb40ykfwwrd7wyf2z2k7-source b/.direnv/flake-inputs/j1r5yym7jdsgyb40ykfwwrd7wyf2z2k7-source deleted file mode 120000 index a47fee0..0000000 --- a/.direnv/flake-inputs/j1r5yym7jdsgyb40ykfwwrd7wyf2z2k7-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/j1r5yym7jdsgyb40ykfwwrd7wyf2z2k7-source \ No newline at end of file diff --git a/.direnv/flake-inputs/j5qcw5x2dm0jlffwwymp6yav62l3pdqm-source b/.direnv/flake-inputs/j5qcw5x2dm0jlffwwymp6yav62l3pdqm-source deleted file mode 120000 index e757e81..0000000 --- a/.direnv/flake-inputs/j5qcw5x2dm0jlffwwymp6yav62l3pdqm-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/j5qcw5x2dm0jlffwwymp6yav62l3pdqm-source \ No newline at end of file diff --git a/.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source b/.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source new file mode 120000 index 0000000..491c89e --- /dev/null +++ b/.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source @@ -0,0 +1 @@ +/nix/store/jh41lavwqi3qdwypiv713yipf3dxi3nx-source \ No newline at end of file diff --git a/.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source b/.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source new file mode 120000 index 0000000..d0f2aea --- /dev/null +++ b/.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source @@ -0,0 +1 @@ +/nix/store/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source \ No newline at end of file diff --git a/.direnv/flake-inputs/w0x3nihmdb6cwdqh0i0h4fs95alvv770-source b/.direnv/flake-inputs/w0x3nihmdb6cwdqh0i0h4fs95alvv770-source deleted file mode 120000 index 72c77b7..0000000 --- a/.direnv/flake-inputs/w0x3nihmdb6cwdqh0i0h4fs95alvv770-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/w0x3nihmdb6cwdqh0i0h4fs95alvv770-source \ No newline at end of file diff --git a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa index 26ef82b..e2924f3 120000 --- a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa +++ b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa @@ -1 +1 @@ -/nix/store/05p6k4yj5qk1qapc1xi02mwfgkhi1dfw-my-project-env \ No newline at end of file +/nix/store/mq0i12vdknm9wx5w5n7md59xn1z15ag3-my-project-env \ No newline at end of file diff --git a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc index 3a07538..6c7d79b 100644 --- a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc +++ b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc @@ -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 diff --git a/Cargo.lock b/Cargo.lock index a080429..375aa93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/crates/cursor-move-webapp/Cargo.toml b/crates/cursor-move-webapp/Cargo.toml index bdd11f3..9b8fdf2 100644 --- a/crates/cursor-move-webapp/Cargo.toml +++ b/crates/cursor-move-webapp/Cargo.toml @@ -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 diff --git a/crates/cursor-move-webapp/assets/styling/home.module.css b/crates/cursor-move-webapp/assets/styling/home.module.css index 590eb93..67ab765 100644 --- a/crates/cursor-move-webapp/assets/styling/home.module.css +++ b/crates/cursor-move-webapp/assets/styling/home.module.css @@ -7,5 +7,7 @@ & > * { flex-grow: 1; + display: flex; + flex-direction: column; } } diff --git a/crates/cursor-move-webapp/assets/styling/mouse_area.module.css b/crates/cursor-move-webapp/assets/styling/mouse_area.module.css index 07c7dd6..2be2e3a 100644 --- a/crates/cursor-move-webapp/assets/styling/mouse_area.module.css +++ b/crates/cursor-move-webapp/assets/styling/mouse_area.module.css @@ -2,4 +2,5 @@ background-color: white; touch-action: none; + flex-grow: 1; } diff --git a/crates/cursor-move-webapp/src/components/mouse_area.rs b/crates/cursor-move-webapp/src/components/mouse_area.rs index 79d17d7..54c1692 100644 --- a/crates/cursor-move-webapp/src/components/mouse_area.rs +++ b/crates/cursor-move-webapp/src/components/mouse_area.rs @@ -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,27 +31,70 @@ pub fn MouseArea() -> Element { } }); + let pointer_move_handler = use_callback(move |evt: Event| { + if evt.held_buttons().contains(MouseButton::Primary) { + evt.prevent_default(); + let point = evt.element_coordinates(); + let last_position = last_cursor_position.write().replace(point); + + if let Some(last_position) = last_position { + let delta = point - last_position; + + spawn(async move { + _ = socket + .send(ClientEvent::MouseMove { + dx: delta.x, + dy: delta.y, + }) + .await; + }); + } + } + }); + + let pointer_down_handler = use_callback(move |evt: Event| { + let point = evt.element_coordinates(); + *last_cursor_position.write() = Some(point); + }); + + let pointer_click_handler = use_callback(move |evt: Event| { + spawn(async move { + _ = socket.send(ClientEvent::Click).await; + }); + }); + + let key_down_handler = use_callback(move |evt: Event| { + 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| { + spawn(async move { + _ = socket + .send(ClientEvent::KeyEvent { + key: evt.key().to_string(), + is_pressed: false, + }) + .await; + }); + }); + rsx! { div { - class: Styles::mouse_area, + input { onkeydown: key_down_handler, onkeyup: key_up_handler} + div { + class: Styles::mouse_area, - onpointermove: move |evt| { - evt.prevent_default(); - let point = evt.element_coordinates(); - let last_position = last_cursor_position.write().replace(point); - - if let Some(last_position) = last_position { - let delta = point - last_position; - - spawn(async move { - _ = socket.send(ClientEvent::MouseMove { dx: delta.x, dy: delta.y }).await; - }); - } - }, - - onpointerdown: move |evt| { - let point = evt.element_coordinates(); - *last_cursor_position.write() = Some(point); + 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)] +#[get("/api/mouse_move_ws", mouse_service: State)] async fn mouse_move( options: WebSocketOptions ) -> Result> { Ok(options.on_upgrade(move |mut socket| async move { _ = socket.send(ServerEvent::Ping).await; - while let Ok(ClientEvent::MouseMove { dx, dy }) = socket.recv().await { - mouse_service.move_mouse(dx, dy).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; + }, + } } })) } diff --git a/crates/cursor-move-webapp/src/main.rs b/crates/cursor-move-webapp/src/main.rs index fd19996..d171f40 100644 --- a/crates/cursor-move-webapp/src/main.rs +++ b/crates/cursor-move-webapp/src/main.rs @@ -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) }); diff --git a/crates/cursor-move-webapp/src/server/input_proxy_service.rs b/crates/cursor-move-webapp/src/server/input_proxy_service.rs new file mode 100644 index 0000000..4f6a7a3 --- /dev/null +++ b/crates/cursor-move-webapp/src/server/input_proxy_service.rs @@ -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>, +} + +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 for InputProxyService { + fn from_ref(state: &FullstackContext) -> Self { + state.extension::().unwrap() + } +} + +pub struct InputProxy { + state: InputProxyServiceState, + event_queue: EventQueue, +} + +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, + seat: Option, + virtual_pointer_manager: Option, + virtual_keyboard_manager: Option, + 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 { + 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 for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &ZwlrVirtualPointerV1, + _event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + // No events for ZwlrVirtualPointerV1: https://wayland.app/protocols/wlr-virtual-pointer-unstable-v1 + tracing::warn!("Unknown event received from ZwlrVirtualPointerV1"); + } +} + +impl Dispatch for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &ZwpVirtualKeyboardV1, + _event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + // No events for ZwpVirtualKeyboardV1: https://wayland.app/protocols/virtual-keyboard-unstable-v1 + tracing::warn!("Unknown event received from ZwpVirtualKeyboardV1"); + } +} + +impl Dispatch for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &ZwlrVirtualPointerManagerV1, + _event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + // No events for ZwlrVirtualPointerManagerV1: https://wayland.app/protocols/wlr-virtual-pointer-unstable-v1 + tracing::warn!("Unknown event received from ZwlrVirtualPointerManagerV1"); + } +} + +impl Dispatch for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &ZwpVirtualKeyboardManagerV1, + _event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + // No events for ZwpVirtualKeyboardManagerV1: https://wayland.app/protocols/virtual-keyboard-unstable-v1 + tracing::warn!("Unknown event received from ZwpVirtualKeyboardManagerV1"); + } +} + +impl Dispatch for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &WlSeat, + event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + 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 for InputProxyServiceState { + fn event( + app_data: &mut Self, + registry: &WlRegistry, + event: Event, + _udata: &(), + _conn: &Connection, + queue_handle: &QueueHandle, + ) { + match event { + Event::Global { + name, + interface, + version, + } => match interface.as_str() { + "wl_seat" => { + let seat = registry.bind::(name, version, queue_handle, ()); + app_data.set_seat(seat); + }, + "zwlr_virtual_pointer_manager_v1" => { + let manager = registry.bind::( + name, + version, + queue_handle, + (), + ); + app_data.set_virtual_pointer_manager(manager); + }, + "zwp_virtual_keyboard_manager_v1" => { + let manager = registry.bind::( + name, + version, + queue_handle, + (), + ); + app_data.set_virtual_keyboard_manager(manager); + }, + _ => {}, + }, + Event::GlobalRemove { .. } => todo!(), + _ => todo!(), + } + } +} diff --git a/crates/cursor-move-webapp/src/server/keymap.rs b/crates/cursor-move-webapp/src/server/keymap.rs new file mode 100644 index 0000000..06d8abe --- /dev/null +++ b/crates/cursor-move-webapp/src/server/keymap.rs @@ -0,0 +1,1464 @@ +pub const KEYMAP: &str = "xkb_keymap {}"; + +pub const KEYMAP_: &str = "xkb_keymap {\ +xkb_keycodes \"(unnamed)\" {\ + minimum = 8;\ + maximum = 255;\ + = 9;\ + = 10;\ + = 11;\ + = 12;\ + = 13;\ + = 14;\ + = 15;\ + = 16;\ + = 17;\ + = 18;\ + = 19;\ + = 20;\ + = 21;\ + = 22;\ + = 23;\ + = 24;\ + = 25;\ + = 26;\ + = 27;\ + = 28;\ + = 29;\ + = 30;\ + = 31;\ + = 32;\ + = 33;\ + = 34;\ + = 35;\ + = 36;\ + = 37;\ + = 38;\ + = 39;\ + = 40;\ + = 41;\ + = 42;\ + = 43;\ + = 44;\ + = 45;\ + = 46;\ + = 47;\ + = 48;\ + = 49;\ + = 50;\ + = 51;\ + = 52;\ + = 53;\ + = 54;\ + = 55;\ + = 56;\ + = 57;\ + = 58;\ + = 59;\ + = 60;\ + = 61;\ + = 62;\ + = 63;\ + = 64;\ + = 65;\ + = 66;\ + = 67;\ + = 68;\ + = 69;\ + = 70;\ + = 71;\ + = 72;\ + = 73;\ + = 74;\ + = 75;\ + = 76;\ + = 77;\ + = 78;\ + = 79;\ + = 80;\ + = 81;\ + = 82;\ + = 83;\ + = 84;\ + = 85;\ + = 86;\ + = 87;\ + = 88;\ + = 89;\ + = 90;\ + = 91;\ + = 92;\ + = 94;\ + = 95;\ + = 96;\ + = 97;\ + = 98;\ + = 99;\ + = 100;\ + = 101;\ + = 102;\ + = 103;\ + = 104;\ + = 105;\ + = 106;\ + = 107;\ + = 108;\ + = 109;\ + = 110;\ + = 111;\ + = 112;\ + = 113;\ + = 114;\ + = 115;\ + = 116;\ + = 117;\ + = 118;\ + = 119;\ + = 120;\ + = 121;\ + = 122;\ + = 123;\ + = 124;\ + = 125;\ + = 126;\ + = 127;\ + = 128;\ + = 129;\ + = 130;\ + = 131;\ + = 132;\ + = 133;\ + = 134;\ + = 135;\ + = 136;\ + = 137;\ + = 138;\ + = 139;\ + = 140;\ + = 141;\ + = 142;\ + = 143;\ + = 144;\ + = 145;\ + = 146;\ + = 147;\ + = 148;\ + = 149;\ + = 150;\ + = 151;\ + = 152;\ + = 153;\ + = 154;\ + = 155;\ + = 156;\ + = 157;\ + = 158;\ + = 159;\ + = 160;\ + = 161;\ + = 162;\ + = 163;\ + = 164;\ + = 165;\ + = 166;\ + = 167;\ + = 168;\ + = 169;\ + = 170;\ + = 171;\ + = 172;\ + = 173;\ + = 174;\ + = 175;\ + = 176;\ + = 177;\ + = 178;\ + = 179;\ + = 180;\ + = 181;\ + = 182;\ + = 183;\ + = 184;\ + = 185;\ + = 186;\ + = 187;\ + = 188;\ + = 189;\ + = 190;\ + = 191;\ + = 192;\ + = 193;\ + = 194;\ + = 195;\ + = 196;\ + = 197;\ + = 198;\ + = 199;\ + = 200;\ + = 201;\ + = 202;\ + = 203;\ + = 204;\ + = 205;\ + = 206;\ + = 207;\ + = 208;\ + = 209;\ + = 210;\ + = 211;\ + = 212;\ + = 213;\ + = 214;\ + = 215;\ + = 216;\ + = 217;\ + = 218;\ + = 219;\ + = 220;\ + = 221;\ + = 222;\ + = 223;\ + = 224;\ + = 225;\ + = 226;\ + = 227;\ + = 228;\ + = 229;\ + = 230;\ + = 231;\ + = 232;\ + = 233;\ + = 234;\ + = 235;\ + = 236;\ + = 237;\ + = 238;\ + = 239;\ + = 240;\ + = 241;\ + = 242;\ + = 243;\ + = 244;\ + = 245;\ + = 246;\ + = 247;\ + = 248;\ + = 249;\ + = 250;\ + = 251;\ + = 252;\ + = 253;\ + = 254;\ + = 255;\ + indicator 1 = \"Caps Lock\";\ + indicator 2 = \"Num Lock\";\ + indicator 3 = \"Scroll Lock\";\ + indicator 4 = \"Compose\";\ + indicator 5 = \"Kana\";\ + indicator 6 = \"Sleep\";\ + indicator 7 = \"Suspend\";\ + indicator 8 = \"Mute\";\ + indicator 9 = \"Misc\";\ + indicator 10 = \"Mail\";\ + indicator 11 = \"Charging\";\ + indicator 12 = \"Shift Lock\";\ + indicator 13 = \"Group 2\";\ + indicator 14 = \"Mouse Keys\";\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ + alias = ;\ +};\ +\ +xkb_types \"(unnamed)\" {\ + virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;\ +\ + type \"ONE_LEVEL\" {\ + modifiers= none;\ + level_name[Level1]= \"Any\";\ + };\ + type \"TWO_LEVEL\" {\ + modifiers= Shift;\ + map[Shift]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + };\ + type \"ALPHABETIC\" {\ + modifiers= Shift+Lock;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Caps\";\ + };\ + type \"SHIFT+ALT\" {\ + modifiers= Shift+Alt;\ + map[Shift+Alt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift+Alt\";\ + };\ + type \"PC_SUPER_LEVEL2\" {\ + modifiers= Mod4;\ + map[Mod4]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Super\";\ + };\ + type \"PC_CONTROL_LEVEL2\" {\ + modifiers= Control;\ + map[Control]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Control\";\ + };\ + type \"PC_LCONTROL_LEVEL2\" {\ + modifiers= LControl;\ + map[LControl]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"LControl\";\ + };\ + type \"PC_RCONTROL_LEVEL2\" {\ + modifiers= RControl;\ + map[RControl]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"RControl\";\ + };\ + type \"PC_ALT_LEVEL2\" {\ + modifiers= Alt;\ + map[Alt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Alt\";\ + };\ + type \"PC_LALT_LEVEL2\" {\ + modifiers= LAlt;\ + map[LAlt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"LAlt\";\ + };\ + type \"PC_RALT_LEVEL2\" {\ + modifiers= RAlt;\ + map[RAlt]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"RAlt\";\ + };\ + type \"CTRL+ALT\" {\ + modifiers= Shift+Control+Alt+LevelThree;\ + map[Shift]= Level2;\ + preserve[Shift]= Shift;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + preserve[Shift+LevelThree]= Shift;\ + map[Control+Alt]= Level5;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"Ctrl+Alt\";\ + };\ + type \"LOCAL_EIGHT_LEVEL\" {\ + modifiers= Shift+Lock+Control+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level4;\ + map[Control]= Level5;\ + map[Shift+Lock+Control]= Level5;\ + map[Shift+Control]= Level6;\ + map[Lock+Control]= Level6;\ + map[Control+LevelThree]= Level7;\ + map[Shift+Lock+Control+LevelThree]= Level7;\ + map[Shift+Control+LevelThree]= Level8;\ + map[Lock+Control+LevelThree]= Level8;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Level3\";\ + level_name[Level4]= \"Shift Level3\";\ + level_name[Level5]= \"Ctrl\";\ + level_name[Level6]= \"Shift Ctrl\";\ + level_name[Level7]= \"Level3 Ctrl\";\ + level_name[Level8]= \"Shift Level3 Ctrl\";\ + };\ + type \"THREE_LEVEL\" {\ + modifiers= Shift+LevelThree;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Level3\";\ + };\ + type \"EIGHT_LEVEL\" {\ + modifiers= Shift+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_ALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level4;\ + map[Shift+Lock+LevelThree]= Level3;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + map[Lock+LevelFive]= Level6;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[Lock+LevelThree+LevelFive]= Level8;\ + map[Shift+Lock+LevelThree+LevelFive]= Level7;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_LEVEL_FIVE_LOCK\" {\ + modifiers= Shift+Lock+NumLock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + preserve[Shift+LevelFive]= Shift;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[NumLock]= Level5;\ + map[Shift+NumLock]= Level6;\ + preserve[Shift+NumLock]= Shift;\ + map[NumLock+LevelThree]= Level7;\ + map[Shift+NumLock+LevelThree]= Level8;\ + map[Shift+NumLock+LevelFive]= Level2;\ + map[NumLock+LevelThree+LevelFive]= Level3;\ + map[Shift+NumLock+LevelThree+LevelFive]= Level4;\ + map[Shift+Lock]= Level2;\ + map[Lock+LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level4;\ + map[Lock+LevelFive]= Level5;\ + map[Shift+Lock+LevelFive]= Level6;\ + preserve[Shift+Lock+LevelFive]= Shift;\ + map[Lock+LevelThree+LevelFive]= Level7;\ + map[Shift+Lock+LevelThree+LevelFive]= Level8;\ + map[Lock+NumLock]= Level5;\ + map[Shift+Lock+NumLock]= Level6;\ + preserve[Shift+Lock+NumLock]= Shift;\ + map[Lock+NumLock+LevelThree]= Level7;\ + map[Shift+Lock+NumLock+LevelThree]= Level8;\ + map[Shift+Lock+NumLock+LevelFive]= Level2;\ + map[Lock+NumLock+LevelThree+LevelFive]= Level3;\ + map[Shift+Lock+NumLock+LevelThree+LevelFive]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK\" {\ + modifiers= Shift+Lock+NumLock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + preserve[Shift+LevelFive]= Shift;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[NumLock]= Level5;\ + map[Shift+NumLock]= Level6;\ + preserve[Shift+NumLock]= Shift;\ + map[NumLock+LevelThree]= Level7;\ + map[Shift+NumLock+LevelThree]= Level8;\ + map[Shift+NumLock+LevelFive]= Level2;\ + map[NumLock+LevelThree+LevelFive]= Level3;\ + map[Shift+NumLock+LevelThree+LevelFive]= Level4;\ + map[Lock]= Level2;\ + map[Lock+LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level4;\ + map[Lock+LevelFive]= Level5;\ + map[Shift+Lock+LevelFive]= Level6;\ + map[Lock+LevelThree+LevelFive]= Level7;\ + map[Shift+Lock+LevelThree+LevelFive]= Level8;\ + map[Lock+NumLock]= Level5;\ + map[Shift+Lock+NumLock]= Level6;\ + map[Lock+NumLock+LevelThree]= Level7;\ + map[Shift+Lock+NumLock+LevelThree]= Level8;\ + map[Lock+NumLock+LevelFive]= Level2;\ + map[Lock+NumLock+LevelThree+LevelFive]= Level4;\ + map[Shift+Lock+NumLock+LevelThree+LevelFive]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"EIGHT_LEVEL_SEMIALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree+LevelFive;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level3;\ + preserve[Lock+LevelThree]= Lock;\ + map[Shift+Lock+LevelThree]= Level4;\ + preserve[Shift+Lock+LevelThree]= Lock;\ + map[LevelFive]= Level5;\ + map[Shift+LevelFive]= Level6;\ + map[Lock+LevelFive]= Level6;\ + preserve[Lock+LevelFive]= Lock;\ + map[Shift+Lock+LevelFive]= Level6;\ + preserve[Shift+Lock+LevelFive]= Lock;\ + map[LevelThree+LevelFive]= Level7;\ + map[Shift+LevelThree+LevelFive]= Level8;\ + map[Lock+LevelThree+LevelFive]= Level7;\ + preserve[Lock+LevelThree+LevelFive]= Lock;\ + map[Shift+Lock+LevelThree+LevelFive]= Level8;\ + preserve[Shift+Lock+LevelThree+LevelFive]= Lock;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"X\";\ + level_name[Level6]= \"X Shift\";\ + level_name[Level7]= \"X Alt Base\";\ + level_name[Level8]= \"X Shift Alt\";\ + };\ + type \"FOUR_LEVEL\" {\ + modifiers= Shift+LevelThree;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_ALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level4;\ + map[Shift+Lock+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_SEMIALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level3;\ + preserve[Lock+LevelThree]= Lock;\ + map[Shift+Lock+LevelThree]= Level4;\ + preserve[Shift+Lock+LevelThree]= Lock;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_MIXED_KEYPAD\" {\ + modifiers= Shift+NumLock+LevelThree;\ + map[NumLock]= Level2;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[NumLock+LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Shift+NumLock+LevelThree]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Number\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + };\ + type \"FOUR_LEVEL_X\" {\ + modifiers= Shift+Control+Alt+LevelThree;\ + map[LevelThree]= Level2;\ + map[Shift+LevelThree]= Level3;\ + map[Control+Alt]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Alt Base\";\ + level_name[Level3]= \"Shift Alt\";\ + level_name[Level4]= \"Ctrl+Alt\";\ + };\ + type \"SEPARATE_CAPS_AND_SHIFT_ALPHABETIC\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[Lock]= Level4;\ + preserve[Lock]= Lock;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock+LevelThree]= Level3;\ + preserve[Lock+LevelThree]= Lock;\ + map[Shift+Lock+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"AltGr Base\";\ + level_name[Level4]= \"Shift AltGr\";\ + };\ + type \"FOUR_LEVEL_PLUS_LOCK\" {\ + modifiers= Shift+Lock+LevelThree;\ + map[Shift]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[Lock]= Level5;\ + map[Shift+Lock]= Level2;\ + map[Lock+LevelThree]= Level3;\ + map[Shift+Lock+LevelThree]= Level4;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Shift\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Shift Alt\";\ + level_name[Level5]= \"Lock\";\ + };\ + type \"KEYPAD\" {\ + modifiers= Shift+NumLock;\ + map[Shift]= Level2;\ + map[NumLock]= Level2;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Number\";\ + };\ + type \"FOUR_LEVEL_KEYPAD\" {\ + modifiers= Shift+NumLock+LevelThree;\ + map[Shift]= Level2;\ + map[NumLock]= Level2;\ + map[LevelThree]= Level3;\ + map[Shift+LevelThree]= Level4;\ + map[NumLock+LevelThree]= Level4;\ + map[Shift+NumLock+LevelThree]= Level3;\ + level_name[Level1]= \"Base\";\ + level_name[Level2]= \"Number\";\ + level_name[Level3]= \"Alt Base\";\ + level_name[Level4]= \"Alt Number\";\ + };\ +};\ +\ +xkb_compatibility \"(unnamed)\" {\ + virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;\ +\ + interpret.useModMapMods= AnyLevel;\ + interpret.repeat= False;\ + interpret ISO_Level2_Latch+Exactly(Shift) {\ + useModMapMods=level1;\ + action= LatchMods(modifiers=Shift,clearLocks,latchToLock);\ + };\ + interpret Shift_Lock+AnyOf(Shift+Lock) {\ + action= LockMods(modifiers=Shift);\ + };\ + interpret Num_Lock+AnyOf(all) {\ + virtualModifier= NumLock;\ + action= LockMods(modifiers=NumLock);\ + };\ + interpret ISO_Level3_Shift+AnyOf(all) {\ + virtualModifier= LevelThree;\ + useModMapMods=level1;\ + action= SetMods(modifiers=LevelThree,clearLocks);\ + };\ + interpret ISO_Level3_Latch+AnyOf(all) {\ + virtualModifier= LevelThree;\ + useModMapMods=level1;\ + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);\ + };\ + interpret ISO_Level3_Lock+AnyOf(all) {\ + virtualModifier= LevelThree;\ + useModMapMods=level1;\ + action= LockMods(modifiers=LevelThree);\ + };\ + interpret Alt_L+AnyOf(all) {\ + virtualModifier= Alt;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Alt_R+AnyOf(all) {\ + virtualModifier= Alt;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Meta_L+AnyOf(all) {\ + virtualModifier= Meta;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Meta_R+AnyOf(all) {\ + virtualModifier= Meta;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Super_L+AnyOf(all) {\ + virtualModifier= Super;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Super_R+AnyOf(all) {\ + virtualModifier= Super;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Hyper_L+AnyOf(all) {\ + virtualModifier= Hyper;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Hyper_R+AnyOf(all) {\ + virtualModifier= Hyper;\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + interpret Scroll_Lock+AnyOf(all) {\ + virtualModifier= ScrollLock;\ + action= LockMods(modifiers=modMapMods);\ + };\ + interpret ISO_Level5_Shift+AnyOf(all) {\ + virtualModifier= LevelFive;\ + useModMapMods=level1;\ + action= SetMods(modifiers=LevelFive,clearLocks);\ + };\ + interpret ISO_Level5_Latch+AnyOf(all) {\ + virtualModifier= LevelFive;\ + useModMapMods=level1;\ + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);\ + };\ + interpret ISO_Level5_Lock+AnyOf(all) {\ + virtualModifier= LevelFive;\ + useModMapMods=level1;\ + action= LockMods(modifiers=LevelFive);\ + };\ + interpret Mode_switch+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= SetGroup(group=+1);\ + };\ + interpret ISO_Level3_Shift+AnyOfOrNone(all) {\ + action= SetMods(modifiers=LevelThree,clearLocks);\ + };\ + interpret ISO_Level3_Latch+AnyOfOrNone(all) {\ + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);\ + };\ + interpret ISO_Level3_Lock+AnyOfOrNone(all) {\ + action= LockMods(modifiers=LevelThree);\ + };\ + interpret ISO_Group_Latch+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= LatchGroup(group=2);\ + };\ + interpret ISO_Next_Group+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= LockGroup(group=+1);\ + };\ + interpret ISO_Prev_Group+AnyOfOrNone(all) {\ + virtualModifier= AltGr;\ + useModMapMods=level1;\ + action= LockGroup(group=-1);\ + };\ + interpret ISO_First_Group+AnyOfOrNone(all) {\ + action= LockGroup(group=1);\ + };\ + interpret ISO_Last_Group+AnyOfOrNone(all) {\ + action= LockGroup(group=2);\ + };\ + interpret KP_1+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+1);\ + };\ + interpret KP_End+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+1);\ + };\ + interpret KP_2+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=+1);\ + };\ + interpret KP_Down+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=+1);\ + };\ + interpret KP_3+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+1);\ + };\ + interpret KP_Next+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+1);\ + };\ + interpret KP_4+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+0);\ + };\ + interpret KP_Left+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+0);\ + };\ + interpret KP_6+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+0);\ + };\ + interpret KP_Right+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+0);\ + };\ + interpret KP_7+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=-1);\ + };\ + interpret KP_Home+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=-1);\ + };\ + interpret KP_8+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=-1);\ + };\ + interpret KP_Up+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+0,y=-1);\ + };\ + interpret KP_9+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=-1);\ + };\ + interpret KP_Prior+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=-1);\ + };\ + interpret KP_5+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default);\ + };\ + interpret KP_Begin+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default);\ + };\ + interpret KP_F2+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=1);\ + };\ + interpret KP_Divide+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=1);\ + };\ + interpret KP_F3+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=2);\ + };\ + interpret KP_Multiply+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=2);\ + };\ + interpret KP_F4+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=3);\ + };\ + interpret KP_Subtract+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=3);\ + };\ + interpret KP_Separator+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default,count=2);\ + };\ + interpret KP_Add+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default,count=2);\ + };\ + interpret KP_0+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=lock);\ + };\ + interpret KP_Insert+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=lock);\ + };\ + interpret KP_Decimal+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=unlock);\ + };\ + interpret KP_Delete+AnyOfOrNone(all) {\ + repeat= True;\ + action= LockPtrBtn(button=default,affect=unlock);\ + };\ + interpret F25+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=1);\ + };\ + interpret F26+AnyOfOrNone(all) {\ + repeat= True;\ + action= SetPtrDflt(affect=button,button=2);\ + };\ + interpret F27+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=-1);\ + };\ + interpret F29+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=-1);\ + };\ + interpret F31+AnyOfOrNone(all) {\ + repeat= True;\ + action= PtrBtn(button=default);\ + };\ + interpret F33+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=-1,y=+1);\ + };\ + interpret F35+AnyOfOrNone(all) {\ + repeat= True;\ + action= MovePtr(x=+1,y=+1);\ + };\ + interpret Pointer_Button_Dflt+AnyOfOrNone(all) {\ + action= PtrBtn(button=default);\ + };\ + interpret Pointer_Button1+AnyOfOrNone(all) {\ + action= PtrBtn(button=1);\ + };\ + interpret Pointer_Button2+AnyOfOrNone(all) {\ + action= PtrBtn(button=2);\ + };\ + interpret Pointer_Button3+AnyOfOrNone(all) {\ + action= PtrBtn(button=3);\ + };\ + interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {\ + action= PtrBtn(button=default,count=2);\ + };\ + interpret Pointer_DblClick1+AnyOfOrNone(all) {\ + action= PtrBtn(button=1,count=2);\ + };\ + interpret Pointer_DblClick2+AnyOfOrNone(all) {\ + action= PtrBtn(button=2,count=2);\ + };\ + interpret Pointer_DblClick3+AnyOfOrNone(all) {\ + action= PtrBtn(button=3,count=2);\ + };\ + interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=default);\ + };\ + interpret Pointer_Drag1+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=1);\ + };\ + interpret Pointer_Drag2+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=2);\ + };\ + interpret Pointer_Drag3+AnyOfOrNone(all) {\ + action= LockPtrBtn(button=3);\ + };\ + interpret Pointer_EnableKeys+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeys);\ + };\ + interpret Pointer_Accelerate+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeysAccel);\ + };\ + interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {\ + action= SetPtrDflt(affect=button,button=+1);\ + };\ + interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {\ + action= SetPtrDflt(affect=button,button=-1);\ + };\ + interpret AccessX_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=AccessXKeys);\ + };\ + interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=AccessXFeedback);\ + };\ + interpret RepeatKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=RepeatKeys);\ + };\ + interpret SlowKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=SlowKeys);\ + };\ + interpret BounceKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=BounceKeys);\ + };\ + interpret StickyKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=StickyKeys);\ + };\ + interpret MouseKeys_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeys);\ + };\ + interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=MouseKeysAccel);\ + };\ + interpret Overlay1_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=none);\ + };\ + interpret Overlay2_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=none);\ + };\ + interpret AudibleBell_Enable+AnyOfOrNone(all) {\ + action= LockControls(controls=AudibleBell);\ + };\ + interpret Terminate_Server+AnyOfOrNone(all) {\ + action= Terminate();\ + };\ + interpret Alt_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Alt,clearLocks);\ + };\ + interpret Alt_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Alt,clearLocks);\ + };\ + interpret Meta_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Meta,clearLocks);\ + };\ + interpret Meta_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Meta,clearLocks);\ + };\ + interpret Super_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Super,clearLocks);\ + };\ + interpret Super_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Super,clearLocks);\ + };\ + interpret Hyper_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Hyper,clearLocks);\ + };\ + interpret Hyper_R+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Hyper,clearLocks);\ + };\ + interpret Shift_L+AnyOfOrNone(all) {\ + action= SetMods(modifiers=Shift,clearLocks);\ + };\ + interpret XF86Switch_VT_1+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=1,!same);\ + };\ + interpret XF86Switch_VT_2+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=2,!same);\ + };\ + interpret XF86Switch_VT_3+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=3,!same);\ + };\ + interpret XF86Switch_VT_4+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=4,!same);\ + };\ + interpret XF86Switch_VT_5+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=5,!same);\ + };\ + interpret XF86Switch_VT_6+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=6,!same);\ + };\ + interpret XF86Switch_VT_7+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=7,!same);\ + };\ + interpret XF86Switch_VT_8+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=8,!same);\ + };\ + interpret XF86Switch_VT_9+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=9,!same);\ + };\ + interpret XF86Switch_VT_10+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=10,!same);\ + };\ + interpret XF86Switch_VT_11+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=11,!same);\ + };\ + interpret XF86Switch_VT_12+AnyOfOrNone(all) {\ + repeat= True;\ + action= SwitchScreen(screen=12,!same);\ + };\ + interpret XF86LogGrabInfo+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);\ + };\ + interpret XF86LogWindowTree+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);\ + };\ + interpret XF86Next_VMode+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);\ + };\ + interpret XF86Prev_VMode+AnyOfOrNone(all) {\ + repeat= True;\ + action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);\ + };\ + interpret ISO_Level5_Shift+AnyOfOrNone(all) {\ + action= SetMods(modifiers=LevelFive,clearLocks);\ + };\ + interpret ISO_Level5_Latch+AnyOfOrNone(all) {\ + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);\ + };\ + interpret ISO_Level5_Lock+AnyOfOrNone(all) {\ + action= LockMods(modifiers=LevelFive);\ + };\ + interpret Caps_Lock+AnyOfOrNone(all) {\ + action= LockMods(modifiers=Lock);\ + };\ + interpret Any+Exactly(Lock) {\ + action= LockMods(modifiers=Lock);\ + };\ + interpret Any+AnyOf(all) {\ + action= SetMods(modifiers=modMapMods,clearLocks);\ + };\ + indicator \"Caps Lock\" {\ + whichModState= locked;\ + modifiers= Lock;\ + };\ + indicator \"Num Lock\" {\ + whichModState= locked;\ + modifiers= NumLock;\ + };\ + indicator \"Scroll Lock\" {\ + whichModState= locked;\ + modifiers= ScrollLock;\ + };\ + indicator \"Shift Lock\" {\ + whichModState= locked;\ + modifiers= Shift;\ + };\ + indicator \"Group 2\" {\ + groups= 0xfe;\ + };\ + indicator \"Mouse Keys\" {\ + controls= MouseKeys;\ + };\ +};\ +\ +xkb_symbols \"(unnamed)\" {\ + name[group1]=\"English (US)\";\ +\ + key { [ Escape ] };\ + key { [ 1, exclam ] };\ + key { [ 2, at ] };\ + key { [ 3, numbersign ] };\ + key { [ 4, dollar ] };\ + key { [ 5, percent ] };\ + key { [ 6, asciicircum ] };\ + key { [ 7, ampersand ] };\ + key { [ 8, asterisk ] };\ + key { [ 9, parenleft ] };\ + key { [ 0, parenright ] };\ + key { [ minus, underscore ] };\ + key { [ equal, plus ] };\ + key { [ BackSpace, BackSpace ] };\ + key { [ Tab, ISO_Left_Tab ] };\ + key { [ q, Q, 1 ] };\ + key { [ w, W, 2 ] };\ + key { [ e, E, 3 ] };\ + key { [ r, R, 4 ] };\ + key { [ t, T, 5 ] };\ + key { [ y, Y, 6 ] };\ + key { [ u, U, 7 ] };\ + key { [ i, I, 8 ] };\ + key { [ o, O, 9 ] };\ + key { [ p, P, 0 ] };\ + key { [ bracketleft, braceleft ] };\ + key { [ bracketright, braceright ] };\ + key { [ Return ] };\ + key { [ Control_L ] };\ + key { [ a, A, minus ] };\ + key { [ s, S, at ] };\ + key { [ d, D, asterisk ] };\ + key { [ f, F, asciicircum ] };\ + key { [ g, G, colon ] };\ + key { [ h, H, semicolon ] };\ + key { [ j, J, parenleft ] };\ + key { [ k, K, parenright ] };\ + key { [ l, L, asciitilde ] };\ + key { [ semicolon, colon ] };\ + key { [ apostrophe, quotedbl ] };\ + key { [ grave, asciitilde ] };\ + key { [ Shift_L ] };\ + key { [ backslash, bar ] };\ + key { [ z, Z, slash ] };\ + key { [ x, X, apostrophe ] };\ + key { [ c, C, quotedbl ] };\ + key { [ v, V, plus ] };\ + key { [ b, B, equal ] };\ + key { [ n, N, question ] };\ + key { [ m, M, exclam ] };\ + key { [ comma, less, backslash] };\ + key { [ period, greater, bar ] };\ + key { [ slash, question ] };\ + key { [ Shift_R ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]\ + };\ + key { [ Alt_L, Meta_L ] };\ + key { [ space ] };\ + key { [ Caps_Lock ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]\ + };\ + key { [ Num_Lock ] };\ + key { [ Scroll_Lock ] };\ + key { [ KP_Home, KP_7 ] };\ + key { [ KP_Up, KP_8 ] };\ + key { [ KP_Prior, KP_9 ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]\ + };\ + key { [ KP_Left, KP_4 ] };\ + key { [ KP_Begin, KP_5 ] };\ + key { [ KP_Right, KP_6 ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]\ + };\ + key { [ KP_End, KP_1 ] };\ + key { [ KP_Down, KP_2 ] };\ + key { [ KP_Next, KP_3 ] };\ + key { [ KP_Insert, KP_0 ] };\ + key { [ KP_Delete, KP_Decimal ] };\ + key { [ ISO_Level3_Shift ] };\ + key { [ less, greater, bar, brokenbar ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]\ + };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]\ + };\ + key { [ Katakana ] };\ + key { [ Hiragana ] };\ + key { [ Henkan_Mode ] };\ + key { [ Hiragana_Katakana ] };\ + key { [ Muhenkan ] };\ + key { [ KP_Enter ] };\ + key { [ Control_R ] };\ + key {\ + type= \"CTRL+ALT\",\ + symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]\ + };\ + key {\ + type= \"PC_ALT_LEVEL2\",\ + symbols[Group1]= [ Print, Sys_Req ]\ + };\ + key {\ + type= \"TWO_LEVEL\",\ + symbols[Group1]= [ Alt_R, Meta_R ]\ + };\ + key { [ Linefeed ] };\ + key { [ Home ] };\ + key { [ Up ] };\ + key { [ Prior ] };\ + key { [ Left ] };\ + key { [ Right ] };\ + key { [ End ] };\ + key { [ Down ] };\ + key { [ Next ] };\ + key { [ Insert ] };\ + key { [ Delete ] };\ + key { [ XF86AudioMute ] };\ + key { [ XF86AudioLowerVolume ] };\ + key { [ XF86AudioRaiseVolume ] };\ + key { [ XF86PowerOff ] };\ + key { [ KP_Equal ] };\ + key { [ plusminus ] };\ + key {\ + type= \"PC_CONTROL_LEVEL2\",\ + symbols[Group1]= [ Pause, Break ]\ + };\ + key { [ XF86LaunchA ] };\ + key { [ KP_Decimal, KP_Decimal ] };\ + key { [ Hangul ] };\ + key { [ Hangul_Hanja ] };\ + key { [ Super_L ] };\ + key { [ Super_R ] };\ + key { [ Menu ] };\ + key { [ Cancel ] };\ + key { [ Redo ] };\ + key { [ SunProps ] };\ + key { [ Undo ] };\ + key { [ SunFront ] };\ + key { [ XF86Copy ] };\ + key { [ XF86Open ] };\ + key { [ XF86Paste ] };\ + key { [ Find ] };\ + key { [ XF86Cut ] };\ + key { [ Help ] };\ + key { [ XF86MenuKB ] };\ + key { [ XF86Calculator ] };\ + key { [ XF86Sleep ] };\ + key { [ XF86WakeUp ] };\ + key { [ XF86Explorer ] };\ + key { [ XF86Send ] };\ + key { [ XF86Xfer ] };\ + key { [ XF86Launch1 ] };\ + key { [ XF86Launch2 ] };\ + key { [ XF86WWW ] };\ + key { [ XF86DOS ] };\ + key { [ XF86ScreenSaver ] };\ + key { [ XF86RotateWindows ] };\ + key { [ XF86TaskPane ] };\ + key { [ XF86Mail ] };\ + key { [ XF86Favorites ] };\ + key { [ XF86MyComputer ] };\ + key { [ XF86Back ] };\ + key { [ XF86Forward ] };\ + key { [ XF86Eject ] };\ + key { [ XF86Eject, XF86Eject ] };\ + key { [ XF86AudioNext ] };\ + key { [ XF86AudioPlay, XF86AudioPause ] };\ + key { [ XF86AudioPrev ] };\ + key { [ XF86AudioStop, XF86Eject ] };\ + key { [ XF86AudioRecord ] };\ + key { [ XF86AudioRewind ] };\ + key { [ XF86Phone ] };\ + key { [ XF86Tools ] };\ + key { [ XF86HomePage ] };\ + key { [ XF86Reload ] };\ + key { [ XF86Close ] };\ + key { [ XF86ScrollUp ] };\ + key { [ XF86ScrollDown ] };\ + key { [ parenleft ] };\ + key { [ parenright ] };\ + key { [ XF86New ] };\ + key { [ Redo ] };\ + key { [ XF86Tools ] };\ + key { [ XF86Launch5 ] };\ + key { [ XF86Launch6 ] };\ + key { [ XF86Launch7 ] };\ + key { [ XF86Launch8 ] };\ + key { [ XF86Launch9 ] };\ + key { [ XF86AudioMicMute ] };\ + key { [ XF86TouchpadToggle ] };\ + key { [ XF86TouchpadOn ] };\ + key { [ XF86TouchpadOff ] };\ + key { [ Mode_switch ] };\ + key { [ NoSymbol, Alt_L ] };\ + key { [ NoSymbol, Meta_L ] };\ + key { [ NoSymbol, Super_L ] };\ + key { [ NoSymbol, Hyper_L ] };\ + key { [ XF86AudioPlay ] };\ + key { [ XF86AudioPause ] };\ + key { [ XF86Launch3 ] };\ + key { [ XF86Launch4 ] };\ + key { [ XF86LaunchB ] };\ + key { [ XF86Suspend ] };\ + key { [ XF86Close ] };\ + key { [ XF86AudioPlay ] };\ + key { [ XF86AudioForward ] };\ + key { [ Print ] };\ + key { [ XF86WebCam ] };\ + key { [ XF86AudioPreset ] };\ + key { [ XF86Mail ] };\ + key { [ XF86Messenger ] };\ + key { [ XF86Search ] };\ + key { [ XF86Go ] };\ + key { [ XF86Finance ] };\ + key { [ XF86Game ] };\ + key { [ XF86Shop ] };\ + key { [ Cancel ] };\ + key { [ XF86MonBrightnessDown ] };\ + key { [ XF86MonBrightnessUp ] };\ + key { [ XF86AudioMedia ] };\ + key { [ XF86Display ] };\ + key { [ XF86KbdLightOnOff ] };\ + key { [ XF86KbdBrightnessDown ] };\ + key { [ XF86KbdBrightnessUp ] };\ + key { [ XF86Send ] };\ + key { [ XF86Reply ] };\ + key { [ XF86MailForward ] };\ + key { [ XF86Save ] };\ + key { [ XF86Documents ] };\ + key { [ XF86Battery ] };\ + key { [ XF86Bluetooth ] };\ + key { [ XF86WLAN ] };\ + key { [ XF86UWB ] };\ + key { [ XF86WWAN ] };\ + key { [ XF86RFKill ] };\ + modifier_map Shift { , };\ + modifier_map Lock { };\ + modifier_map Control { , };\ + modifier_map Mod1 { , , };\ + modifier_map Mod2 { };\ + modifier_map Mod4 { , , , };\ + modifier_map Mod5 { , };\ +};\ +\ +};\ +"; diff --git a/crates/cursor-move-webapp/src/server/mod.rs b/crates/cursor-move-webapp/src/server/mod.rs index 201f6dd..592112b 100644 --- a/crates/cursor-move-webapp/src/server/mod.rs +++ b/crates/cursor-move-webapp/src/server/mod.rs @@ -1 +1,2 @@ -pub mod mouse_service; +pub mod input_proxy_service; +pub mod keymap; diff --git a/crates/cursor-move-webapp/src/server/mouse_service.rs b/crates/cursor-move-webapp/src/server/mouse_service.rs deleted file mode 100644 index 85d714b..0000000 --- a/crates/cursor-move-webapp/src/server/mouse_service.rs +++ /dev/null @@ -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>, -} - -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 for MouseService { - fn from_ref(state: &FullstackContext) -> Self { - state.extension::().unwrap() - } -} - -pub struct InputProxy { - state: InputProxyServiceState, - event_queue: EventQueue, -} - -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, -} - -impl Dispatch for InputProxyServiceState { - fn event( - _state: &mut Self, - _proxy: &ZwlrVirtualPointerV1, - _event: ::Event, - _data: &(), - _conn: &Connection, - _qhandle: &QueueHandle, - ) { - tracing::info!("VPointerData"); - } -} - -impl Dispatch for InputProxyServiceState { - fn event( - _state: &mut Self, - _proxy: &ZwlrVirtualPointerManagerV1, - _event: ::Event, - _data: &(), - _conn: &Connection, - _qhandle: &QueueHandle, - ) { - tracing::info!("ZwlrEvent"); - } -} - -impl Dispatch for InputProxyServiceState { - fn event( - app_data: &mut Self, - registry: &wl_registry::WlRegistry, - event: wl_registry::Event, - _udata: &(), - _conn: &Connection, - queue_handle: &QueueHandle, - ) { - 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::( - name, - version, - queue_handle, - (), - ); - - let pointer = manager.create_virtual_pointer(None, queue_handle, ()); - - println!("Virtual pointer manager created"); - pointer - }); - } - } -} diff --git a/flake.nix b/flake.nix index fc22963..f00ac9b 100644 --- a/flake.nix +++ b/flake.nix @@ -65,52 +65,62 @@ fnx.targets.wasm32-unknown-unknown.latest.rust-std ]; + wasmBindgen = + with pkgs; + rustPlatform.buildRustPackage rec { + pname = "wasm-bindgen-cli"; + version = "0.2.114"; - wasmBindgen = with pkgs; rustPlatform.buildRustPackage rec { - pname = "wasm-bindgen-cli"; - version = "0.2.114"; + src = fetchCrate { + pname = pname; + version = version; + hash = "sha256-xrCym+rFY6EUQFWyWl6OPA+LtftpUAE5pIaElAIVqW0="; + }; - src = fetchCrate { - pname = pname; - version = version; - hash = "sha256-xrCym+rFY6EUQFWyWl6OPA+LtftpUAE5pIaElAIVqW0="; + cargoDeps = rustPlatform.fetchCargoVendor { + inherit src; + inherit (src) pname version; + hash = "sha256-Z8+dUXPQq7S+Q7DWNr2Y9d8GMuEdSnq00quUR0wDNPM="; + }; + + nativeBuildInputs = [ pkg-config ]; + + buildInputs = [ + openssl + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + curl + ]; + + nativeCheckInputs = [ nodejs_latest ]; + + # tests require it to be ran in the wasm-bindgen monorepo + doCheck = false; }; - - cargoDeps = rustPlatform.fetchCargoVendor { - inherit src; - inherit (src) pname version; - hash = "sha256-Z8+dUXPQq7S+Q7DWNr2Y9d8GMuEdSnq00quUR0wDNPM="; - }; - - nativeBuildInputs = [ pkg-config ]; - - buildInputs = [ - openssl - ] - ++ lib.optionals stdenv.hostPlatform.isDarwin [ - curl - ]; - - nativeCheckInputs = [ nodejs_latest ]; - - # tests require it to be ran in the wasm-bindgen monorepo - doCheck = false; - }; in { name = "my-project"; + env = { + LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; + }; + packages = [ pkgs.dioxus-cli pkgs.cargo-expand pkgs.cargo-deny pkgs.cargo-nextest pkgs.typos - pkgs.binaryen #wasm-opt + pkgs.binaryen # wasm-opt rustToolchain fnx.rust-analyzer wasmBindgen + pkgs.libxkbcommon + + pkgs.clang + pkgs.llvmPackages.libclang + ]; scripts.checkall.exec = ''