
Bamboo Ink Penの上キーを押すとコマンドを実行しようとしました。ボタンを押したときに接続が停止し、ボタンを離したときにBluetooth経由で接続されたことに気づきました。
私は倒れましたBluetoothデバイスが接続されたときにスクリプトを実行する私が走るとき
udevadm monitor --environment --udev --kernel --property
ボタンを1回押すと、次のような結果が出力されます。
KERNEL[5118.647193] add /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585 (bluetooth)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585
SUBSYSTEM=bluetooth
DEVTYPE=link
SEQNUM=4094
UDEV [5118.657098] add /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585 (bluetooth)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585
SUBSYSTEM=bluetooth
DEVTYPE=link
SEQNUM=4094
USEC_INITIALIZED=5118654305
SYSTEMD_ALIAS=/sys/subsystem/bluetooth/devices/hci0:3585
SYSTEMD_WANTS=bluetooth.target
SYSTEMD_USER_WANTS=bluetooth.target
TAGS=:systemd:
KERNEL[5119.311809] remove /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585 (bluetooth)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585
SUBSYSTEM=bluetooth
DEVTYPE=link
SEQNUM=4095
UDEV [5119.317304] remove /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585 (bluetooth)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585
SUBSYSTEM=bluetooth
DEVTYPE=link
SEQNUM=4095
USEC_INITIALIZED=5118654305
SYSTEMD_ALIAS=/sys/subsystem/bluetooth/devices/hci0:3585
SYSTEMD_WANTS=bluetooth.target
SYSTEMD_USER_WANTS=bluetooth.target
TAGS=:systemd:
残念ながら、idVendorやidProductはありません。
私が走るとき
sudo tail -f /var/log/syslog
ところで、ファイルがないと思います。
udev rules
これまでの私の姿はこんな感じです。
# Run a program when my Bamboo Ink is connected
ACTION=="add" , SUBSYSTEM=="bluetooth", ATTR{idVendor}=="xxx", ATTR{idProduct}=="yyy", ATTRS{model}=="Bamboo Ink", RUN+="xournalpp"
この行を で発見した以来、モデル番号が「竹インク」であると推測されます。journalctl -b
Feb 26 14:57:35 X380-Yoga kernel: wacom 0005:056A:035F.000C: Unknown device_type for 'Bamboo Ink'. Ignoring.
そのため、idVendor、idProduct、modelを見つける必要があります。別の方法がありますか?
答え1
これが私がする方法です:
ACTION=="add" , SUBSYSTEM=="bluetooth", DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0/bluetooth/hci0/hci0:3585", RUN+="/home/gvb/bin/run-pen-state.sh"
私がしたいのは、Xournalでペンと消しゴムを切り替えることです。 2つの必須スクリプトを以下に示します。 wmctrlとxdotoolという2つの小さなユーティリティが必要です。
「run-pen-state.sh」の内容は次のとおりです。
#!/bin/csh
sudo -u gvb -i /home/gvb/bin/pen-state
そして「ペン状態」自体が
#!/usr/bin/perl -w
$home=$ENV{'HOME'};
$store=`grep "#state: " ~/bin/pen-state | grep -v store`;
chomp($store);
$command=`export DISPLAY=:0; export XAUTHORITY=$home/.Xauthority; wmctrl -l`;
foreach $line (split(/\n/,$command)){
if (($line=~ /Xournal/)&&($line=~ /$filename/)){
$winid=(split(/ /,$line))[0];
}
}
if($winid){
system("export DISPLAY=:0; export XAUTHORITY=$home/.Xauthority; wmctrl -i -a $winid");
if($store =~ /pen/){
$now="state: eraser";
system("export DISPLAY=:0; export XAUTHORITY=$home/.Xauthority; xdotool key shift+ctrl+e");
}else{
$now="state: pen";
system("export DISPLAY=:0; export XAUTHORITY=$home/.Xauthority; xdotool key shift+ctrl+p");
}
$now="#$now";
print "$store\n";
print "$now\n";
open(SELF,"$home/bin/pen-state");
read(SELF,$self,-s "$home/bin/pen-state",0);
close(SELF);
$self=~ s/$store/$now/;
open(SELF,">$home/bin/pen-state");
print SELF $self;
close(SELF);
}
#state: pen
答え2
2022年2月に更新されました:
Ubuntu 22.04、Kernel 5.16.8、Gnome 41.3ではすぐに動作することがわかりました。上部ボタンはSuper+AudioMicMuteの組み合わせで検出され、それを使用してGnome設定でショートカットキーを割り当てることができます。しかし、いつ作業が始まるかはわかりません。
元の答え:
私のアプローチはGuillaumeの以前の答えとほぼ同じです。しかし、彼の答えの問題は、どのデバイスがBluetoothサブシステムの追加操作をトリガしたかを区別する方法が見つからないことです。したがって、Bluetooth経由で他のデバイスを接続する場合、Guillaumeの簡単なルールも一致します。しかし、Lenovo Active Pen 2を使用しながらトップボタンを押すたびに、2つのうちの1つの現象が発生することがわかりました。
ケース1)ペンが1〜2秒以内に接続され、接続が切断されます。udevadm monitor
追加および削除操作のみが表示されます。
ケース 2) udev 追加操作後、ペン名が HID として認識されます。Lenovo Active Pen2キーボード。その後、削除に約10秒かかります。
ACTION=="add", SUBSYSTEM=="bluetooth", DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585", RUN+="/usr/local/bin/bluetooth_event_detected.sh add"
ACTION=="remove", SUBSYSTEM=="bluetooth", DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3585", RUN+="/usr/local/bin/bluetooth_event_detected.sh remove"
ACTION=="add", SUBSYSTEM=="hid", DEVPATH=="/devices/virtual/misc/uhid/0005:17EF:60A8.*", RUN+="/usr/local/bin/bluetooth_event_detected.sh force"
したがって、追加イベントと次の削除イベントの間に必要な時間を計算するスクリプトをトリガーするudevルールで、追加および削除操作を監視します。 2秒未満の場合はペンと仮定し、下にフラグを設定します/tmp/stylus
。ペンがHIDとして認識されても同じ現象が発生します。
#!/bin/bash
# PATH is not provided in an udev environment
PATH=/bin:/usr/bin:/usr/local/bin
DIRECTORY=/tmp/stylus
TSFILE=$DIRECTORY/bluetooth_timestamp
BTN_PRESSED_FLAG=$DIRECTORY/stylus_button_pressed
TIME_DELTA="2"
ACTION=$1
NOW=$(date +%s)
mkdir -p $DIRECTORY
chmod 777 $DIRECTORY
if [ "$ACTION" = "add" ]; then
echo $NOW > $TSFILE
elif [ "$ACTION" = "remove" ]; then
ADDED_TS=$(cat $TSFILE)
DIFF=$(($NOW-$ADDED_TS))
echo diff: $DIFF
# if the time between adding and removing is
# 2 seconds or less, we assume the stylus button
# was pressed
if [ "$DIFF" -le "$TIME_DELTA" ]; then
touch $BTN_PRESSED_FLAG
chmod 666 $BTN_PRESSED_FLAG
fi
elif [ "$ACTION" = "force" ]; then
touch $BTN_PRESSED_FLAG
chmod 666 $BTN_PRESSED_FLAG
fi
最後に、デスクトップ環境にログインすると自動的に起動し、継続的/tmp/stylus
にgnome-screenshot -i
。
#!/bin/bash
FILE=/tmp/stylus/stylus_button_pressed
CMD="gnome-screenshot -i"
while true; do
if [ -f $FILE ]; then
echo running command
$CMD
rm $FILE
fi
sleep 0.1
done
エレガントではありませんが、動作します。