From 5f89601ef2d2bbdc85678ddfaaef8d374504a00a Mon Sep 17 00:00:00 2001 From: Mona Mayrhofer Date: Tue, 3 Mar 2026 14:11:50 +0100 Subject: [PATCH] ime for text input --- .../jh41lavwqi3qdwypiv713yipf3dxi3nx-source | 1 - .../npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source | 1 - .../pg23i5nvj8wg12bb657b2r4s5kixjqic-source | 1 + .../zgbjmrhgvd8a42nyi1jck6v98gzvvql0-source | 1 + ...e-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa | 2 +- ...5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc | 30 +- .../src/components/mouse_area.rs | 65 +- .../src/server/input_proxy_service.rs | 159 ++++- .../cursor-move-webapp/src/server/keymap.rs | 568 ++++++++++++++++++ flake.nix | 4 - 10 files changed, 784 insertions(+), 48 deletions(-) delete mode 120000 .direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source delete mode 120000 .direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source create mode 120000 .direnv/flake-inputs/pg23i5nvj8wg12bb657b2r4s5kixjqic-source create mode 120000 .direnv/flake-inputs/zgbjmrhgvd8a42nyi1jck6v98gzvvql0-source diff --git a/.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source b/.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source deleted file mode 120000 index 491c89e..0000000 --- a/.direnv/flake-inputs/jh41lavwqi3qdwypiv713yipf3dxi3nx-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/jh41lavwqi3qdwypiv713yipf3dxi3nx-source \ No newline at end of file diff --git a/.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source b/.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source deleted file mode 120000 index d0f2aea..0000000 --- a/.direnv/flake-inputs/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source +++ /dev/null @@ -1 +0,0 @@ -/nix/store/npfcdcbsyzm1cnh0jqqn3jf2wx49hgwp-source \ No newline at end of file diff --git a/.direnv/flake-inputs/pg23i5nvj8wg12bb657b2r4s5kixjqic-source b/.direnv/flake-inputs/pg23i5nvj8wg12bb657b2r4s5kixjqic-source new file mode 120000 index 0000000..1d1d25b --- /dev/null +++ b/.direnv/flake-inputs/pg23i5nvj8wg12bb657b2r4s5kixjqic-source @@ -0,0 +1 @@ +/nix/store/pg23i5nvj8wg12bb657b2r4s5kixjqic-source \ No newline at end of file diff --git a/.direnv/flake-inputs/zgbjmrhgvd8a42nyi1jck6v98gzvvql0-source b/.direnv/flake-inputs/zgbjmrhgvd8a42nyi1jck6v98gzvvql0-source new file mode 120000 index 0000000..2590ae8 --- /dev/null +++ b/.direnv/flake-inputs/zgbjmrhgvd8a42nyi1jck6v98gzvvql0-source @@ -0,0 +1 @@ +/nix/store/zgbjmrhgvd8a42nyi1jck6v98gzvvql0-source \ No newline at end of file diff --git a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa index e2924f3..aa8f82b 120000 --- a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa +++ b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa @@ -1 +1 @@ -/nix/store/mq0i12vdknm9wx5w5n7md59xn1z15ag3-my-project-env \ No newline at end of file +/nix/store/xa13w7i8cjcs7bhc21lczj9qyi40ay3s-my-project-env \ No newline at end of file diff --git a/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc b/.direnv/flake-profile-a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa.rc index 6c7d79b..3714305 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/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile' +DEVENV_PROFILE='/nix/store/3niz0g2hddnbba4bcql8s8arc6mmna5m-devenv-profile' export DEVENV_PROFILE DEVENV_ROOT='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app' export DEVENV_ROOT @@ -31,7 +31,7 @@ export DEVENV_TASKS DEVENV_TASK_FILE='/nix/store/r04g3f96h64qk8xzpm7z0vd17w5b494d-tasks.json' export DEVENV_TASK_FILE HOSTTYPE='x86_64' -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' +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' export HOST_PATH IFS=' ' @@ -53,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=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' +NIX_CFLAGS_COMPILE=' -frandom-seed=xa13w7i8cj -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-dev/include -isystem /nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/include -isystem /nix/store/vi6gkki39fqlm3fhvrgkgfpb2b4f4x89-libxkbcommon-1.11.0-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/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' +NIX_LDFLAGS='-rpath /home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/lib -L/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/lib -L/nix/store/4jp1vkr9gj5n3zbpp2xvkp8n3g56lpv0-binaryen-125/lib -L/nix/store/fwhb4yynphdqiqb48mlh0v5wlwz50s22-rust-mixed/lib -L/nix/store/ni6pwnn5cg4mwm2fkmqrm2bzjvj16b64-libxkbcommon-1.11.0/lib' export NIX_LDFLAGS NIX_NO_SELF_RPATH='1' NIX_PKG_CONFIG_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu='1' @@ -76,7 +76,7 @@ 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/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' +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/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' export PATH PC_CONFIG_FILES='/nix/store/f90qf91rzv18zpk3y4yf5saigawqw9nm-process-compose.yaml' export PC_CONFIG_FILES @@ -101,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/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' +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/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2/share:/nix/store/c2p7haf4zzkbrir9zs662r68c5dmylbq-patchelf-0.15.2/share' export XDG_DATA_DIRS __structuredAttrs='' export __structuredAttrs @@ -151,8 +151,8 @@ export dontAddDisableDepTrack declare -a envBuildBuildHooks=() declare -a envBuildHostHooks=() declare -a envBuildTargetHooks=() -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 envHostHostHooks=('pkgConfigWrapper_addPkgConfigPath' 'ccWrapper_addCVars' 'bintoolsWrapper_addLDVars' ) +declare -a envHostTargetHooks=('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='' @@ -162,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/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' +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/rvp7qlpf5jqvdckjy1afjb6aha6j8dxg-pkg-config-wrapper-0.29.2' export nativeBuildInputs out='/home/nionidh/projects/rust-tomfoolery/cursor-mover-app/outputs/out' export out @@ -183,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/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 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/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=('/nix/store/i5vppnbl2qnrvm4h5azwq83rr9gm7sdy-compiler-rt-libc-21.1.8-dev' '/nix/store/idl8schy78hxa05jyndj4nmb4wzgcln2-compiler-rt-libc-21.1.8' ) +declare -a pkgsHostHost=() declare -a pkgsHostTarget=() declare -a pkgsTargetTarget=() declare -a postFixupHooks=('noBrokenSymlinksInAllOutputs' '_makeSymlinksRelative' '_multioutPropagateDev' ) @@ -231,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/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile" ] +if [ ! -L "$DEVENV_DOTFILE/profile" ] || [ "$(/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin/readlink $DEVENV_DOTFILE/profile)" != "/nix/store/3niz0g2hddnbba4bcql8s8arc6mmna5m-devenv-profile" ] then - ln -snf /nix/store/7wyfm3pdjlbl7747ghfqlvz2rfsf013l-devenv-profile "$DEVENV_DOTFILE/profile" + ln -snf /nix/store/3niz0g2hddnbba4bcql8s8arc6mmna5m-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 @@ -241,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/c0xxs40qc5szabj2yiimh0cziknji84q-devenv-flake-compat/bin:$PATH +export PATH=/nix/store/qgm0a9f2cxfsf6v0d4b5riy5x54w3zib-devenv-flake-compat/bin:$PATH if [ -z "${DEVENV_SKIP_TASKS:-}" ]; then - /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 $? + /nix/store/bkl9r14hgr0qy850wkdj1bgs8884i46r-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/crates/cursor-move-webapp/src/components/mouse_area.rs b/crates/cursor-move-webapp/src/components/mouse_area.rs index 54c1692..0caf6d1 100644 --- a/crates/cursor-move-webapp/src/components/mouse_area.rs +++ b/crates/cursor-move-webapp/src/components/mouse_area.rs @@ -64,7 +64,6 @@ pub fn MouseArea() -> Element { }); let key_down_handler = use_callback(move |evt: Event| { - tracing::info!("Keydown"); spawn(async move { _ = socket .send(ClientEvent::KeyEvent { @@ -75,12 +74,49 @@ pub fn MouseArea() -> Element { }); }); - let key_up_handler = use_callback(move |evt: Event| { + // 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; + // }); + // }); + + let mut input_state = use_signal(String::new); + let input_handler = use_callback(move |evt: Event| { + let v = evt.value(); + input_state.set(v.clone()); + + spawn(async move { + _ = socket.send(ClientEvent::TextInputEvent { text: v }).await; + }); + }); + let key_press_handler = use_callback(move |evt: Event| { + if evt.key() == Key::Enter { + spawn(async move { + _ = socket + .send(ClientEvent::TextInputDoneEvent { + text: input_state.replace(String::new()), + }) + .await; + }); + } + }); + let input_focus_handler = use_callback(move |evt: Event| { + input_state.set(String::new()); + spawn(async move { + _ = socket.send(ClientEvent::TextInputStartEvent).await; + }); + }); + + let input_blur_handler = use_callback(move |evt: Event| { spawn(async move { _ = socket - .send(ClientEvent::KeyEvent { - key: evt.key().to_string(), - is_pressed: false, + .send(ClientEvent::TextInputDoneEvent { + text: input_state.replace(String::new()), }) .await; }); @@ -88,7 +124,12 @@ pub fn MouseArea() -> Element { rsx! { div { - input { onkeydown: key_down_handler, onkeyup: key_up_handler} + input { + oninput: input_handler, + value: input_state, + onkeypress: key_press_handler, + onfocus: input_focus_handler, + onblur: input_blur_handler } div { class: Styles::mouse_area, @@ -105,6 +146,9 @@ enum ClientEvent { MouseMove { dx: f64, dy: f64 }, Click, KeyEvent { key: String, is_pressed: bool }, + TextInputStartEvent, + TextInputEvent { text: String }, + TextInputDoneEvent { text: String }, } #[derive(Serialize, Deserialize, Debug)] @@ -131,6 +175,15 @@ async fn mouse_move( ClientEvent::KeyEvent { key, is_pressed } => { mouse_service.key_event(key, is_pressed).await; }, + ClientEvent::TextInputEvent { text } => { + mouse_service.text_input(text).await; + }, + ClientEvent::TextInputStartEvent => { + mouse_service.text_input_start().await; + }, + ClientEvent::TextInputDoneEvent { text } => { + mouse_service.text_input_end(text).await; + }, } } })) diff --git a/crates/cursor-move-webapp/src/server/input_proxy_service.rs b/crates/cursor-move-webapp/src/server/input_proxy_service.rs index 4f6a7a3..fb4cef8 100644 --- a/crates/cursor-move-webapp/src/server/input_proxy_service.rs +++ b/crates/cursor-move-webapp/src/server/input_proxy_service.rs @@ -1,8 +1,7 @@ -use std::{io::Write, str::FromStr, sync::Arc, time::Duration}; +use std::{io::Write, sync::Arc, time::Duration}; use dioxus::{ fullstack::{FullstackContext, extract::FromRef}, - html::Key, logger::tracing, }; use memfile::MemFile; @@ -16,9 +15,14 @@ use wayland_client::{ 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_misc::{ + zwp_input_method_v2::client::{ + zwp_input_method_manager_v2::ZwpInputMethodManagerV2, zwp_input_method_v2::ZwpInputMethodV2, + }, + 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, @@ -93,14 +97,49 @@ impl InputProxyService { 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(); + todo!(); + } - let key = Key::from_str(key.as_str()).unwrap().legacy_charcode(); + pub async fn text_input_start(&self) { + let mut guard = self.input_proxy_service_state.lock().await; - keyboard.key(time, key, if is_pressed { 1 } else { 0 }); + if let Some(keyboard) = guard.state.input_method_mut() { + keyboard.input_method_state += 1; + tracing::info!("Text Input Start"); + keyboard.input_method.delete_surrounding_text(4, 4); + keyboard.input_method.commit(keyboard.input_method_state); + + guard.event_queue.flush().unwrap(); + } + } + pub async fn text_input( + &self, + key: String, + ) { + let mut guard = self.input_proxy_service_state.lock().await; + + if let Some(keyboard) = guard.state.input_method_mut() { + keyboard.input_method_state += 1; + + tracing::info!("Text Input {key}"); + keyboard.input_method.set_preedit_string(key, 0, 0); + keyboard.input_method.commit(keyboard.input_method_state); + guard.event_queue.flush().unwrap(); + } + } + pub async fn text_input_end( + &self, + text: String, + ) { + let mut guard = self.input_proxy_service_state.lock().await; + + if let Some(keyboard) = guard.state.input_method_mut() { + keyboard.input_method_state += 1; + + tracing::info!("Text Input End"); + keyboard.input_method.commit_string(text); + keyboard.input_method.commit(keyboard.input_method_state); guard.event_queue.flush().unwrap(); } } @@ -143,12 +182,18 @@ struct Keymap { size: u32, } +struct InputMethod { + input_method: ZwpInputMethodV2, + input_method_state: u32, +} + enum InputProxyServiceState { Incomplete { queue_handle: QueueHandle, seat: Option, virtual_pointer_manager: Option, virtual_keyboard_manager: Option, + input_method_manager: Option, keymap: Keymap, }, Running { @@ -158,6 +203,8 @@ enum InputProxyServiceState { virtual_pointer: ZwlrVirtualPointerV1, virtual_keyboard: ZwpVirtualKeyboardV1, + + input_method: InputMethod, }, } impl InputProxyServiceState { @@ -177,6 +224,7 @@ impl InputProxyServiceState { seat: None, virtual_pointer_manager: None, virtual_keyboard_manager: None, + input_method_manager: None, } } @@ -198,6 +246,13 @@ impl InputProxyServiceState { } } + fn input_method_mut(&mut self) -> Option<&mut InputMethod> { + match self { + Self::Running { input_method, .. } => Some(input_method), + Self::Incomplete { .. } => None, + } + } + pub fn set_seat( &mut self, seat: WlSeat, @@ -249,35 +304,63 @@ impl InputProxyServiceState { } } + pub fn set_input_method_manager( + &mut self, + input_method_manager: ZwpInputMethodManagerV2, + ) { + if let Self::Incomplete { + input_method_manager: existing @ None, + .. + } = self + { + *existing = Some(input_method_manager); + tracing::info!("Obtained Input Method Manager!"); + self.try_upgrade(); + } else { + tracing::info!("Received duplicate ZwpInputMethodManagerV2"); + } + } + 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(..), + seat: seat @ Some(..), + virtual_pointer_manager: vpm @ Some(..), + virtual_keyboard_manager: vkm @ Some(..), + input_method_manager: imm @ Some(..), } = self { - let virtual_keyboard = ovkm.as_ref().unwrap().create_virtual_keyboard( - oseat.as_ref().unwrap(), + let virtual_keyboard = vkm.as_ref().unwrap().create_virtual_keyboard( + seat.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()), + let virtual_pointer = vpm.as_ref().unwrap().create_virtual_pointer( + Some(seat.as_ref().unwrap()), queue_handle, (), ); + + let input_method = + imm.as_ref() + .unwrap() + .get_input_method(seat.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(), + seat: seat.take().unwrap(), + virtual_pointer_manager: vpm.take().unwrap(), + virtual_keyboard_manager: vkm.take().unwrap(), virtual_pointer, virtual_keyboard, + input_method: InputMethod { + input_method, + input_method_state: 0, + }, }; } } @@ -339,6 +422,33 @@ impl Dispatch for InputProxyServiceState { } } +impl Dispatch for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &ZwpInputMethodManagerV2, + _event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + tracing::warn!("Unknown event received from ZwpInputMethodManagerV2"); + } +} + +impl Dispatch for InputProxyServiceState { + fn event( + _state: &mut Self, + _proxy: &ZwpInputMethodV2, + _event: ::Event, + _data: &(), + _conn: &Connection, + _qhandle: &QueueHandle, + ) { + panic!(); + tracing::warn!("Unknown event received from ZwpInputMethodV2"); + } +} + impl Dispatch for InputProxyServiceState { fn event( _state: &mut Self, @@ -399,6 +509,15 @@ impl Dispatch for InputProxyServiceState { ); app_data.set_virtual_keyboard_manager(manager); }, + "zwp_input_method_manager_v2" => { + let manager = registry.bind::( + name, + version, + queue_handle, + (), + ); + app_data.set_input_method_manager(manager); + }, _ => {}, }, Event::GlobalRemove { .. } => todo!(), diff --git a/crates/cursor-move-webapp/src/server/keymap.rs b/crates/cursor-move-webapp/src/server/keymap.rs index 06d8abe..de52a2f 100644 --- a/crates/cursor-move-webapp/src/server/keymap.rs +++ b/crates/cursor-move-webapp/src/server/keymap.rs @@ -1,3 +1,571 @@ +fn is_key_string(s: &str) -> bool { + s.chars().all(|c| !c.is_control()) && s.chars().skip(1).all(|c| !c.is_ascii()) +} + +pub fn web_key_to_linux_keycode(s: &str) -> Option { + match s { + //s if is_key_string(s) => Ok(Character(s.to_string())), + "Unidentified" => todo!(), + "Alt" => Some(KEY_LEFTALT), + "AltGraph" => Some(KEY_RIGHTALT), + "CapsLock" => todo!(), + "Control" => todo!(), + "Fn" => todo!(), + "FnLock" => todo!(), + "Meta" => todo!(), + "NumLock" => todo!(), + "ScrollLock" => todo!(), + "Shift" => todo!(), + "Symbol" => todo!(), + "SymbolLock" => todo!(), + "Hyper" => todo!(), + "Super" => todo!(), + "Enter" => todo!(), + "Tab" => todo!(), + "ArrowDown" => todo!(), + "ArrowLeft" => todo!(), + "ArrowRight" => todo!(), + "ArrowUp" => todo!(), + "End" => todo!(), + "Home" => todo!(), + "PageDown" => todo!(), + "PageUp" => todo!(), + "Backspace" => todo!(), + "Clear" => todo!(), + "Copy" => todo!(), + "CrSel" => todo!(), + "Cut" => todo!(), + "Delete" => todo!(), + "EraseEof" => todo!(), + "ExSel" => todo!(), + "Insert" => todo!(), + "Paste" => todo!(), + "Redo" => todo!(), + "Undo" => todo!(), + "Accept" => todo!(), + "Again" => todo!(), + "Attn" => todo!(), + "Cancel" => todo!(), + "ContextMenu" => todo!(), + "Escape" => todo!(), + "Execute" => todo!(), + "Find" => todo!(), + "Help" => todo!(), + "Pause" => todo!(), + "Play" => todo!(), + "Props" => todo!(), + "Select" => todo!(), + "ZoomIn" => todo!(), + "ZoomOut" => todo!(), + "BrightnessDown" => todo!(), + "BrightnessUp" => todo!(), + "Eject" => todo!(), + "LogOff" => todo!(), + "Power" => todo!(), + "PowerOff" => todo!(), + "PrintScreen" => todo!(), + "Hibernate" => todo!(), + "Standby" => todo!(), + "WakeUp" => todo!(), + "AllCandidates" => todo!(), + "Alphanumeric" => todo!(), + "CodeInput" => todo!(), + "Compose" => todo!(), + "Convert" => todo!(), + "Dead" => todo!(), + "FinalMode" => todo!(), + "GroupFirst" => todo!(), + "GroupLast" => todo!(), + "GroupNext" => todo!(), + "GroupPrevious" => todo!(), + "ModeChange" => todo!(), + "NextCandidate" => todo!(), + "NonConvert" => todo!(), + "PreviousCandidate" => todo!(), + "Process" => todo!(), + "SingleCandidate" => todo!(), + "HangulMode" => todo!(), + "HanjaMode" => todo!(), + "JunjaMode" => todo!(), + "Eisu" => todo!(), + "Hankaku" => todo!(), + "Hiragana" => todo!(), + "HiraganaKatakana" => todo!(), + "KanaMode" => todo!(), + "KanjiMode" => todo!(), + "Katakana" => todo!(), + "Romaji" => todo!(), + "Zenkaku" => todo!(), + "ZenkakuHankaku" => todo!(), + "Soft1" => todo!(), + "Soft2" => todo!(), + "Soft3" => todo!(), + "Soft4" => todo!(), + "ChannelDown" => todo!(), + "ChannelUp" => todo!(), + "Close" => todo!(), + "MailForward" => todo!(), + "MailReply" => todo!(), + "MailSend" => todo!(), + "MediaClose" => todo!(), + "MediaFastForward" => todo!(), + "MediaPause" => todo!(), + "MediaPlay" => todo!(), + "MediaPlayPause" => todo!(), + "MediaRecord" => todo!(), + "MediaRewind" => todo!(), + "MediaStop" => todo!(), + "MediaTrackNext" => todo!(), + "MediaTrackPrevious" => todo!(), + "New" => todo!(), + "Open" => todo!(), + "Print" => todo!(), + "Save" => todo!(), + "SpellCheck" => todo!(), + "Key11" => todo!(), + "Key12" => todo!(), + "AudioBalanceLeft" => todo!(), + "AudioBalanceRight" => todo!(), + "AudioBassBoostDown" => todo!(), + "AudioBassBoostToggle" => todo!(), + "AudioBassBoostUp" => todo!(), + "AudioFaderFront" => todo!(), + "AudioFaderRear" => todo!(), + "AudioSurroundModeNext" => todo!(), + "AudioTrebleDown" => todo!(), + "AudioTrebleUp" => todo!(), + "AudioVolumeDown" => todo!(), + "AudioVolumeUp" => todo!(), + "AudioVolumeMute" => todo!(), + "MicrophoneToggle" => todo!(), + "MicrophoneVolumeDown" => todo!(), + "MicrophoneVolumeUp" => todo!(), + "MicrophoneVolumeMute" => todo!(), + "SpeechCorrectionList" => todo!(), + "SpeechInputToggle" => todo!(), + "LaunchApplication1" => todo!(), + "LaunchApplication2" => todo!(), + "LaunchCalendar" => todo!(), + "LaunchContacts" => todo!(), + "LaunchMail" => todo!(), + "LaunchMediaPlayer" => todo!(), + "LaunchMusicPlayer" => todo!(), + "LaunchPhone" => todo!(), + "LaunchScreenSaver" => todo!(), + "LaunchSpreadsheet" => todo!(), + "LaunchWebBrowser" => todo!(), + "LaunchWebCam" => todo!(), + "LaunchWordProcessor" => todo!(), + "BrowserBack" => todo!(), + "BrowserFavorites" => todo!(), + "BrowserForward" => todo!(), + "BrowserHome" => todo!(), + "BrowserRefresh" => todo!(), + "BrowserSearch" => todo!(), + "BrowserStop" => todo!(), + "AppSwitch" => todo!(), + "Call" => todo!(), + "Camera" => todo!(), + "CameraFocus" => todo!(), + "EndCall" => todo!(), + "GoBack" => todo!(), + "GoHome" => todo!(), + "HeadsetHook" => todo!(), + "LastNumberRedial" => todo!(), + "Notification" => todo!(), + "MannerMode" => todo!(), + "VoiceDial" => todo!(), + "TV" => todo!(), + "TV3DMode" => todo!(), + "TVAntennaCable" => todo!(), + "TVAudioDescription" => todo!(), + "TVAudioDescriptionMixDown" => todo!(), + "TVAudioDescriptionMixUp" => todo!(), + "TVContentsMenu" => todo!(), + "TVDataService" => todo!(), + "TVInput" => todo!(), + "TVInputComponent1" => todo!(), + "TVInputComponent2" => todo!(), + "TVInputComposite1" => todo!(), + "TVInputComposite2" => todo!(), + "TVInputHDMI1" => todo!(), + "TVInputHDMI2" => todo!(), + "TVInputHDMI3" => todo!(), + "TVInputHDMI4" => todo!(), + "TVInputVGA1" => todo!(), + "TVMediaContext" => todo!(), + "TVNetwork" => todo!(), + "TVNumberEntry" => todo!(), + "TVPower" => todo!(), + "TVRadioService" => todo!(), + "TVSatellite" => todo!(), + "TVSatelliteBS" => todo!(), + "TVSatelliteCS" => todo!(), + "TVSatelliteToggle" => todo!(), + "TVTerrestrialAnalog" => todo!(), + "TVTerrestrialDigital" => todo!(), + "TVTimer" => todo!(), + "AVRInput" => todo!(), + "AVRPower" => todo!(), + "ColorF0Red" => todo!(), + "ColorF1Green" => todo!(), + "ColorF2Yellow" => todo!(), + "ColorF3Blue" => todo!(), + "ColorF4Grey" => todo!(), + "ColorF5Brown" => todo!(), + "ClosedCaptionToggle" => todo!(), + "Dimmer" => todo!(), + "DisplaySwap" => todo!(), + "DVR" => todo!(), + "Exit" => todo!(), + "FavoriteClear0" => todo!(), + "FavoriteClear1" => todo!(), + "FavoriteClear2" => todo!(), + "FavoriteClear3" => todo!(), + "FavoriteRecall0" => todo!(), + "FavoriteRecall1" => todo!(), + "FavoriteRecall2" => todo!(), + "FavoriteRecall3" => todo!(), + "FavoriteStore0" => todo!(), + "FavoriteStore1" => todo!(), + "FavoriteStore2" => todo!(), + "FavoriteStore3" => todo!(), + "Guide" => todo!(), + "GuideNextDay" => todo!(), + "GuidePreviousDay" => todo!(), + "Info" => todo!(), + "InstantReplay" => todo!(), + "Link" => todo!(), + "ListProgram" => todo!(), + "LiveContent" => todo!(), + "Lock" => todo!(), + "MediaApps" => todo!(), + "MediaAudioTrack" => todo!(), + "MediaLast" => todo!(), + "MediaSkipBackward" => todo!(), + "MediaSkipForward" => todo!(), + "MediaStepBackward" => todo!(), + "MediaStepForward" => todo!(), + "MediaTopMenu" => todo!(), + "NavigateIn" => todo!(), + "NavigateNext" => todo!(), + "NavigateOut" => todo!(), + "NavigatePrevious" => todo!(), + "NextFavoriteChannel" => todo!(), + "NextUserProfile" => todo!(), + "OnDemand" => todo!(), + "Pairing" => todo!(), + "PinPDown" => todo!(), + "PinPMove" => todo!(), + "PinPToggle" => todo!(), + "PinPUp" => todo!(), + "PlaySpeedDown" => todo!(), + "PlaySpeedReset" => todo!(), + "PlaySpeedUp" => todo!(), + "RandomToggle" => todo!(), + "RcLowBattery" => todo!(), + "RecordSpeedNext" => todo!(), + "RfBypass" => todo!(), + "ScanChannelsToggle" => todo!(), + "ScreenModeNext" => todo!(), + "Settings" => todo!(), + "SplitScreenToggle" => todo!(), + "STBInput" => todo!(), + "STBPower" => todo!(), + "Subtitle" => todo!(), + "Teletext" => todo!(), + "VideoModeNext" => todo!(), + "Wink" => todo!(), + "ZoomToggle" => todo!(), + "F1" => todo!(), + "F2" => todo!(), + "F3" => todo!(), + "F4" => todo!(), + "F5" => todo!(), + "F6" => todo!(), + "F7" => todo!(), + "F8" => todo!(), + "F9" => todo!(), + "F10" => todo!(), + "F11" => todo!(), + "F12" => todo!(), + "F13" => todo!(), + "F14" => todo!(), + "F15" => todo!(), + "F16" => todo!(), + "F17" => todo!(), + "F18" => todo!(), + "F19" => todo!(), + "F20" => todo!(), + "F21" => todo!(), + "F22" => todo!(), + "F23" => todo!(), + "F24" => todo!(), + "F25" => todo!(), + "F26" => todo!(), + "F27" => todo!(), + "F28" => todo!(), + "F29" => todo!(), + "F30" => todo!(), + "F31" => todo!(), + "F32" => todo!(), + "F33" => todo!(), + "F34" => todo!(), + "F35" => todo!(), + _ => todo!(), + } +} + +const KEY_RESERVED: u32 = 0; +const KEY_ESC: u32 = 1; +const KEY_1: u32 = 2; +const KEY_2: u32 = 3; +const KEY_3: u32 = 4; +const KEY_4: u32 = 5; +const KEY_5: u32 = 6; +const KEY_6: u32 = 7; +const KEY_7: u32 = 8; +const KEY_8: u32 = 9; +const KEY_9: u32 = 10; +const KEY_0: u32 = 11; +const KEY_MINUS: u32 = 12; +const KEY_EQUAL: u32 = 13; +const KEY_BACKSPACE: u32 = 14; +const KEY_TAB: u32 = 15; +const KEY_Q: u32 = 16; +const KEY_W: u32 = 17; +const KEY_E: u32 = 18; +const KEY_R: u32 = 19; +const KEY_T: u32 = 20; +const KEY_Y: u32 = 21; +const KEY_U: u32 = 22; +const KEY_I: u32 = 23; +const KEY_O: u32 = 24; +const KEY_P: u32 = 25; +const KEY_LEFTBRACE: u32 = 26; +const KEY_RIGHTBRACE: u32 = 27; +const KEY_ENTER: u32 = 28; +const KEY_LEFTCTRL: u32 = 29; +const KEY_A: u32 = 30; +const KEY_S: u32 = 31; +const KEY_D: u32 = 32; +const KEY_F: u32 = 33; +const KEY_G: u32 = 34; +const KEY_H: u32 = 35; +const KEY_J: u32 = 36; +const KEY_K: u32 = 37; +const KEY_L: u32 = 38; +const KEY_SEMICOLON: u32 = 39; +const KEY_APOSTROPHE: u32 = 40; +const KEY_GRAVE: u32 = 41; +const KEY_LEFTSHIFT: u32 = 42; +const KEY_BACKSLASH: u32 = 43; +const KEY_Z: u32 = 44; +const KEY_X: u32 = 45; +const KEY_C: u32 = 46; +const KEY_V: u32 = 47; +const KEY_B: u32 = 48; +const KEY_N: u32 = 49; +const KEY_M: u32 = 50; +const KEY_COMMA: u32 = 51; +const KEY_DOT: u32 = 52; +const KEY_SLASH: u32 = 53; +const KEY_RIGHTSHIFT: u32 = 54; +const KEY_KPASTERISK: u32 = 55; +const KEY_LEFTALT: u32 = 56; +const KEY_SPACE: u32 = 57; +const KEY_CAPSLOCK: u32 = 58; +const KEY_F1: u32 = 59; +const KEY_F2: u32 = 60; +const KEY_F3: u32 = 61; +const KEY_F4: u32 = 62; +const KEY_F5: u32 = 63; +const KEY_F6: u32 = 64; +const KEY_F7: u32 = 65; +const KEY_F8: u32 = 66; +const KEY_F9: u32 = 67; +const KEY_F10: u32 = 68; +const KEY_NUMLOCK: u32 = 69; +const KEY_SCROLLLOCK: u32 = 70; +const KEY_KP7: u32 = 71; +const KEY_KP8: u32 = 72; +const KEY_KP9: u32 = 73; +const KEY_KPMINUS: u32 = 74; +const KEY_KP4: u32 = 75; +const KEY_KP5: u32 = 76; +const KEY_KP6: u32 = 77; +const KEY_KPPLUS: u32 = 78; +const KEY_KP1: u32 = 79; +const KEY_KP2: u32 = 80; +const KEY_KP3: u32 = 81; +const KEY_KP0: u32 = 82; +const KEY_KPDOT: u32 = 83; +const KEY_ZENKAKUHANKAKU: u32 = 85; +const KEY_102ND: u32 = 86; +const KEY_F11: u32 = 87; +const KEY_F12: u32 = 88; +const KEY_RO: u32 = 89; +const KEY_KATAKANA: u32 = 90; +const KEY_HIRAGANA: u32 = 91; +const KEY_HENKAN: u32 = 92; +const KEY_KATAKANAHIRAGANA: u32 = 93; +const KEY_MUHENKAN: u32 = 94; +const KEY_KPJPCOMMA: u32 = 95; +const KEY_KPENTER: u32 = 96; +const KEY_RIGHTCTRL: u32 = 97; +const KEY_KPSLASH: u32 = 98; +const KEY_SYSRQ: u32 = 99; +const KEY_RIGHTALT: u32 = 100; +const KEY_LINEFEED: u32 = 101; +const KEY_HOME: u32 = 102; +const KEY_UP: u32 = 103; +const KEY_PAGEUP: u32 = 104; +const KEY_LEFT: u32 = 105; +const KEY_RIGHT: u32 = 106; +const KEY_END: u32 = 107; +const KEY_DOWN: u32 = 108; +const KEY_PAGEDOWN: u32 = 109; +const KEY_INSERT: u32 = 110; +const KEY_DELETE: u32 = 111; +const KEY_MACRO: u32 = 112; +const KEY_MUTE: u32 = 113; +const KEY_VOLUMEDOWN: u32 = 114; +const KEY_VOLUMEUP: u32 = 115; +const KEY_POWER : u32 = 116 /* SC System Power Down */; +const KEY_KPEQUAL: u32 = 117; +const KEY_KPPLUSMINUS: u32 = 118; +const KEY_PAUSE: u32 = 119; +const KEY_SCALE : u32 = 120 /* AL Compiz Scale (Expose) */; +const KEY_KPCOMMA: u32 = 121; +const KEY_HANGEUL: u32 = 122; +const KEY_HANGUEL: u32 = KEY_HANGEUL; +const KEY_HANJA: u32 = 123; +const KEY_YEN: u32 = 124; +const KEY_LEFTMETA: u32 = 125; +const KEY_RIGHTMETA: u32 = 126; +const KEY_COMPOSE: u32 = 127; +const KEY_STOP : u32 = 128 /* AC Stop */; +const KEY_AGAIN: u32 = 129; +const KEY_PROPS : u32 = 130 /* AC Properties */; +const KEY_UNDO : u32 = 131 /* AC Undo */; +const KEY_FRONT: u32 = 132; +const KEY_COPY : u32 = 133 /* AC Copy */; +const KEY_OPEN : u32 = 134 /* AC Open */; +const KEY_PASTE : u32 = 135 /* AC Paste */; +const KEY_FIND : u32 = 136 /* AC Search */; +const KEY_CUT : u32 = 137 /* AC Cut */; +const KEY_HELP : u32 = 138 /* AL Integrated Help Center */; +const KEY_MENU : u32 = 139 /* Menu (show menu) */; +const KEY_CALC : u32 = 140 /* AL Calculator */; +const KEY_SETUP: u32 = 141; +const KEY_SLEEP : u32 = 142 /* SC System Sleep */; +const KEY_WAKEUP : u32 = 143 /* System Wake Up */; +const KEY_FILE : u32 = 144 /* AL Local Machine Browser */; +const KEY_SENDFILE: u32 = 145; +const KEY_DELETEFILE: u32 = 146; +const KEY_XFER: u32 = 147; +const KEY_PROG1: u32 = 148; +const KEY_PROG2: u32 = 149; +const KEY_WWW : u32 = 150 /* AL Internet Browser */; +const KEY_MSDOS: u32 = 151; +const KEY_COFFEE : u32 = 152 /* AL Terminal Lock/Screensaver */; +const KEY_SCREENLOCK: u32 = KEY_COFFEE; +const KEY_ROTATE_DISPLAY : u32 = 153 /* Display orientation for e.g. tablets */; +const KEY_DIRECTION: u32 = KEY_ROTATE_DISPLAY; +const KEY_CYCLEWINDOWS: u32 = 154; +const KEY_MAIL: u32 = 155; +const KEY_BOOKMARKS : u32 = 156 /* AC Bookmarks */; +const KEY_COMPUTER: u32 = 157; +const KEY_BACK : u32 = 158 /* AC Back */; +const KEY_FORWARD : u32 = 159 /* AC Forward */; +const KEY_CLOSECD: u32 = 160; +const KEY_EJECTCD: u32 = 161; +const KEY_EJECTCLOSECD: u32 = 162; +const KEY_NEXTSONG: u32 = 163; +const KEY_PLAYPAUSE: u32 = 164; +const KEY_PREVIOUSSONG: u32 = 165; +const KEY_STOPCD: u32 = 166; +const KEY_RECORD: u32 = 167; +const KEY_REWIND: u32 = 168; +const KEY_PHONE : u32 = 169 /* Media Select Telephone */; +const KEY_ISO: u32 = 170; +const KEY_CONFIG : u32 = 171 /* AL Consumer Control Configuration */; +const KEY_HOMEPAGE : u32 = 172 /* AC Home */; +const KEY_REFRESH : u32 = 173 /* AC Refresh */; +const KEY_EXIT : u32 = 174 /* AC Exit */; +const KEY_MOVE: u32 = 175; +const KEY_EDIT: u32 = 176; +const KEY_SCROLLUP: u32 = 177; +const KEY_SCROLLDOWN: u32 = 178; +const KEY_KPLEFTPAREN: u32 = 179; +const KEY_KPRIGHTPAREN: u32 = 180; +const KEY_NEW : u32 = 181 /* AC New */; +const KEY_REDO : u32 = 182 /* AC Redo/Repeat */; +const KEY_F13: u32 = 183; +const KEY_F14: u32 = 184; +const KEY_F15: u32 = 185; +const KEY_F16: u32 = 186; +const KEY_F17: u32 = 187; +const KEY_F18: u32 = 188; +const KEY_F19: u32 = 189; +const KEY_F20: u32 = 190; +const KEY_F21: u32 = 191; +const KEY_F22: u32 = 192; +const KEY_F23: u32 = 193; +const KEY_F24: u32 = 194; +const KEY_PLAYCD: u32 = 200; +const KEY_PAUSECD: u32 = 201; +const KEY_PROG3: u32 = 202; +const KEY_PROG4: u32 = 203; +const KEY_ALL_APPLICATIONS : u32 = 204 /* AC Desktop Show All Applications */; +const KEY_DASHBOARD: u32 = KEY_ALL_APPLICATIONS; +const KEY_SUSPEND: u32 = 205; +const KEY_CLOSE : u32 = 206 /* AC Close */; +const KEY_PLAY: u32 = 207; +const KEY_FASTFORWARD: u32 = 208; +const KEY_BASSBOOST: u32 = 209; +const KEY_PRINT : u32 = 210 /* AC Print */; +const KEY_HP: u32 = 211; +const KEY_CAMERA: u32 = 212; +const KEY_SOUND: u32 = 213; +const KEY_QUESTION: u32 = 214; +const KEY_EMAIL: u32 = 215; +const KEY_CHAT: u32 = 216; +const KEY_SEARCH: u32 = 217; +const KEY_CONNECT: u32 = 218; +const KEY_FINANCE : u32 = 219 /* AL Checkbook/Finance */; +const KEY_SPORT: u32 = 220; +const KEY_SHOP: u32 = 221; +const KEY_ALTERASE: u32 = 222; +const KEY_CANCEL : u32 = 223 /* AC Cancel */; +const KEY_BRIGHTNESSDOWN: u32 = 224; +const KEY_BRIGHTNESSUP: u32 = 225; +const KEY_MEDIA: u32 = 226; +const KEY_SWITCHVIDEOMODE : u32 = 227 /* Cycle between available video outputs (Monitor/LCD/TV-out/etc) */; +const KEY_KBDILLUMTOGGLE: u32 = 228; +const KEY_KBDILLUMDOWN: u32 = 229; +const KEY_KBDILLUMUP: u32 = 230; +const KEY_SEND : u32 = 231 /* AC Send */; +const KEY_REPLY : u32 = 232 /* AC Reply */; +const KEY_FORWARDMAIL : u32 = 233 /* AC Forward Msg */; +const KEY_SAVE : u32 = 234 /* AC Save */; +const KEY_DOCUMENTS: u32 = 235; +const KEY_BATTERY: u32 = 236; +const KEY_BLUETOOTH: u32 = 237; +const KEY_WLAN: u32 = 238; +const KEY_UWB: u32 = 239; +const KEY_UNKNOWN: u32 = 240; +const KEY_VIDEO_NEXT : u32 = 241 /* drive next video source */; +const KEY_VIDEO_PREV : u32 = 242 /* drive previous video source */; +const KEY_BRIGHTNESS_CYCLE : u32 = 243 /* brightness up, after max is min */; +const KEY_BRIGHTNESS_AUTO : u32 = 244 /* Set Auto Brightness: manual brightness control is off, rely on ambient */; +const KEY_BRIGHTNESS_ZERO: u32 = KEY_BRIGHTNESS_AUTO; +const KEY_DISPLAY_OFF : u32 = 245 /* display device to off state */; +const KEY_WWAN : u32 = 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */; +const KEY_WIMAX: u32 = KEY_WWAN; +const KEY_RFKILL : u32 = 247 /* Key that controls all radios */; +const KEY_MICMUTE : u32 = 248 /* Mute / unmute the microphone */; + pub const KEYMAP: &str = "xkb_keymap {}"; pub const KEYMAP_: &str = "xkb_keymap {\ diff --git a/flake.nix b/flake.nix index f00ac9b..4c8667d 100644 --- a/flake.nix +++ b/flake.nix @@ -117,10 +117,6 @@ wasmBindgen pkgs.libxkbcommon - - pkgs.clang - pkgs.llvmPackages.libclang - ]; scripts.checkall.exec = ''