bash의 마우스 포인터 아래에서 X 창 ID를 어떻게 찾습니까?


20

bash 스크립트에서 마우스 포인터 아래에 X 창의 ID를 얻는 방법이 있습니까?

(편집) 비 대화식 프로세스가 필요합니다.

답변:


25

xdotool포인터 위치 (노출 xdotool getmouselocation) 및 (2.20110530.1 이후) 그 위치에있을뿐만 아니라 어떤 창 표시 최신 버전을 . 중에 xwininfo, wmctrl또는 이전 버전의 xdotool표시는 표시의 화면 위치로 창을 일치 수있는 방법이 없습니다.

기본 X 라이브러리 호출은 XQueryPointer( QueryPointer메시지에 해당 )입니다. 이 호출에 대한 간단한 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)

1
감사합니다 Gilles : 이것은 (거의) 정확히 필요한 것입니다 ... 이상적이지만 데스크탑 자체에 대해 '0'값을 리턴한다는 사실에 이상적입니다. 0이 아닌 창 ID가 리턴됩니다 (데스크탑에 대해). Bruce Ediger의 답변 xdotool click 1에 대한 의견에 언급 된 비동기 방법으로 .. 0이 아닌 데스크톱 ID는 ...을 통해 적절한 이미지를 반환하므로 유효하지 않습니다 . 파이썬 스크립트가 데스크톱에 대해 해당 값 을 반환 하는 간단한 조정이 있습니까? ? import -window $nonzeroID screen.png
Peter.O

@Gilles ... 테스트 $(XQueryPointer)에 대한 0, 및 호출 xwininfo -root이 조건을하는 것은이 특질을 해결합니다 .. 감사합니다 ..
Peter.O

@fred 유닉스 컴퓨터 앞에 있지 않기 때문에 테스트되지 않았습니다 . root_id.valueif 인쇄 하십시오 child_id.value == 0.
Gilles 'SO- 악마 그만해'

네, 당신의 모드는 잘 작동합니다 .. if child_id.value == 0: print root_id.value else: print child_id.value :)
Peter.O

sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
F. Hauri

21

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를 파싱 할 수있는 것을 줄 수 있습니다.


1
비 대화식
이어야합니다

1
백그라운드에서 실행 xwinfo |grep window id:' &하고 다음을 수행 하여 비 대화식으로 만들 수 xdotool click 1있지만 마우스를 잡기 click전에 포 그라운드가 실행될 위험이 xdotool있습니다. 나는 명목상의`sleep n을 사용하지 않을 것이다. 따라서이 답변이 제대로 진행되었지만 더 많은 인라인 이 나타나는지보기 위해 wihile을 기다릴 것이다 ...
Peter.O

8

시도해보십시오. 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

1
감사합니다. BTW 이것이 유용 할 수 있습니다xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
user41209

1

xdotool은 그렇게하기에 충분합니다.

실행 xdotool getactivewindow하면 결과가 표시됩니다 (int) 창이 모니터 이상일 수 있습니다. 클릭 대기중인 x11 포인터가있는 위치를 읽으십시오 :), 원격 데스크톱, vncserver 또는 큐브 데스크톱 환경의 세 번째 데스크톱인지 여부에 관계없이 읽으십시오. 그냥 작동합니다.

더 나은 테스트를 위해 절전 모드를 사용하여 재생할 수 있습니다 sleep 3; xdotool click 1+2; xdotool getactivewindow.

나는와 getwindowsfocus같은 값 을 반환하는 것을 보았습니다 getactivewindow.

수동으로 클릭하면 상황에 맞는 메뉴가 표시되지만 1 + 2를 클릭하면 현재 마우스 위치를 클릭하고 원하는 ID를 얻을 때 두 번의 클릭이 모두 발생합니다.

시도 해봐 :)


1
이것은 활성 창이 마우스 포인터 아래에 있는지 여부에 관계없이 활성 창의 ID를 나타냅니다 (해당 창의 위치 에 관계없이). 질문의 말에 따르면 : "... 마우스 포인터 아래에서 X 윈도우 ID를 찾으십시오 ..."( 마우스 가있을 수있는 곳 ).
Peter.O

1
정정 해 주셔서 감사합니다. 업데이트되었습니다 . getmouselocation 개념과 activewindow를 혼합했지만 xdotool은 충분히 시원합니다.
m3nda

1

python-xlib에 액세스 할 수 있다면 Gilles의 대답과 동일하고 더 짧고 더 많은 pythonic이 있습니다.

from Xlib.display import Display

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

print(result.child.id)

0

나는 Peter 의 대답을 가지고 놀았고 O 를 생각해 냈습니다.

xdotool click 1|xwininfo|grep 'Window id:'

1
마우스 클릭을 보내므로 마우스 커서가있는 버튼을 클릭하는 것과 같습니다. 클릭하여 초점을 맞추는 경우 커서가있는 창을 실수로보고하지만 클릭 이벤트 전송은 방해가됩니다.
Gilles 'SO- 악마 그만해'

0

ArchWiki 는 이것에 대한 좋은 답변을 가지고 있습니다 :

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

sed이것을 사용 하면 한 줄로 할 수 있습니다. 아마 가장 읽기 쉬운 방법 일 것입니다 :

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

xdotool내 데비안 최소한의 X11의 동안 실종됐다가 xprop(역시 포함되었다 sed물론).

포크하고 싶지 sed않거나 grep텍스트 변환을 완전히 수행 할 수 없다면 변경 결과가 약간 변경되는 bash경우 조금 더 안전합니다 xprop.

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

어쨌든 여전히 간단한 작업을 보관하는 이상한 방법입니다.


3
마우스 포인터 아래에있는 창 대신 활성 창의 ID를 제공합니다.
Peter.O

@ Peter.O 당신이 맞아 이것은 활성 창을 반환합니다. 답이 잘못되어 죄송하지만 테스트를 통해 효과가 있었을 것입니다.
티노

0
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'

1
마우스 포인터 아래에있는 창 대신 활성 창의 ID를 제공합니다.
Peter.O

오, 나는 여기에 느슨한 초점 (포커스가 마우스를 따릅니다)을 가정하고있었습니다.
blueyed

@blueyed Focus는 활성 창에 있으며이 창은 키보드에 응답합니다. X11은 서버에서 마우스로 마우스를 따라 가거나 추적하며, 창을 클릭하면 x11이 창 관리자 포커스를 클릭 한 창으로 설정합니다. 초점은 실제로 마우스를 따르지 않습니다. xdotool getwindowsfocus콘솔에서 실행 하고 마우스가 움직이는 지 확인할 수 있습니다 . 마우스를 클릭하거나 키보드 (alt + tab 등)를 조작 할 때까지 값은 동일합니다.
m3nda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.