Risposte:
xdotool
espone 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
, wmctrl
o di versioni precedenti di xdotool
sembrano 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 QueryPointer
messaggio). 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 -root
per questa condizione risolve questo capriccio .. Grazie ..
root_id.value
if 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 xwininfo
comando 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 click
eseguito prima di xdotool
afferrare 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 getactivewindow
e 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 getwindowsfocus
restituisce 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 sed
puoi 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 xdotool
mancava nel mio Debian minimal X11 mentre xprop
era incluso (allo stesso modo sed
ovviamente).
Se non si desidera eseguire il fork, sed
né grep
è possibile eseguire completamente la trasformazione del testo bash
, che forse è un po 'più sicura nel caso in cui l'output delle xprop
modifiche 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 getwindowsfocus
da 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 1
metodo 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 ?