@@ -0,0 +1,65 @@
|
||||
[
|
||||
(
|
||||
when: All([
|
||||
Match("SUBSYSTEM", "input"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("SCRIPT_INPUT_ID", f("echo $(dirname {RULEFILE})/../scripts/input_id")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
(
|
||||
when: All([
|
||||
Match("SCRIPT_INPUT_ID", ".*"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("ID_INPUT", f("{SCRIPT_INPUT_ID} MODE=ID_INPUT DEVPATH={DEVPATH}")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
(
|
||||
when: All([
|
||||
Match("SCRIPT_INPUT_ID", ".*"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("ID_INPUT_KEYBOARD", f("{SCRIPT_INPUT_ID} MODE=ID_INPUT_KEYBOARD DEVPATH={DEVPATH}")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
(
|
||||
when: All([
|
||||
Match("SCRIPT_INPUT_ID", ".*"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("ID_INPUT_MOUSE", f("{SCRIPT_INPUT_ID} MODE=ID_INPUT_MOUSE DEVPATH={DEVPATH}")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
(
|
||||
when: All([
|
||||
Match("SCRIPT_INPUT_ID", ".*"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("ID_INPUT_TOUCHPAD", f("{SCRIPT_INPUT_ID} MODE=ID_INPUT_TOUCHPAD DEVPATH={DEVPATH}")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
(
|
||||
when: All([
|
||||
Match("SCRIPT_INPUT_ID", ".*"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("ID_INPUT_TOUCHSCREEN", f("{SCRIPT_INPUT_ID} MODE=ID_INPUT_TOUCHSCREEN DEVPATH={DEVPATH}")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
(
|
||||
when: All([
|
||||
Match("SCRIPT_INPUT_ID", ".*"),
|
||||
]),
|
||||
do: [
|
||||
UseProvider("ID_INPUT_JOYSTICK", f("{SCRIPT_INPUT_ID} MODE=ID_INPUT_JOYSTICK DEVPATH={DEVPATH}")),
|
||||
],
|
||||
on_error: Continue,
|
||||
),
|
||||
]
|
||||
Executable
+125
@@ -0,0 +1,125 @@
|
||||
#!/bin/mksh
|
||||
|
||||
# Kernel constant definitions.
|
||||
EV_KEY=1
|
||||
EV_REL=2
|
||||
EV_ABS=3
|
||||
EV_FF=21
|
||||
BTN_MOUSE=272
|
||||
ASCII_KEYS="30 48 46 32 18 33 34 35 23 36 37 38 50 49 24 25 16 19 31 20 22 47 17 45 21 44"
|
||||
INPUT_PROP_POINTER=0
|
||||
INPUT_PROP_DIRECT=1
|
||||
|
||||
# Helper functions
|
||||
bitmap_contains() {
|
||||
hexstr="$1"
|
||||
bitnum="$2"
|
||||
|
||||
char_from_right=$(( bitnum / 4 ))
|
||||
bit_in_char=$(( bitnum % 4 ))
|
||||
|
||||
chars_per_group=16
|
||||
group_index=$(( char_from_right / chars_per_group ))
|
||||
char_in_group=$(( char_from_right % chars_per_group ))
|
||||
|
||||
set -A groups $hexstr
|
||||
n=${#groups[@]}
|
||||
|
||||
idx=$(( n - 1 - group_index ))
|
||||
if [ "$idx" -lt 0 ] || [ "$idx" -ge "$n" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
group=${groups[idx]}
|
||||
|
||||
while [ ${#group} -lt $chars_per_group ]; do
|
||||
group="0$group"
|
||||
done
|
||||
|
||||
pos=$(( chars_per_group - 1 - char_in_group ))
|
||||
ch=${group:$pos:1}
|
||||
|
||||
case "$ch" in
|
||||
0) v=0 ;; 1) v=1 ;; 2) v=2 ;; 3) v=3 ;;
|
||||
4) v=4 ;; 5) v=5 ;; 6) v=6 ;; 7) v=7 ;;
|
||||
8) v=8 ;; 9) v=9 ;;
|
||||
a|A) v=10 ;; b|B) v=11 ;; c|C) v=12 ;; d|D) v=13 ;;
|
||||
e|E) v=14 ;; f|F) v=15 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
|
||||
if [ $(( (v >> bit_in_char) & 1 )) -eq 1 ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
ev_contains() {
|
||||
evstr="$1"
|
||||
evbit="$2"
|
||||
|
||||
evstr=$(print "$evstr" | tr -d ' \t\r\n')
|
||||
|
||||
val=$(( 16#${evstr} ))
|
||||
|
||||
if [ $(( (val >> evbit) & 1 )) -eq 1 ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
export "$@"
|
||||
|
||||
SYSPATH="/sys/${DEVPATH}"
|
||||
if [[ "$SYSPATH" = */event* ]]; then
|
||||
SYSPATH="$SYSPATH/device"
|
||||
fi
|
||||
|
||||
EV=$(cat "$SYSPATH/capabilities/ev")
|
||||
KEY=$(cat "$SYSPATH/capabilities/key")
|
||||
ABS=$(cat "$SYSPATH/capabilities/abs")
|
||||
REL=$(cat "$SYSPATH/capabilities/rel")
|
||||
PROPS=$(cat "$SYSPATH/properties")
|
||||
|
||||
case "$MODE" in
|
||||
ID_INPUT)
|
||||
echo 1
|
||||
;;
|
||||
ID_INPUT_MOUSE)
|
||||
if bitmap_contains "$KEY" "$BTN_MOUSE" && ev_contains "$EV" "$EV_REL" ; then
|
||||
echo 1
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
ID_INPUT_KEYBOARD)
|
||||
for i in $ASCII_KEYS; do
|
||||
if ! bitmap_contains "$KEY" "$i"; then
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
echo 1
|
||||
;;
|
||||
ID_INPUT_TOUCHPAD)
|
||||
if ev_contains "$EV" "$EV_REL" && bitmap_contains "$PROPS" "$INPUT_PROP_POINTER"; then
|
||||
echo 1
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
ID_INPUT_TOUCHSCREEN)
|
||||
if ev_contains "$EV" "$EV_ABS" && bitmap_contains "$PROPS" "$INPUT_PROP_DIRECT"; then
|
||||
echo 1
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
ID_INPUT_JOYSTICK)
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user