xinput yubikey
This commit is contained in:
parent
7b0067ca9b
commit
bcb6cfdd44
3 changed files with 185 additions and 1 deletions
|
|
@ -53,6 +53,7 @@ bindsym $mod+Shift+c kill
|
||||||
bindsym $mod+d exec i3-dmenu-desktop --dmenu='rofi -dmenu'
|
bindsym $mod+d exec i3-dmenu-desktop --dmenu='rofi -dmenu'
|
||||||
|
|
||||||
bindsym $mod+F12 exec xscreensaver-command -lock
|
bindsym $mod+F12 exec xscreensaver-command -lock
|
||||||
|
bindsym $mod+Shift+y exec xinput-toggle -r yubikey -n -e -t 10
|
||||||
# There also is the (new) i3-dmenu-desktop which only displays applications
|
# There also is the (new) i3-dmenu-desktop which only displays applications
|
||||||
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
|
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
|
||||||
# installed.
|
# installed.
|
||||||
|
|
@ -135,7 +136,7 @@ bindsym $mod+Shift+9 move container to workspace 9
|
||||||
bindsym $mod+Shift+0 move container to workspace 10
|
bindsym $mod+Shift+0 move container to workspace 10
|
||||||
|
|
||||||
# reload the configuration file
|
# reload the configuration file
|
||||||
bindsym $mod+Shift+y reload
|
bindsym $mod+Shift+t reload
|
||||||
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
||||||
bindsym $mod+Shift+r restart
|
bindsym $mod+Shift+r restart
|
||||||
# exit i3 (logs you out of your X session)
|
# exit i3 (logs you out of your X session)
|
||||||
|
|
|
||||||
2
.xinitrc
2
.xinitrc
|
|
@ -34,6 +34,8 @@ if [ -f ~/.xrandrrc ]; then
|
||||||
~/.xrandrrc
|
~/.xrandrrc
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
./xinput-toggle -r yubikey -d
|
||||||
|
|
||||||
~/.fehbg &
|
~/.fehbg &
|
||||||
if command -v compton &>/dev/null; then
|
if command -v compton &>/dev/null; then
|
||||||
compton -b --config ~/.compton.conf &
|
compton -b --config ~/.compton.conf &
|
||||||
|
|
|
||||||
181
bin/xinput-toggle
Executable file
181
bin/xinput-toggle
Executable file
|
|
@ -0,0 +1,181 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
debug() {
|
||||||
|
# DEBUG comes from the environment
|
||||||
|
if (( DEBUG )); then
|
||||||
|
printf '%s\n' "$@" >&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
is_enabled() {
|
||||||
|
local id="${1?}"
|
||||||
|
enabled=$(
|
||||||
|
xinput list-props "$id" |
|
||||||
|
grep '\bDevice Enabled\b' | sed 's/.*\(.\)$/\1/'
|
||||||
|
)
|
||||||
|
# xinput returns 0 for disabled and 1 for enabled, so we invert since we
|
||||||
|
# pass on 0
|
||||||
|
return "$(( !enabled ))"
|
||||||
|
}
|
||||||
|
|
||||||
|
should_disable() {
|
||||||
|
local id="${1?}"
|
||||||
|
local force_enable="${2?}"
|
||||||
|
local force_disable="${3?}"
|
||||||
|
|
||||||
|
if (( force_enable )) && (( force_disable )); then
|
||||||
|
echo '-d and -e make no sense together' >&2
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( force_enable )); then
|
||||||
|
return 1
|
||||||
|
elif (( force_disable )); then
|
||||||
|
return 0
|
||||||
|
elif is_enabled "$id"; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_id_for_device_name() {
|
||||||
|
local name="${1?}"
|
||||||
|
xinput list "$name" | sed -n 's/.*id=\([0-9]\+\).*/\1/p'
|
||||||
|
}
|
||||||
|
|
||||||
|
show_help() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: ${0##*/} [-n]
|
||||||
|
|
||||||
|
Enable and disable xinput devices.
|
||||||
|
|
||||||
|
-d disable only, do not toggle
|
||||||
|
-e enable only, do not toggle
|
||||||
|
-h show this help page
|
||||||
|
-i XID only operate on device with xinput id XID
|
||||||
|
-r REGEX only operate on devices matching name REGEX
|
||||||
|
-n show results using notify-send in addition to stdout
|
||||||
|
-p print what we would do, but don't actually do it
|
||||||
|
-t SECONDS revert enable/disable after SECONDS seconds, ie. if you were
|
||||||
|
enabling, after SECONDS seconds it will be disabled again.
|
||||||
|
SECONDS must be an integer greater than 0
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
act_on_device() {
|
||||||
|
local print="${1?}"
|
||||||
|
local notify="${2?}"
|
||||||
|
local timeout="${3?}"
|
||||||
|
local xinput_action="${4?}"
|
||||||
|
local our_next_flag="${5?}"
|
||||||
|
local id="${6?}"
|
||||||
|
|
||||||
|
if (( print )); then
|
||||||
|
echo "Would $xinput_action device with id $id"
|
||||||
|
else
|
||||||
|
xinput -"$xinput_action" "$id"
|
||||||
|
|
||||||
|
if (( notify )); then
|
||||||
|
notify-send "${xinput_action^}d device with id $id"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( timeout )); then
|
||||||
|
debug "Added timeout $timeout"
|
||||||
|
{
|
||||||
|
sleep "$timeout"
|
||||||
|
# TODO: Make args_without_timeour_or_force non-global (sigh,
|
||||||
|
# shell makes this difficult due to pass by value)
|
||||||
|
"$0" "${args_without_timeout_or_force[@]}" \
|
||||||
|
"$our_next_flag" -i "$id"
|
||||||
|
} &
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
notify=0
|
||||||
|
force_enable=0
|
||||||
|
force_disable=0
|
||||||
|
timeout=0
|
||||||
|
print=0
|
||||||
|
only_xid=0
|
||||||
|
input_ids=()
|
||||||
|
args_without_timeout_or_force=()
|
||||||
|
|
||||||
|
while getopts dehi:npr:t: opt; do
|
||||||
|
# We need to get a list of args without timeout/force for when we execute
|
||||||
|
# timeout reversions. This is a blacklist of things we should not put in
|
||||||
|
# the array, since they force enable/disable/name or do the timeout itself.
|
||||||
|
case "$opt" in
|
||||||
|
d|e|t|r)
|
||||||
|
: # Blacklisted
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
args_without_timeout_or_force+=( -"$opt" )
|
||||||
|
if [[ $OPTARG ]]; then
|
||||||
|
args_without_timeout_or_force+=( "$OPTARG" )
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "$opt" in
|
||||||
|
'd') force_disable=1 ;;
|
||||||
|
'e') force_enable=1 ;;
|
||||||
|
'n') notify=1 ;;
|
||||||
|
'i') only_xid="$OPTARG" ;;
|
||||||
|
'h')
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
'p') print=1 ;;
|
||||||
|
'r') regex="$OPTARG" ;;
|
||||||
|
't') timeout="$OPTARG" ;;
|
||||||
|
'?')
|
||||||
|
show_help >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( only_xid )) && [[ "$regex" ]]; then
|
||||||
|
echo '-r and -i cannot be currently used together' >&2
|
||||||
|
exit 4
|
||||||
|
elif ! (( only_xid )) && ! [[ "$regex" ]]; then
|
||||||
|
echo 'either -r or -i must be passed to filter devices' >&2
|
||||||
|
exit 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( only_xid )); then
|
||||||
|
input_ids=( "$only_xid" )
|
||||||
|
else
|
||||||
|
mapfile -t matched_device_names < <(
|
||||||
|
xinput list |
|
||||||
|
sed -n 's/.*↳ \(.\+\)id=.*\[slave.*/\1/p' |
|
||||||
|
sed 's/[\t ]*$//' |
|
||||||
|
grep -i -- "$regex"
|
||||||
|
)
|
||||||
|
|
||||||
|
debug 'Matched device names:' "${matched_device_names[@]}"
|
||||||
|
|
||||||
|
for name in "${matched_device_names[@]}"; do
|
||||||
|
input_ids+=( "$(get_id_for_device_name "$name")" )
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( "${#input_ids[@]}" == 0 )); then
|
||||||
|
msg='No matching devices found'
|
||||||
|
echo "$msg" >&2
|
||||||
|
(( notify )) && notify-send "$msg"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
for id in "${input_ids[@]}"; do
|
||||||
|
if should_disable "$id" "$force_enable" "$force_disable"; then
|
||||||
|
act_on_device "$print" "$notify" "$timeout" disable -e "$id"
|
||||||
|
else
|
||||||
|
act_on_device "$print" "$notify" "$timeout" enable -d "$id"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# We may have queued some timeout reversion jobs
|
||||||
|
wait
|
||||||
Loading…
Add table
Add a link
Reference in a new issue