ポインタを特定のモニタに制限する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をキャプチャして印刷します。