VersaPro Eシリーズ タイプVRのキーボードショートカットを有効にする on Linux

VersaPro Eシリーズ タイプVRについて、Linuxで運用しているとマイクミュートキーが働かないことに気づいた。他にも以下のキーが反応しない

libinput debug-eventsだとかevtestだとかwevだとかを駆使して、色々調査した結果、おなじみのhwdbをいじって解決するのが良いということになった。

Fn-F4とFn-F11の両方がキーストローク全体で一つのイベントしか発生させないので!をつける必要がある。あとhwdbで素直にmicmuteキーに割り当ててしまうとなんかうまく動かないらしいのでF20に割り当てる。

sudo tee /etc/udev/hwdb.d/70-nec-versapro-e-vr.hwdb << 'EOF'
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnNEC:pnPC-VEE11R5GL5LM:pvr*
 KEYBOARD_KEY_d7=!f20
 KEYBOARD_KEY_97=!battery
 KEYBOARD_KEY_76=f21
EOF

sudo systemd-hwdb update && sudo udevadm trigger --sysname-match="event*"しただけでは、Linuxシステムとしてはキーを認識しても、GNOMEがそれを反映しないらしいので、上のコマンドの後、ログアウトしても問題ない状態にしてからsudo systemctl restart gdmするか、あるいは素直にシステムを再起動するかすると、機内モード以外のショートカットが機能するようになる。

ただし、バッテリボタンについては、ただバッテリの残量を表示するだけなので、そんなに実用性がないのも事実。Windowsと同じように電源モードを切り替えさせるようにしたい。

シェルスクリプトはLLMに書いてもらった。これを~/binなり~/.local/binなりに保存して、chmod +xする。

#!/bin/sh
#  performance -> balanced -> power-saver->...
cur=$(powerprofilesctl get)
case "$cur" in
  power-saver) order="performance balanced power-saver" ;;
  balanced)    order="power-saver performance balanced" ;;
  *)           order="balanced power-saver performance" ;;
esac

for p in $order; do
  powerprofilesctl set "$p" 2>/dev/null && break
done

new=$(powerprofilesctl get)
case "$new" in
  power-saver) label="Power Saver" ;;
  balanced)    label="Balance" ;;
  performance) label="Performance" ;;
  *)           label="$new" ;;
esac

idf="${XDG_RUNTIME_DIR:-/tmp}/eco-toggle.nid"
id=$(cat "$idf" 2>/dev/null)

gdbus call --session \
  --dest org.freedesktop.Notifications \
  --object-path /org/freedesktop/Notifications \
  --method org.freedesktop.Notifications.Notify \
  -- \
  "Power Mode" "${id:-0}" "power-profile-${new}-symbolic" \
  "Power Mode" "$label" "[]" "{'transient': <true>}" -1 \
  | sed -E 's/.*uint32 ([0-9]+).*/\1/' > "$idf"

次に、組み込みのバッテリ残量表示設定を解除する。

gsettings set org.gnome.settings-daemon.plugins.media-keys battery-status-static "[]"

最後に、GNOMEの”Settings”-“Keyboard”-“View and Customize Shortcuts”-“Custom Shortcuts”でBatteryキーを押したときのコマンドとして設定すれば良い。