Czy ze skryptu bash można uzyskać identyfikator okna X pod wskaźnikiem myszy?
(edytuj) Potrzebuję, aby proces był nieinteraktywny.
xdotool
ujawnia położenie wskaźnika ( xdotool getmouselocation
), a najnowsze wersje (od 2.20110530.1) wskazują również, które okno znajduje się w tym miejscu . Żaden z xwininfo
, wmctrl
lub starsze wersje xdotool
wydają się mieć sposób, aby dopasować okno przez położenia ekranu, gdzie jest widoczny.
Podstawowym wywołaniem biblioteki X jest XQueryPointer
(odpowiadające QueryPointer
wiadomości). Oto prosty skrypt otoki Pythona wokół tego wywołania (za pomocą ctypes
). Sprawdzanie błędów w dużej mierze zostało pominięte. Załóżmy, że używasz ekranu 0 (jeśli nie wiedziałeś, że wyświetlacze mogą mieć więcej niż jeden ekran, zignoruj to).
#! /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
Przykład użycia:
xwininfo -tree -id $(XQueryPointer)
xdotool click 1
metody asynchronicznej wymienionej w komentarzu do odpowiedzi Bruce'a Edigera . Niezerowy identyfikator pulpitu jest prawidłowy, ponieważ zwraca odpowiedni obraz za pośrednictwemimport -window $nonzeroID screen.png
... Czy istnieje jakiś prosty sposób na poprawienie skryptu python, aby zwracał tę wartość na pulpicie ?$(XQueryPointer)
dla0
i nazywaniexwininfo -root
tego warunku rozwiązuje ten dziwactwo .. Dzięki ..root_id.value
ifchild_id.value == 0
.if child_id.value == 0: print root_id.value
else: print child_id.value
:)sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
xwininfo
Komenda daje tego rodzaju produkcji, ale trzeba kliknąć na okno, które ma informacji na temat:Więc robienie:
xwininfo | grep 'Window id:'
może dać ci coś, z czego możesz przeanalizować identyfikator.źródło
xwinfo |grep window id:' &
i podążając za nimxdotool click 1
... ale to ryzykuje, że pierwszy planclick
wykona się zanimxdotool
złapie mysz. Nie używałbym nominalnego `snu n, więc chociaż ta odpowiedź jest na dobrej drodze, poczekam chwilę, aby zobaczyć, czy pojawi się coś bardziej wbudowanego ...spróbuj tego, używa tylko xdotool, ale jego wersja to co najmniej „2.20110530.1”
aby uzyskać identyfikator okna bezpośrednio, możesz użyć tego:
źródło
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
xdotool jest wystarczająco dobry, aby to zrobić.
Uruchom,
xdotool getactivewindow
a zobaczysz wynik (int) Okno może znajdować się na DOWOLNYM monitorze. Po prostu przeczytaj, gdzie znajduje się wskaźnik x11, który czeka na kliknięcie :) i bez względu na to, czy jest to zdalne okno, serwer vncserver czy trzeci pulpit środowiska pulpitu kostki. Po prostu działa.Możesz grać w tryb uśpienia dla lepszego testowania
sleep 3; xdotool click 1+2; xdotool getactivewindow
.Widzę, że
getwindowsfocus
zwraca tę samą wartość, cogetactivewindow
.Jeśli wykonujesz kliknięcia ręcznie, zobaczysz menu kontekstowe, ale kliknięcie 1 + 2 uruchamia oba kliknięcia jednocześnie, klikając bieżącą lokalizację myszy i uzyskując pożądany identyfikator.
Spróbuj :)
źródło
Jeśli masz dostęp do python-xlib , oto krótszy i bardziej pythoniczny odpowiednik odpowiedzi Gillesa:
źródło
Bawiłem się z odpowiedzią od Peter.O i wymyśliłem:
źródło
ArchWiki ma dobrą odpowiedź na to:
Za pomocą tego
sed
możesz to zrobić w jednym wierszu, co jest prawdopodobnie najbardziej czytelnym sposobem:Zauważ, że
xdotool
brakowało go w moim minimalnym X11 Debiana, gdyxprop
został on dołączony (podobniesed
oczywiście).Jeśli nie chcesz rozwidlać
sed
anigrep
nie możesz całkowicie przekształcić tekstubash
, co może być nieco bezpieczniejsze w przypadku, gdy wynikxprop
zmian jest nieco większy :W każdym razie jest to dziwny sposób na zarchiwizowanie tak prostego zadania.
źródło
źródło
xdotool getwindowsfocus
z konsoli i poruszanie myszą. Wartość byłaby taka sama, dopóki nie klikniesz myszy lub nie wejdziesz w interakcję z klawiaturą (alt + tab itp.)