J'ai essayé de comprendre la taille d'une fenêtre à utiliser dans un petit script. Ma technique actuelle utilise wmctrl -lG
Pour connaître les dimensions. Cependant, le problème est-ce:
Les figurines x et y donnent sont pour le haut à gauche des décorations de la fenêtre, tandis que la hauteur et la largeur ne sont que pour la zone de contenu. Cela signifie que si les décorations de la fenêtre ajoutent 20px de hauteur et 2px de largeur, WMCTRL signalera une fenêtre comme étant 640x480, même si elle prend 660x482 à l'écran. Ceci est un problème car la prochaine étape de mon script serait d'utiliser cette zone pour indiquer FFMPEG d'enregistrer l'écran. Je voudrais éviter le codage de la taille des décorations de la fenêtre de ma configuration actuelle.
Ce qui conviendrait soit une méthode pour obtenir la taille des décorations de la fenêtre afin que je puisse les utiliser pour comprendre la position de la zone de contenu 640x480 ou un moyen d'obtenir la position de la zone de contenu directement, pas celle des décorations de la fenêtre .
Le script suivant vous donnera les co-commandes et la taille de la fenêtre de la fenêtre (sans décoration). . . . xwininfo -id $(xdotool getactivewindow)
contient suffisamment d'informations pour vous.
#!/bin/bash
# Get the coordinates of the active window's
# top-left corner, and the window's size.
# This excludes the window decoration.
unset x y w h
eval $(xwininfo -id $(xdotool getactivewindow) |
sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
-e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
-e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
-e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
echo -n "$x $y $w $h"
#
Un moyen beaucoup plus simple d'obtenir la taille de la fenêtre et la position:
xdotool getwindowfocus getwindowgeometry
La réponse acceptée peut être étendue pour obtenir toute la fenêtre:
entire=false
x=0
y=0
w=0
h=0
b=0 # b for border
t=0 # t for title (or top)
# ... find out what user wants then
eval $(xwininfo -id $(xdotool getactivewindow) |
sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
-e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
-e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
-e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" \
-e "s/^ \+Relative upper-left X: \+\([0-9]\+\).*/b=\1/p" \
-e "s/^ \+Relative upper-left Y: \+\([0-9]\+\).*/t=\1/p" )
if [ "$entire" = true ]
then # if user wanted entire window, adjust x,y,w and h
let x=$x-$b
let y=$y-$t
let w=$w+2*$b
let h=$h+$t+$b
fi
echo "$w"x"$h" $x,$y
Bien que facile, il s'avère de ne pas fonctionner sur l'unité à Ubuntu 14.04 car les informations relatives sont toutes 0. J'ai demandé Obtenez les dimensions complètes de la fenêtre (y compris les décorations) dans l'unité et obtenu une bonne réponse. Voici comment j'ai utilisé cette réponse:
aw=$(xdotool getactivewindow)
eval $(xwininfo -id "$aw" |
sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
-e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
-e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
-e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
if [ "$entire" = true ]
then
extents=$(xprop _NET_FRAME_EXTENTS -id "$aw" | grep "NET_FRAME_EXTENTS" | cut -d '=' -f 2 | tr -d ' ')
bl=$(echo $extents | cut -d ',' -f 1) # width of left border
br=$(echo $extents | cut -d ',' -f 2) # width of right border
t=$(echo $extents | cut -d ',' -f 3) # height of title bar
bb=$(echo $extents | cut -d ',' -f 4) # height of bottom border
let x=$x-$bl
let y=$y-$t
let w=$w+$bl+$br
let h=$h+$t+$bb
fi
Cette deuxième méthode fonctionne à la fois dans l'unité et XFCE, et devrait également fonctionner dans GNOME.
Utilisation de xdotool:
sleep 3s && xdotool getactivewindow
, vous avez 3 secondes pour ouvrir votre fenêtre
xdotool getwindowgeometry $WINDOW_ID
xdotool getwindowgeometry -Shell $WINDOW_ID
La réponse acceptée n'inclut pas explicitement la décoration de la fenêtre. Pour ceux qui recherchent toujours comment obtenir la géométrie y compris Toutes les décorations, selon ce titre de cette question, vous pouvez utiliser WMIFACE Selon cette autre question https://superuser.com/questions/164047/how-to-get-accision-window-information-dimensions-etc-in-linux-x . Exemple:
wmiface frameGeometry `wmiface activeWindow`
Cela renvoie la géométrie et la position par rapport au haut gauche comme si:
650x437+0+1003
wMIFACE ne semble pas venir avec toutes les distributions Linux (je n'ai pas trouvé de colis à la fournir sur Mint ou Ubuntu), mais j'ai pu l'installer à partir des colis ici: http://kde-apps.org /Content/show.php?Content=40425
Et il vient sans docs ni même --help
, mais le README est ici:
https://gitorieux.org/wmiface/wmiface/source/ea941eeb2076124734f6A3D3079326C826B462D7HREADME
Combiner des réponses sur cette page J'ai utilisé ceci:
$ sleep 3 && xdotool getwindowfocus getwindowgeometry
Window 88080400
Position: 4565,2345 (screen: 0)
Geometry: 1186x885
Exécutez la doublure, puis dans les 3 secondes, cliquez sur la fenêtre que vous souhaitez effectuer la position et la géométrie.