xinputを使用したポインタのみのリスト

xinputを使用したポインタのみのリスト

ポインタを特定のモニタに制限するGUIツールを作成しようとしています。たとえば、タッチスクリーンポインタは、すべてのモニタを統合するのではなく、独自の画面にマップする必要があります。このツールはPython(pygtkを使用)で書かれています。

UIの場合は、目的のポインタを選択してから呼び出すことができるように、すべてのポインタを一覧表示する必要がありますxinput map-to-output pointer_id monitor_id。ポインタ以外のデバイスにIDが指定されていると、このコマンドにエラーが発生するため、そのIDを次のように指定したくありません。オプション。

出力はxinput list次のとおりです。

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ELAN Touchscreen                          id=18   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=21   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=22   [slave  pointer  (2)]
⎜   ↳ Cherry USB Optical Mouse Consumer Control id=10   [slave  pointer  (2)]
⎜   ↳ Cherry USB Optical Mouse                  id=12   [slave  pointer  (2)]
⎜   ↳ HID 04b4:3003 Consumer Control            id=14   [slave  pointer  (2)]
⎜   ↳ HID 04b4:3003 Mouse                       id=24   [slave  pointer  (2)]
⎜   ↳          WALTOP     Graphics Tablet  Pen (0)      id=26   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C           id=19   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=20   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=23   [slave  keyboard (3)]
    ↳ Cherry USB Optical Mouse System Control   id=9    [slave  keyboard (3)]
    ↳ Cherry USB Optical Mouse Consumer Control id=11   [slave  keyboard (3)]
    ↳ HID 04b4:3003 System Control              id=13   [slave  keyboard (3)]
    ↳ HID 04b4:3003 Consumer Control            id=15   [slave  keyboard (3)]
    ↳ HID 04b4:3003 Keyboard                    id=16   [slave  keyboard (3)]
    ↳ HID 04b4:3003                             id=17   [slave  keyboard (3)]
    ↳          WALTOP     Graphics Tablet       id=25   [slave  keyboard (3)]

メニューを作成するには、すべてのポインタの名前とIDを取得する必要があります(スレーブポインタのようですが、仮想コアポインタを選択すると何が起こるのかわかりません)。一方では、ポインタではなくIDと名前をフィルタリングする必要があることを除いて、私に必要な正確な情報をxinput list --id-only提供します。xinput list --name-only一方、xinput list | grep pointer関連する行を取得できますが、結果を解析するのは簡単ではありません(外部括弧と奇妙な↳矢印文字があります)。man xinputフィルタリングを実行するか、出力を簡素化するオプションを探しましたが、何も見つかりませんでした。

私のプロジェクトは以下に基づいています。ptxconf、その解決策は次のとおりです。もっとエレガントなものを探したかったです。

    def getPenTouchIds(self):
        """Returns a list of input id/name pairs for all available pen/tablet xinput devices"""
        retval = subprocess.Popen("xinput list", shell=True, stdout=subprocess.PIPE).stdout.read()

        ids = {}
        for line in retval.split("]"):
            if "pointer" in line.lower() and "master" not in line.lower():
                id = int(line.split("id=")[1].split("[")[0].strip())
                name = line.split("id=")[0].split("\xb3",1)[1].strip()
                if self.getPointerDeviceMode(id) == "absolute":
                    ids[name+"(%d)"%id]={"id":id}
        return ids

答え1

時間をあまり取らなかったのに答えを見つけることができません。xinput(ここでたくさん読んだと思います。

だから私が選んだのは、awk文脈的な問題に基づいた単純な線のようです。

xinput list | awk 'BEGIN {is_pt=0}; /Virtual core pointer/ {is_pt=1}; /Virtual core keyboard/ {is_pt=0}; {if (is_pt==1) {print $0}} '

または、より良い形式を使用してください。

xinput list | awk '
  BEGIN {is_pt=0} 
  /Virtual core pointer/  {is_pt=1} 
  /Virtual core keyboard/ {is_pt=0} 
  { 
    if (is_pt==1) {
      print $0
    }
  }
'

{}後続のパターンが一致すると、各コードブロックが実行されます()。ブロックがあります(ブロックがあり、if進行モードがありません。各行に対して実行されます。$0すべての現在のレコード(行)を意味します。BEGINはファイルの先頭です。

答え2

xinputリストでマウスを一致させようとしたときに同じ問題が発生しました。これらの問題を解決するためにsedを使用することに慣れているので、ここにsedベースのアプローチがあります。

MOUSE_G903_ID=$(xinput --list | sed -rn '/^.*Virtual core pointer/,/^.*Virtual core keyboard/ s/^.*Logitech G903 LS[[:blank:]]+id=([[:digit:]]+).*/\1/p')

-nスイッチを使用すると、sedはすべての出力を抑制するため、pコマンドを使用するか、sコマンドのpフラグを使用して目的の内容を明示的に印刷する必要があります。

作業範囲、つまり2つの「ヘッダー行」(仮想コアポインタ、仮想コアキーボード)の間の行範囲を最初に定義するsed式(二重引用符で囲む)があります。

スコープの後、sコマンドはマウスに対応する行を一致させ、数値IDをキャプチャして印刷します。

関連情報