Risposte:
xdotoolespone la posizione del puntatore ( xdotool getmouselocation) e le versioni recenti (dal 2.20110530.1) indicano quale finestra si trova anche in quella posizione . Niente di tutto xwininfo, wmctrlo di versioni precedenti di xdotoolsembrano avere un modo per abbinare una finestra da una posizione di schermo in cui è visibile.
La chiamata alla libreria X sottostante è XQueryPointer(corrispondente a un QueryPointermessaggio). Ecco un semplice script wrapper Python attorno a questa chiamata (usando ctypes). Errore nel controllo ampiamente omesso. Supponiamo che tu stia utilizzando la schermata 0 (se non sapevi che i display potrebbero avere più di una schermata, ignoralo).
#! /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
Esempio di utilizzo:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)per 0, e chiamando xwininfo -rootper questa condizione risolve questo capriccio .. Grazie ..
root_id.valueif child_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))
Il xwininfocomando fornisce questo tipo di output, ma devi fare clic sulla finestra in cui vuoi informazioni:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Così facendo: xwininfo | grep 'Window id:'potrebbe darti qualcosa da cui è possibile analizzare l'ID.
xwinfo |grep window id:' &e seguendolo da xdotool click 1... ma ciò comporta il rischio che il primo piano venga clickeseguito prima di xdotoolafferrare il mouse. Rathen non userebbe un nominale `sleep n, quindi anche se questa risposta è sulla buona strada, aspetterò un wihile per vedere se qualcosa di più in linea si presenta ...
prova questo, usa solo xdotool, ma la sua versione è almeno "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
per ottenere direttamente l'id finestra è possibile utilizzare questo:
sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
xdotool è abbastanza buono per farlo.
Esegui xdotool getactivewindowe vedrai il risultato (int) La finestra può essere su QUALSIASI monitor. Basta leggere dove si trova il puntatore x11 in attesa di un clic :) e non importa se si tratta di una finestra remota, un vncserver o il terzo desktop dell'ambiente desktop del cubo. Funziona e basta.
Puoi giocare usando il sonno per test migliori sleep 3; xdotool click 1+2; xdotool getactivewindow.
Ho visto che getwindowsfocusrestituisce lo stesso valore di getactivewindow.
Se esegui i clic manualmente, visualizzerai il menu contestuale, ma fai clic su 1 + 2 attiva entrambi i clic alla volta facendo clic sulla posizione corrente del mouse e ottenendo l'id desiderato.
Provalo :)
Se hai accesso a python-xlib , ecco un equivalente più breve e più pitonico della risposta di Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
ArchWiki ha una buona risposta a questo:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
Usando sedpuoi farlo in una sola riga, che è probabilmente il modo più leggibile per farlo:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Si noti che xdotoolmancava nel mio Debian minimal X11 mentre xpropera incluso (allo stesso modo sedovviamente).
Se non si desidera eseguire il fork, sedné grepè possibile eseguire completamente la trasformazione del testo bash, che forse è un po 'più sicura nel caso in cui l'output delle xpropmodifiche cambi un po':
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
Ad ogni modo, è ancora uno strano modo di archiviare un compito così semplice.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocusda una console e spostare il mouse. Il valore sarebbe lo stesso fino a quando non fai clic con il mouse o interagisci con la tastiera (alt + tab, ecc.)
xdotool click 1metodo asincrono menzionato nel commento alla risposta di Bruce Ediger . L'ID desktop diverso da zero è valido in quanto restituisce l'immagine appropriata tramiteimport -window $nonzeroID screen.png.... C'è qualche semplice aggiustamento per lo script Python per restituire quel valore per il desktop ?