web-dev-qa-db-ja.com

bashのマウスポインターの下にあるXウィンドウIDを見つけるにはどうすればよいですか?

Bashスクリプトから、マウスポインターの下にあるXウィンドウのIDを取得する方法はありますか?

(編集)プロセスを非インタラクティブにする必要があります。

20
Peter.O

xdotool はポインターの場所(xdotool getmouselocation)、および 最近のバージョン(2.20110530.1以降)は、その場所にあるウィンドウも示していますxwininfowmctrl、またはxdotoolの古いバージョンのいずれも、表示されている画面位置によってウィンドウを一致させる方法がないようです。

基礎となるXライブラリの呼び出しは XQueryPointerQueryPointerメッセージに対応)です。これは、単純なPythonこの呼び出しのラッパースクリプトです(- ctypes を使用)。エラーチェックはほとんど省略されています。画面0を使用していると想定します(ディスプレイに複数の画面がある可能性があることを知りませんでした。これは無視してください)。

#! /usr/bin/env python
import sys
from ctypes import *
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
(root_id, child_id) = (c_uint32(), c_uint32())
(root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int())
mask = c_uint()
ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id),
                         byref(root_x), byref(root_y),
                         byref(win_x), byref(win_y), byref(mask))
if ret == 0: sys.exit(1)
print child_id.value

使用例:

xwininfo -tree -id $(XQueryPointer)

xwininfoコマンドはこの種の出力を提供しますが、情報が必要なウィンドウをクリックする必要があります。

% xwininfo
xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0xa0000d "flask"

...

そうすること:xwininfo | grep 'Window id:'は、IDを解析できるものを提供するかもしれません。

21
Bruce Ediger

これを試してください、それはxdotoolのみを使用しますが、そのバージョンは少なくとも「2.20110530.1」です

xdotool getmouselocation --Shell | grep WINDOW

ウィンドウIDを直接取得するには、これを使用できます。

sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --Shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
8
Aquarius Power

python-xlib にアクセスできる場合、ここにGillesの回答に相当する、より短く、よりPythonicなものがあります。

from Xlib.display import Display

display = Display()
window = display.screen().root
result = window.query_pointer()

print(result.child.id)
1
Noé Martínez

xdotoolはこれを行うのに十分です。

xdotool getactivewindowを実行すると、結果(int)が表示されます。ウィンドウはどのモニターの上にあってもかまいません。クリックを待っているx11ポインターの場所がどこにあるかをお読みください:)、それがリモートウィンドウ、vncserver、またはキューブデスクトップ環境の3番目のデスクトップであるかどうかは関係ありません。うまくいきます。

より良いテストのために、sleepを使用してsleep 3; xdotool click 1+2; xdotool getactivewindowを再生できます。

getwindowsfocusgetactivewindowと同じ値を返すことがわかりました。

手動でクリックすると、コンテキストメニューが表示されますが、1 + 2をクリックすると、現在のマウス位置をクリックして目的のIDを取得するときに両方のクリックが発生します。

それを試してみてください :)

1
m3nda

ArchWiki はこれに対する良い答えを持っています:

activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}

sedを使用すると、これを1行で実行できます。これは、おそらく最も読みやすい方法です。

activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"

xdotoolが含まれている間、xpropが私のDebianミニマルX11で欠落していたことに注意してください(もちろんsedも同様です)。

sedgrepもフォークしたくない場合は、完全にbashでテキスト変換を行うことができます。これは、 xpropは少し変化します:

activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'

とにかく、それはそのような単純なタスクをアーカイブする奇妙な方法です。

0
Tino

私は Peter.O からの答えをいじくり回し、思いついた:

xdotool click 1|xwininfo|grep 'Window id:'
0
Ikem Krueger
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
0
blueyed