web-dev-qa-db-fra.com

Comment trouver les dimensions de la fenêtre et la position de la fenêtre incluant avec précision des décorations?

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 .

37
Macha

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"
#
37
Peter.O

Un moyen beaucoup plus simple d'obtenir la taille de la fenêtre et la position:

xdotool getwindowfocus getwindowgeometry
7
radara

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.

7
Colin Keenan

Utilisation de xdotool:

  • D'abord, vous devez obtenir une carte de fenêtre:

sleep 3s && xdotool getactivewindow, vous avez 3 secondes pour ouvrir votre fenêtre

  • Ensuite, vous devez utiliser:
    1. pour obtenir des informations dans la sortie, utilisez ceci: xdotool getwindowgeometry $WINDOW_ID
    2. ou si vous voulez que le paramètre shell utilise ceci: xdotool getwindowgeometry -Shell $WINDOW_ID
3
LyndaOlexandr

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

3
slinkp

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.

0
WinEunuuchs2Unix