À partir d'un script bash, existe-t-il un moyen d'obtenir l'ID de la fenêtre X sous le pointeur de la souris?
(modifier) J'ai besoin que le processus ne soit pas interactif.
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)
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 ?$(XQueryPointer)
pour0
, et appelantxwininfo -root
à cette résorbe cette bizarrerie .. Merci ..root_id.value
sichild_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:Ce faisant:
xwininfo | grep 'Window id:'
pourrait vous donner quelque chose dont vous pouvez analyser l'ID.la source
xwinfo |grep window id:' &
et en le suivant parxdotool click 1
... mais cela court le risque que le premier planclick
s'exécute avant dexdotool
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"
pour obtenir l'id de la fenêtre directement, vous pouvez utiliser ceci:
la source
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 :)
la source
Si vous avez accès à python-xlib , voici un équivalent plus court et plus pythonique à la réponse de Gilles:
la source
J'ai joué avec la réponse de Peter.O et j'ai trouvé:
la source
ArchWiki a une bonne réponse à cela:
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:Notez qu'il
xdotool
manquait dans mon Debian minimal X11 alors qu'ilxprop
était inclus (de mêmesed
bien sûr).Si vous ne voulez pas créer de fork
sed
nigrep
effectuer la transformation de texte entièrementbash
, ce qui est peut-être un peu plus sûr au cas où la sortie dexprop
change un peu:Quoi qu'il en soit, c'est toujours une façon étrange d'archiver une tâche aussi simple.
la source
la source
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.)