Bamboo Inkペンの上ボタンを押したときにどのようにコマンドを実行しますか?

Bamboo Inkペンの上ボタンを押したときにどのようにコマンドを実行しますか?

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/stylusgnome-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

エレガントではありませんが、動作します。

関連情報