Réponses:
xdotool
expose l'emplacement du pointeur ( xdotool getmouselocation
), et les versions récentes (depuis 2.20110530.1) indiquent également quelle fenêtre se trouve à cet emplacement . Aucun des xwininfo
, wmctrl
ou les anciennes versions de xdotool
semblent avoir un moyen de faire correspondre une fenêtre par une position de l' écran où il est visible.
L'appel de bibliothèque X sous-jacent est XQueryPointer
(correspondant à un QueryPointer
message). Voici un simple script d'encapsulation Python autour de cet appel (en utilisant ctypes
). Vérification d'erreur largement omise. Suppose que vous utilisez l'écran 0 (si vous ne saviez pas que les écrans peuvent avoir plusieurs écrans, ignorez-le).
#! /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
Exemple d'utilisation:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)
pour 0
, et appelant xwininfo -root
à cette résorbe cette bizarrerie .. Merci ..
root_id.value
si 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))
La xwininfo
commande donne ce type de sortie, mais vous devez cliquer sur la fenêtre sur laquelle vous souhaitez obtenir des informations:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Ce faisant: xwininfo | grep 'Window id:'
pourrait vous donner quelque chose dont vous pouvez analyser l'ID.
xwinfo |grep window id:' &
et en le suivant par xdotool click 1
... mais cela court le risque que le premier plan click
s'exécute avant de xdotool
saisir la souris. Je préfère ne pas utiliser un sommeil nominal n, donc bien que cette réponse soit sur la bonne voie, j'attendrai un peu pour voir si quelque chose de plus en ligne apparaît ...
essayez ceci, il utilise uniquement xdotool, mais sa version est au moins "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
pour obtenir l'id de la fenêtre directement, vous pouvez utiliser ceci:
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 est assez bon pour le faire.
Courir xdotool getactivewindow
et vous verrez le résultat (int) La fenêtre peut être sur N'IMPORTE QUEL moniteur. Il suffit de lire où se trouve le pointeur x11 en attente d'un clic :), et peu importe qu'il s'agisse d'une fenêtre distante, d'un serveur vnc ou du 3ème bureau de l'environnement de bureau cube. Fonctionne juste.
Vous pouvez y jouer en utilisant le sommeil pour de meilleurs tests sleep 3; xdotool click 1+2; xdotool getactivewindow
.
J'ai vu que getwindowsfocus
renvoie la même valeur quegetactivewindow
.
Si vous effectuez les clics manuellement, vous verrez le menu contextuel, mais cliquez sur 1 + 2 déclenche les deux clics au moment où vous cliquez sur l'emplacement actuel de la souris et obtenez l'ID souhaité.
Essayez-le :)
Si vous avez accès à python-xlib , voici un équivalent plus court et plus pythonique à la réponse de Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
ArchWiki a une bonne réponse à cela:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
L' utilisation que sed
vous pouvez le faire en une seule ligne, ce qui est probablement la façon la plus lisible pour le faire:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Notez qu'il xdotool
manquait dans mon Debian minimal X11 alors qu'il xprop
était inclus (de même sed
bien sûr).
Si vous ne voulez pas créer de fork sed
ni grep
effectuer la transformation de texte entièrement bash
, ce qui est peut-être un peu plus sûr au cas où la sortie de xprop
change un peu:
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
Quoi qu'il en soit, c'est toujours une façon étrange d'archiver une tâche aussi simple.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
partir d'une console et déplacer la souris. La valeur serait la même jusqu'à ce que vous cliquiez sur la souris ou que vous interagissiez avec le clavier (alt + tab, etc.)
xdotool click 1
méthode asynchrone mentionnée dans le commentaire à la réponse de Bruce Ediger .. L'ID de bureau différent de zéro est valide dans la mesure où il renvoie l'image appropriée viaimport -window $nonzeroID screen.png
.... Y a-t-il un simple ajustement pour que le script python renvoie cette valeur pour le bureau ?