mirror of
https://codeberg.org/icewind/evtype.git
synced 2026-06-03 09:34:11 +02:00
update
This commit is contained in:
parent
74f3929d37
commit
637c58e0a0
11 changed files with 648 additions and 391 deletions
19
.direnv/bin/nix-direnv-reload
Executable file
19
.direnv/bin/nix-direnv-reload
Executable file
|
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
if [[ ! -d "/home/robin/Projects/evtype" ]]; then
|
||||
echo "Cannot find source directory; Did you move it?"
|
||||
echo "(Looking for "/home/robin/Projects/evtype")"
|
||||
echo 'Cannot force reload with this script - use "direnv reload" manually and then try again'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# rebuild the cache forcefully
|
||||
_nix_direnv_force_reload=1 direnv exec "/home/robin/Projects/evtype" true
|
||||
|
||||
# Update the mtime for .envrc.
|
||||
# This will cause direnv to reload again - but without re-building.
|
||||
touch "/home/robin/Projects/evtype/.envrc"
|
||||
|
||||
# Also update the timestamp of whatever profile_rc we have.
|
||||
# This makes sure that we know we are up to date.
|
||||
touch -r "/home/robin/Projects/evtype/.envrc" "/home/robin/Projects/evtype/.direnv"/*.rc
|
||||
1
.envrc
Normal file
1
.envrc
Normal file
|
|
@ -0,0 +1 @@
|
|||
use flake
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -1 +1,5 @@
|
|||
/target
|
||||
target
|
||||
.direnv
|
||||
.env
|
||||
result
|
||||
*.log
|
||||
354
Cargo.lock
generated
354
Cargo.lock
generated
|
|
@ -1,5 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.0.0"
|
||||
|
|
@ -8,310 +10,294 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
|
|||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "0.8.2"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "0.9.1"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.2.1"
|
||||
name = "bitvec"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
|
||||
dependencies = [
|
||||
"funty",
|
||||
"radium",
|
||||
"tap",
|
||||
"wyz",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.50"
|
||||
version = "1.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
|
||||
checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "cfg_aliases"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
|
||||
|
||||
[[package]]
|
||||
name = "cfg_aliases"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||
|
||||
[[package]]
|
||||
name = "ctrlc"
|
||||
version = "3.1.4"
|
||||
version = "3.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a4ba686dff9fa4c1c9636ce1010b0cf98ceb421361b0bb3d6faeec43bd217a7"
|
||||
checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345"
|
||||
dependencies = [
|
||||
"nix 0.17.0",
|
||||
"winapi",
|
||||
"nix 0.28.0",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "evdev"
|
||||
version = "0.10.1"
|
||||
source = "git+https://github.com/myfreeweb/evdev?branch=uinput#4b905750a2103787e3e84241c60aaa79deb7c20c"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab6055a93a963297befb0f4f6e18f314aec9767a4bbe88b151126df2433610a7"
|
||||
dependencies = [
|
||||
"bitflags 0.8.2",
|
||||
"fixedbitset",
|
||||
"bitvec",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"nix 0.9.0",
|
||||
"num",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
"nix 0.23.2",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "evtype"
|
||||
version = "0.1.0"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"ctrlc",
|
||||
"evdev",
|
||||
"main_error",
|
||||
"nix 0.9.0",
|
||||
"nix 0.29.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fixedbitset"
|
||||
version = "0.1.9"
|
||||
name = "funty"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33"
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-cprng"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.68"
|
||||
version = "0.2.155"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
|
||||
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
|
||||
|
||||
[[package]]
|
||||
name = "main_error"
|
||||
version = "0.1.0"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3516df0fb44d98fe6d6e859d224adfb7b6686447937e5b96308d6061595eed04"
|
||||
checksum = "155db5e86c6e45ee456bf32fad5a290ee1f7151c2faca27ea27097568da67d1a"
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.9.0"
|
||||
name = "memoffset"
|
||||
version = "0.6.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2c5afeb0198ec7be8569d666644b574345aad2e95a53baf3a532da3e0f3fb32"
|
||||
checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
|
||||
dependencies = [
|
||||
"bitflags 0.9.1",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"void",
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.17.0"
|
||||
version = "0.23.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363"
|
||||
checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
|
||||
dependencies = [
|
||||
"bitflags 1.2.1",
|
||||
"bitflags 1.3.2",
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"void",
|
||||
"memoffset",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num"
|
||||
version = "0.1.42"
|
||||
name = "nix"
|
||||
version = "0.28.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
|
||||
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
"bitflags 2.6.0",
|
||||
"cfg-if",
|
||||
"cfg_aliases 0.1.1",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.1.44"
|
||||
name = "nix"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1"
|
||||
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
"rand",
|
||||
"rustc-serialize",
|
||||
"bitflags 2.6.0",
|
||||
"cfg-if",
|
||||
"cfg_aliases 0.2.1",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.1.43"
|
||||
name = "proc-macro2"
|
||||
version = "1.0.86"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b288631d7878aaf59442cffd36910ea604ecd7745c36054328595114001c9656"
|
||||
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"rustc-serialize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-integer"
|
||||
version = "0.1.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.1.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
"rustc-serialize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.3.15"
|
||||
version = "1.0.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
|
||||
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||
dependencies = [
|
||||
"fuchsia-cprng",
|
||||
"libc",
|
||||
"rand_core 0.3.1",
|
||||
"rdrand",
|
||||
"winapi",
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.3.1"
|
||||
name = "radium"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
||||
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.72"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
|
||||
dependencies = [
|
||||
"rand_core 0.4.2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.4.2"
|
||||
name = "tap"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
||||
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
|
||||
|
||||
[[package]]
|
||||
name = "rdrand"
|
||||
version = "0.4.0"
|
||||
name = "thiserror"
|
||||
version = "1.0.63"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
||||
checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
|
||||
dependencies = [
|
||||
"rand_core 0.3.1",
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-serialize"
|
||||
version = "0.3.24"
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.63"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
|
||||
|
||||
[[package]]
|
||||
name = "strum"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ca6e4730f517e041e547ffe23d29daab8de6b73af4b6ae2a002108169f5e7da"
|
||||
|
||||
[[package]]
|
||||
name = "strum_macros"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3384590878eb0cab3b128e844412e2d010821e7e091211b9d87324173ada7db8"
|
||||
checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "0.11.11"
|
||||
name = "unicode-ident"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
|
||||
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"synom",
|
||||
"unicode-xid",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "synom"
|
||||
version = "0.11.3"
|
||||
name = "windows-targets"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
|
||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_gnullvm",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.0.4"
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
|
||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||
|
||||
[[package]]
|
||||
name = "void"
|
||||
version = "1.0.2"
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.8"
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
|
||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||
|
||||
[[package]]
|
||||
name = "wyz"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
"tap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
|
|
|||
11
Cargo.toml
11
Cargo.toml
|
|
@ -1,8 +1,9 @@
|
|||
[package]
|
||||
name = "evtype"
|
||||
version = "0.1.0"
|
||||
version = "0.2.0"
|
||||
authors = ["Robin Appelman <robin@icewind.nl>"]
|
||||
edition = "2018"
|
||||
rust-version = "1.69.0"
|
||||
|
||||
[[bin]]
|
||||
name = "evtype_daemon"
|
||||
|
|
@ -13,7 +14,7 @@ name = "evtype"
|
|||
path = "src/client.rs"
|
||||
|
||||
[dependencies]
|
||||
evdev = { git = "https://github.com/myfreeweb/evdev", branch = "uinput" }
|
||||
nix = "0.9.0"
|
||||
main_error = "0.1.0"
|
||||
ctrlc = "3.1.4"
|
||||
evdev = "0.12.2"
|
||||
nix = "0.29.0"
|
||||
main_error = "0.1.2"
|
||||
ctrlc = "3.4.4"
|
||||
126
flake.lock
generated
Normal file
126
flake.lock
generated
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
{
|
||||
"nodes": {
|
||||
"cross-naersk": {
|
||||
"inputs": {
|
||||
"naersk": [
|
||||
"naersk"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1717704286,
|
||||
"narHash": "sha256-zrLB/FTKODEAlJjgO8TwbK7teTseYbjLESp8QJ/FJYc=",
|
||||
"owner": "icewind1991",
|
||||
"repo": "cross-naersk",
|
||||
"rev": "9068daceb8f0d248dcf629944f60e92b81391bdb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "icewind1991",
|
||||
"repo": "cross-naersk",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"naersk": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721727458,
|
||||
"narHash": "sha256-r/xppY958gmZ4oTfLiHN0ZGuQ+RSTijDblVgVLFi1mw=",
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"rev": "3fb418eaf352498f6b6c30592e3beb63df42ef11",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1721949857,
|
||||
"narHash": "sha256-DID446r8KsmJhbCzx4el8d9SnPiE8qa6+eEQOJ40vR0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "a1cc729dcbc31d9b0d11d86dc7436163548a9665",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-24.05",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"cross-naersk": "cross-naersk",
|
||||
"flake-utils": "flake-utils",
|
||||
"naersk": "naersk",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"rust-overlay": "rust-overlay"
|
||||
}
|
||||
},
|
||||
"rust-overlay": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721960387,
|
||||
"narHash": "sha256-o21ax+745ETGXrcgc/yUuLw1SI77ymp3xEpJt+w/kks=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "9cbf831c5b20a53354fc12758abd05966f9f1699",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
101
flake.nix
Normal file
101
flake.nix
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "nixpkgs/nixos-24.05";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
naersk.url = "github:nix-community/naersk";
|
||||
naersk.inputs.nixpkgs.follows = "nixpkgs";
|
||||
rust-overlay.url = "github:oxalica/rust-overlay";
|
||||
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
|
||||
cross-naersk.url = "github:icewind1991/cross-naersk";
|
||||
cross-naersk.inputs.nixpkgs.follows = "nixpkgs";
|
||||
cross-naersk.inputs.naersk.follows = "naersk";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
naersk,
|
||||
rust-overlay,
|
||||
cross-naersk,
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem (
|
||||
system: let
|
||||
overlays = [
|
||||
(import rust-overlay)
|
||||
(import ./nix/overlay.nix)
|
||||
];
|
||||
pkgs = (import nixpkgs) {
|
||||
inherit system overlays;
|
||||
};
|
||||
inherit (pkgs) lib callPackage rust-bin mkShell;
|
||||
inherit (lib.sources) sourceByRegex;
|
||||
inherit (builtins) fromTOML readFile map;
|
||||
|
||||
msrv = (fromTOML (readFile ./Cargo.toml)).package.rust-version;
|
||||
extractorMsrv = (fromTOML (readFile ./logging-extractor/Cargo.toml)).package.rust-version;
|
||||
msrvToolchain = rust-bin.stable."${msrv}".default;
|
||||
extractorMsrvToolchain = rust-bin.stable."${extractorMsrv}".default;
|
||||
|
||||
naersk' = callPackage naersk {};
|
||||
msrvNaersk = callPackage naersk {
|
||||
rustc = msrvToolchain;
|
||||
cargo = msrvToolchain;
|
||||
};
|
||||
extractorMsrvNaersk = callPackage naersk {
|
||||
rustc = extractorMsrvToolchain;
|
||||
cargo = extractorMsrvToolchain;
|
||||
};
|
||||
cross-naersk' = pkgs.callPackage cross-naersk {inherit naersk;};
|
||||
|
||||
buildMatrix = targets: {
|
||||
include =
|
||||
map (target: {
|
||||
inherit target;
|
||||
artifactSuffix = cross-naersk'.execSufficForTarget target;
|
||||
})
|
||||
targets;
|
||||
};
|
||||
|
||||
hostTarget = pkgs.hostPlatform.config;
|
||||
targets = [
|
||||
"x86_64-unknown-linux-musl"
|
||||
hostTarget
|
||||
];
|
||||
releaseTargets = lib.lists.remove hostTarget targets;
|
||||
|
||||
src = sourceByRegex ./. ["Cargo.*" "(src)(/.*)?"];
|
||||
nearskOpt = {
|
||||
pname = "evtype";
|
||||
root = src;
|
||||
};
|
||||
in rec {
|
||||
packages =
|
||||
lib.attrsets.genAttrs targets (target:
|
||||
(cross-naersk'.buildPackage target) nearskOpt)
|
||||
// {
|
||||
inherit (pkgs) logging-extractor extracted-logs extracted-logs-rust logsmash extracted-logs-rust-mod;
|
||||
check = msrvNaersk.buildPackage (nearskOpt
|
||||
// {
|
||||
mode = "check";
|
||||
});
|
||||
clippy = msrvNaersk.buildPackage (nearskOpt
|
||||
// {
|
||||
mode = "clippy";
|
||||
});
|
||||
default = pkgs.logsmash;
|
||||
};
|
||||
apps.default = packages.default;
|
||||
|
||||
matrix = buildMatrix targets;
|
||||
releaseMatrix = buildMatrix releaseTargets;
|
||||
|
||||
devShells.default = mkShell {
|
||||
nativeBuildInputs = with pkgs; [msrvToolchain rustc bacon cargo-msrv cargo-insta samply];
|
||||
};
|
||||
}
|
||||
)
|
||||
// {
|
||||
overlays.default = import ./nix/overlay.nix;
|
||||
};
|
||||
}
|
||||
3
nix/overlay.nix
Normal file
3
nix/overlay.nix
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
final: prev: {
|
||||
evtype = final.callPackage ./package.nix {};
|
||||
}
|
||||
24
nix/package.nix
Normal file
24
nix/package.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
stdenv,
|
||||
makeRustPlatform,
|
||||
rust-bin,
|
||||
lib,
|
||||
extracted-logs-rust,
|
||||
}: let
|
||||
inherit (lib.sources) sourceByRegex;
|
||||
src = sourceByRegex ../. ["Cargo.*" "(src)(/.*)?"];
|
||||
rustPlatform = makeRustPlatform {
|
||||
cargo = rust-bin.stable.latest.default;
|
||||
rustc = rust-bin.stable.latest.default;
|
||||
};
|
||||
in
|
||||
rustPlatform.buildRustPackage rec {
|
||||
pname = "logsmash";
|
||||
version = "0.1.0";
|
||||
|
||||
inherit src;
|
||||
|
||||
cargoLock = {
|
||||
lockFile = ../Cargo.lock;
|
||||
};
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
use crate::keyboard::{char_to_key, create_device};
|
||||
use evdev::{data, raw, uinput};
|
||||
use evdev::{EventType, InputEvent, Key, Synchronization};
|
||||
use main_error::MainError;
|
||||
use std::fs;
|
||||
use std::fs::Permissions;
|
||||
|
|
@ -8,25 +8,26 @@ use std::os::unix::fs::PermissionsExt;
|
|||
use std::os::unix::net::UnixListener;
|
||||
use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
use evdev::uinput::VirtualDevice;
|
||||
|
||||
mod keyboard;
|
||||
|
||||
const TYPE_DELAY: Duration = Duration::from_millis(10);
|
||||
|
||||
fn type_string(dev: &mut uinput::Device, text: &str) -> Result<(), MainError> {
|
||||
fn type_string(dev: &mut VirtualDevice, text: &str) -> Result<(), MainError> {
|
||||
for c in text.chars() {
|
||||
let (key, shift) = char_to_key(c)?;
|
||||
dev.write(data::KEY, key as u16, 1)?;
|
||||
if shift {
|
||||
dev.write(data::KEY, data::KEY_LEFTSHIFT as u16, 1)?;
|
||||
dev.emit(&[InputEvent::new(EventType::KEY, Key::KEY_LEFTSHIFT.0, 1)])?;
|
||||
}
|
||||
dev.write(data::SYNCHRONIZATION, data::SYN_REPORT as u16, 0)?;
|
||||
dev.emit(&[InputEvent::new(EventType::KEY, key.0, 1)])?;
|
||||
dev.emit(&[InputEvent::new(EventType::SYNCHRONIZATION, Synchronization::SYN_REPORT.0, 1)])?;
|
||||
sleep(TYPE_DELAY);
|
||||
dev.write(data::KEY, key as u16, 0)?;
|
||||
dev.emit(&[InputEvent::new(EventType::KEY, key.0, 0)])?;
|
||||
if shift {
|
||||
dev.write(data::KEY, data::KEY_LEFTSHIFT as u16, 0)?;
|
||||
dev.emit(&[InputEvent::new(EventType::KEY, Key::KEY_LEFTSHIFT.0, 0)])?;
|
||||
}
|
||||
dev.write(data::SYNCHRONIZATION, data::SYN_REPORT as u16, 0)?;
|
||||
dev.emit(&[InputEvent::new(EventType::SYNCHRONIZATION, Synchronization::SYN_REPORT.0, 0)])?;
|
||||
sleep(TYPE_DELAY);
|
||||
}
|
||||
Ok(())
|
||||
|
|
|
|||
411
src/keyboard.rs
411
src/keyboard.rs
|
|
@ -1,219 +1,210 @@
|
|||
use evdev::raw::uinput_setup;
|
||||
use evdev::{
|
||||
data,
|
||||
uinput::{Builder, Device},
|
||||
uinput_ioctl,
|
||||
};
|
||||
use evdev::{AttributeSet, Key};
|
||||
use evdev::uinput::{VirtualDevice, VirtualDeviceBuilder};
|
||||
use main_error::MainError;
|
||||
|
||||
pub fn char_to_key(c: char) -> Result<(data::Key, bool), MainError> {
|
||||
pub fn char_to_key(c: char) -> Result<(Key, bool), MainError> {
|
||||
match c {
|
||||
'0' => Ok((data::KEY_0, false)),
|
||||
'1' => Ok((data::KEY_1, false)),
|
||||
'2' => Ok((data::KEY_2, false)),
|
||||
'3' => Ok((data::KEY_3, false)),
|
||||
'4' => Ok((data::KEY_4, false)),
|
||||
'5' => Ok((data::KEY_5, false)),
|
||||
'6' => Ok((data::KEY_6, false)),
|
||||
'7' => Ok((data::KEY_7, false)),
|
||||
'8' => Ok((data::KEY_8, false)),
|
||||
'9' => Ok((data::KEY_9, false)),
|
||||
')' => Ok((data::KEY_0, true)),
|
||||
'!' => Ok((data::KEY_1, true)),
|
||||
'@' => Ok((data::KEY_2, true)),
|
||||
'#' => Ok((data::KEY_3, true)),
|
||||
'$' => Ok((data::KEY_4, true)),
|
||||
'%' => Ok((data::KEY_5, true)),
|
||||
'^' => Ok((data::KEY_6, true)),
|
||||
'&' => Ok((data::KEY_7, true)),
|
||||
'*' => Ok((data::KEY_8, true)),
|
||||
'(' => Ok((data::KEY_9, true)),
|
||||
'A' => Ok((data::KEY_A, true)),
|
||||
'B' => Ok((data::KEY_B, true)),
|
||||
'C' => Ok((data::KEY_C, true)),
|
||||
'D' => Ok((data::KEY_D, true)),
|
||||
'E' => Ok((data::KEY_E, true)),
|
||||
'F' => Ok((data::KEY_F, true)),
|
||||
'G' => Ok((data::KEY_G, true)),
|
||||
'H' => Ok((data::KEY_H, true)),
|
||||
'I' => Ok((data::KEY_I, true)),
|
||||
'J' => Ok((data::KEY_J, true)),
|
||||
'K' => Ok((data::KEY_K, true)),
|
||||
'L' => Ok((data::KEY_L, true)),
|
||||
'M' => Ok((data::KEY_M, true)),
|
||||
'N' => Ok((data::KEY_N, true)),
|
||||
'O' => Ok((data::KEY_O, true)),
|
||||
'P' => Ok((data::KEY_P, true)),
|
||||
'Q' => Ok((data::KEY_Q, true)),
|
||||
'R' => Ok((data::KEY_R, true)),
|
||||
'S' => Ok((data::KEY_S, true)),
|
||||
'T' => Ok((data::KEY_T, true)),
|
||||
'U' => Ok((data::KEY_U, true)),
|
||||
'V' => Ok((data::KEY_V, true)),
|
||||
'W' => Ok((data::KEY_W, true)),
|
||||
'X' => Ok((data::KEY_X, true)),
|
||||
'Y' => Ok((data::KEY_Y, true)),
|
||||
'Z' => Ok((data::KEY_Z, true)),
|
||||
'a' => Ok((data::KEY_A, false)),
|
||||
'b' => Ok((data::KEY_B, false)),
|
||||
'c' => Ok((data::KEY_C, false)),
|
||||
'd' => Ok((data::KEY_D, false)),
|
||||
'e' => Ok((data::KEY_E, false)),
|
||||
'f' => Ok((data::KEY_F, false)),
|
||||
'g' => Ok((data::KEY_G, false)),
|
||||
'h' => Ok((data::KEY_H, false)),
|
||||
'i' => Ok((data::KEY_I, false)),
|
||||
'j' => Ok((data::KEY_J, false)),
|
||||
'k' => Ok((data::KEY_K, false)),
|
||||
'l' => Ok((data::KEY_L, false)),
|
||||
'm' => Ok((data::KEY_M, false)),
|
||||
'n' => Ok((data::KEY_N, false)),
|
||||
'o' => Ok((data::KEY_O, false)),
|
||||
'p' => Ok((data::KEY_P, false)),
|
||||
'q' => Ok((data::KEY_Q, false)),
|
||||
'r' => Ok((data::KEY_R, false)),
|
||||
's' => Ok((data::KEY_S, false)),
|
||||
't' => Ok((data::KEY_T, false)),
|
||||
'u' => Ok((data::KEY_U, false)),
|
||||
'v' => Ok((data::KEY_V, false)),
|
||||
'w' => Ok((data::KEY_W, false)),
|
||||
'x' => Ok((data::KEY_X, false)),
|
||||
'y' => Ok((data::KEY_Y, false)),
|
||||
'z' => Ok((data::KEY_Z, false)),
|
||||
'-' => Ok((data::KEY_MINUS, false)),
|
||||
'_' => Ok((data::KEY_MINUS, true)),
|
||||
'=' => Ok((data::KEY_EQUAL, false)),
|
||||
'+' => Ok((data::KEY_EQUAL, true)),
|
||||
',' => Ok((data::KEY_COMMA, false)),
|
||||
'<' => Ok((data::KEY_COMMA, true)),
|
||||
'.' => Ok((data::KEY_DOT, false)),
|
||||
'>' => Ok((data::KEY_DOT, true)),
|
||||
'[' => Ok((data::KEY_LEFTBRACE, false)),
|
||||
'{' => Ok((data::KEY_LEFTBRACE, true)),
|
||||
']' => Ok((data::KEY_RIGHTBRACE, false)),
|
||||
'}' => Ok((data::KEY_RIGHTBRACE, true)),
|
||||
';' => Ok((data::KEY_SEMICOLON, false)),
|
||||
':' => Ok((data::KEY_SEMICOLON, true)),
|
||||
'\'' => Ok((data::KEY_APOSTROPHE, false)),
|
||||
'"' => Ok((data::KEY_APOSTROPHE, true)),
|
||||
'`' => Ok((data::KEY_GRAVE, false)),
|
||||
'~' => Ok((data::KEY_GRAVE, true)),
|
||||
'\\' => Ok((data::KEY_BACKSLASH, false)),
|
||||
'|' => Ok((data::KEY_BACKSLASH, true)),
|
||||
'/' => Ok((data::KEY_SLASH, false)),
|
||||
'?' => Ok((data::KEY_SLASH, true)),
|
||||
' ' => Ok((data::KEY_SPACE, false)),
|
||||
'\n' => Ok((data::KEY_ENTER, false)),
|
||||
'0' => Ok((Key::KEY_0, false)),
|
||||
'1' => Ok((Key::KEY_1, false)),
|
||||
'2' => Ok((Key::KEY_2, false)),
|
||||
'3' => Ok((Key::KEY_3, false)),
|
||||
'4' => Ok((Key::KEY_4, false)),
|
||||
'5' => Ok((Key::KEY_5, false)),
|
||||
'6' => Ok((Key::KEY_6, false)),
|
||||
'7' => Ok((Key::KEY_7, false)),
|
||||
'8' => Ok((Key::KEY_8, false)),
|
||||
'9' => Ok((Key::KEY_9, false)),
|
||||
')' => Ok((Key::KEY_0, true)),
|
||||
'!' => Ok((Key::KEY_1, true)),
|
||||
'@' => Ok((Key::KEY_2, true)),
|
||||
'#' => Ok((Key::KEY_3, true)),
|
||||
'$' => Ok((Key::KEY_4, true)),
|
||||
'%' => Ok((Key::KEY_5, true)),
|
||||
'^' => Ok((Key::KEY_6, true)),
|
||||
'&' => Ok((Key::KEY_7, true)),
|
||||
'*' => Ok((Key::KEY_8, true)),
|
||||
'(' => Ok((Key::KEY_9, true)),
|
||||
'A' => Ok((Key::KEY_A, true)),
|
||||
'B' => Ok((Key::KEY_B, true)),
|
||||
'C' => Ok((Key::KEY_C, true)),
|
||||
'D' => Ok((Key::KEY_D, true)),
|
||||
'E' => Ok((Key::KEY_E, true)),
|
||||
'F' => Ok((Key::KEY_F, true)),
|
||||
'G' => Ok((Key::KEY_G, true)),
|
||||
'H' => Ok((Key::KEY_H, true)),
|
||||
'I' => Ok((Key::KEY_I, true)),
|
||||
'J' => Ok((Key::KEY_J, true)),
|
||||
'K' => Ok((Key::KEY_K, true)),
|
||||
'L' => Ok((Key::KEY_L, true)),
|
||||
'M' => Ok((Key::KEY_M, true)),
|
||||
'N' => Ok((Key::KEY_N, true)),
|
||||
'O' => Ok((Key::KEY_O, true)),
|
||||
'P' => Ok((Key::KEY_P, true)),
|
||||
'Q' => Ok((Key::KEY_Q, true)),
|
||||
'R' => Ok((Key::KEY_R, true)),
|
||||
'S' => Ok((Key::KEY_S, true)),
|
||||
'T' => Ok((Key::KEY_T, true)),
|
||||
'U' => Ok((Key::KEY_U, true)),
|
||||
'V' => Ok((Key::KEY_V, true)),
|
||||
'W' => Ok((Key::KEY_W, true)),
|
||||
'X' => Ok((Key::KEY_X, true)),
|
||||
'Y' => Ok((Key::KEY_Y, true)),
|
||||
'Z' => Ok((Key::KEY_Z, true)),
|
||||
'a' => Ok((Key::KEY_A, false)),
|
||||
'b' => Ok((Key::KEY_B, false)),
|
||||
'c' => Ok((Key::KEY_C, false)),
|
||||
'd' => Ok((Key::KEY_D, false)),
|
||||
'e' => Ok((Key::KEY_E, false)),
|
||||
'f' => Ok((Key::KEY_F, false)),
|
||||
'g' => Ok((Key::KEY_G, false)),
|
||||
'h' => Ok((Key::KEY_H, false)),
|
||||
'i' => Ok((Key::KEY_I, false)),
|
||||
'j' => Ok((Key::KEY_J, false)),
|
||||
'k' => Ok((Key::KEY_K, false)),
|
||||
'l' => Ok((Key::KEY_L, false)),
|
||||
'm' => Ok((Key::KEY_M, false)),
|
||||
'n' => Ok((Key::KEY_N, false)),
|
||||
'o' => Ok((Key::KEY_O, false)),
|
||||
'p' => Ok((Key::KEY_P, false)),
|
||||
'q' => Ok((Key::KEY_Q, false)),
|
||||
'r' => Ok((Key::KEY_R, false)),
|
||||
's' => Ok((Key::KEY_S, false)),
|
||||
't' => Ok((Key::KEY_T, false)),
|
||||
'u' => Ok((Key::KEY_U, false)),
|
||||
'v' => Ok((Key::KEY_V, false)),
|
||||
'w' => Ok((Key::KEY_W, false)),
|
||||
'x' => Ok((Key::KEY_X, false)),
|
||||
'y' => Ok((Key::KEY_Y, false)),
|
||||
'z' => Ok((Key::KEY_Z, false)),
|
||||
'-' => Ok((Key::KEY_MINUS, false)),
|
||||
'_' => Ok((Key::KEY_MINUS, true)),
|
||||
'=' => Ok((Key::KEY_EQUAL, false)),
|
||||
'+' => Ok((Key::KEY_EQUAL, true)),
|
||||
',' => Ok((Key::KEY_COMMA, false)),
|
||||
'<' => Ok((Key::KEY_COMMA, true)),
|
||||
'.' => Ok((Key::KEY_DOT, false)),
|
||||
'>' => Ok((Key::KEY_DOT, true)),
|
||||
'[' => Ok((Key::KEY_LEFTBRACE, false)),
|
||||
'{' => Ok((Key::KEY_LEFTBRACE, true)),
|
||||
']' => Ok((Key::KEY_RIGHTBRACE, false)),
|
||||
'}' => Ok((Key::KEY_RIGHTBRACE, true)),
|
||||
';' => Ok((Key::KEY_SEMICOLON, false)),
|
||||
':' => Ok((Key::KEY_SEMICOLON, true)),
|
||||
'\'' => Ok((Key::KEY_APOSTROPHE, false)),
|
||||
'"' => Ok((Key::KEY_APOSTROPHE, true)),
|
||||
'`' => Ok((Key::KEY_GRAVE, false)),
|
||||
'~' => Ok((Key::KEY_GRAVE, true)),
|
||||
'\\' => Ok((Key::KEY_BACKSLASH, false)),
|
||||
'|' => Ok((Key::KEY_BACKSLASH, true)),
|
||||
'/' => Ok((Key::KEY_SLASH, false)),
|
||||
'?' => Ok((Key::KEY_SLASH, true)),
|
||||
' ' => Ok((Key::KEY_SPACE, false)),
|
||||
'\n' => Ok((Key::KEY_ENTER, false)),
|
||||
_ => Err("Invalid character".to_string().into()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_device() -> Result<Device, MainError> {
|
||||
let mut conf = uinput_setup::default();
|
||||
conf.set_name("EvType")?;
|
||||
conf.id.bustype = 0x16;
|
||||
conf.id.vendor = 69;
|
||||
conf.id.product = 69;
|
||||
pub fn create_device() -> Result<VirtualDevice, MainError> {
|
||||
let keys = &[
|
||||
Key::KEY_0,
|
||||
Key::KEY_1,
|
||||
Key::KEY_2,
|
||||
Key::KEY_3,
|
||||
Key::KEY_4,
|
||||
Key::KEY_5,
|
||||
Key::KEY_6,
|
||||
Key::KEY_7,
|
||||
Key::KEY_8,
|
||||
Key::KEY_9,
|
||||
Key::KEY_0,
|
||||
Key::KEY_1,
|
||||
Key::KEY_2,
|
||||
Key::KEY_3,
|
||||
Key::KEY_4,
|
||||
Key::KEY_5,
|
||||
Key::KEY_6,
|
||||
Key::KEY_7,
|
||||
Key::KEY_8,
|
||||
Key::KEY_9,
|
||||
Key::KEY_A,
|
||||
Key::KEY_B,
|
||||
Key::KEY_C,
|
||||
Key::KEY_D,
|
||||
Key::KEY_E,
|
||||
Key::KEY_F,
|
||||
Key::KEY_G,
|
||||
Key::KEY_H,
|
||||
Key::KEY_I,
|
||||
Key::KEY_J,
|
||||
Key::KEY_K,
|
||||
Key::KEY_L,
|
||||
Key::KEY_M,
|
||||
Key::KEY_N,
|
||||
Key::KEY_O,
|
||||
Key::KEY_P,
|
||||
Key::KEY_Q,
|
||||
Key::KEY_R,
|
||||
Key::KEY_S,
|
||||
Key::KEY_T,
|
||||
Key::KEY_U,
|
||||
Key::KEY_V,
|
||||
Key::KEY_W,
|
||||
Key::KEY_X,
|
||||
Key::KEY_Y,
|
||||
Key::KEY_Z,
|
||||
Key::KEY_A,
|
||||
Key::KEY_B,
|
||||
Key::KEY_C,
|
||||
Key::KEY_D,
|
||||
Key::KEY_E,
|
||||
Key::KEY_F,
|
||||
Key::KEY_G,
|
||||
Key::KEY_H,
|
||||
Key::KEY_I,
|
||||
Key::KEY_J,
|
||||
Key::KEY_K,
|
||||
Key::KEY_L,
|
||||
Key::KEY_M,
|
||||
Key::KEY_N,
|
||||
Key::KEY_O,
|
||||
Key::KEY_P,
|
||||
Key::KEY_Q,
|
||||
Key::KEY_R,
|
||||
Key::KEY_S,
|
||||
Key::KEY_T,
|
||||
Key::KEY_U,
|
||||
Key::KEY_V,
|
||||
Key::KEY_W,
|
||||
Key::KEY_X,
|
||||
Key::KEY_Y,
|
||||
Key::KEY_Z,
|
||||
Key::KEY_MINUS,
|
||||
Key::KEY_MINUS,
|
||||
Key::KEY_EQUAL,
|
||||
Key::KEY_EQUAL,
|
||||
Key::KEY_COMMA,
|
||||
Key::KEY_COMMA,
|
||||
Key::KEY_DOT,
|
||||
Key::KEY_DOT,
|
||||
Key::KEY_LEFTBRACE,
|
||||
Key::KEY_LEFTBRACE,
|
||||
Key::KEY_RIGHTBRACE,
|
||||
Key::KEY_RIGHTBRACE,
|
||||
Key::KEY_SEMICOLON,
|
||||
Key::KEY_SEMICOLON,
|
||||
Key::KEY_APOSTROPHE,
|
||||
Key::KEY_APOSTROPHE,
|
||||
Key::KEY_GRAVE,
|
||||
Key::KEY_GRAVE,
|
||||
Key::KEY_BACKSLASH,
|
||||
Key::KEY_BACKSLASH,
|
||||
Key::KEY_SLASH,
|
||||
Key::KEY_SLASH,
|
||||
Key::KEY_SPACE,
|
||||
Key::KEY_ENTER,
|
||||
].iter().collect::<AttributeSet<_>>();
|
||||
|
||||
let builder = Builder::new(&std::path::Path::new("/dev/uinput"))?;
|
||||
|
||||
uinput_ioctl!(ui_set_evbit(builder.fd(), data::KEY.number()))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_0 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_1 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_2 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_3 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_4 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_5 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_6 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_7 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_8 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_9 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_0 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_1 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_2 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_3 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_4 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_5 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_6 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_7 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_8 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_9 as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_A as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_B as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_C as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_D as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_E as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_F as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_G as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_H as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_I as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_J as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_K as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_L as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_M as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_N as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_O as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_P as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_Q as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_R as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_S as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_T as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_U as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_V as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_W as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_X as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_Y as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_Z as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_A as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_B as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_C as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_D as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_E as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_F as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_G as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_H as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_I as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_J as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_K as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_L as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_M as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_N as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_O as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_P as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_Q as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_R as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_S as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_T as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_U as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_V as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_W as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_X as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_Y as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_Z as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_MINUS as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_MINUS as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_EQUAL as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_EQUAL as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_COMMA as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_COMMA as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_DOT as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_DOT as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_LEFTBRACE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_LEFTBRACE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_RIGHTBRACE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_RIGHTBRACE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_SEMICOLON as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_SEMICOLON as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_APOSTROPHE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_APOSTROPHE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_GRAVE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_GRAVE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_BACKSLASH as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_BACKSLASH as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_SLASH as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_SLASH as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_SPACE as i32))?;
|
||||
uinput_ioctl!(ui_set_keybit(builder.fd(), data::KEY_ENTER as i32))?;
|
||||
|
||||
Ok(builder.setup(conf)?)
|
||||
Ok(VirtualDeviceBuilder::new()?.name("EvType virtual keyboard")
|
||||
.with_keys(&keys)?
|
||||
.build()?)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue