Wie finde ich die Fensterabmessungen und -positionen einschließlich Dekorationen genau?

37

Ich habe versucht, die Größe eines Fensters für die Verwendung in einem kleinen Skript herauszufinden. Meine derzeitige Technik verwendet wmctrl -lG, um die Dimensionen herauszufinden. Das Problem ist jedoch folgendes:

Die angegebenen x- und y-Werte gelten für die obere linke Ecke der Fensterdekoration, während Höhe und Breite nur für den Inhaltsbereich gelten. Dies bedeutet, dass wmctrl ein Fenster mit 640x480 meldet, auch wenn es 660x482 auf dem Bildschirm einnimmt, wenn die Fensterdekoration 20px Höhe und 2px Breite hinzufügt. Dies ist ein Problem, da der nächste Schritt meines Skripts darin besteht, in diesem Bereich ffmpeg anzuweisen, den Bildschirm aufzuzeichnen. Ich möchte Hardcoding in der Größe der Fensterdekorationen aus meinem aktuellen Setup vermeiden.

Was passen würde, ist entweder eine Methode, um die Größe der Fensterdekorationen zu ermitteln, damit ich sie verwenden kann, um die Position des 640x480-Inhaltsbereichs herauszufinden, oder eine Methode, um die Position des Inhaltsbereichs direkt zu ermitteln, nicht die der Fensterdekorationen .

Macha
quelle
1
In den Abbildungen für das Diagramm habe ich Höhe und Breite vertauscht.
Macha
Toter Bildlink.
Ciro Santilli新疆改造中心法轮功六四事件
Schließen Sie die Frage, aber fragen Sie auch nach anderen Dingen: superuser.com/questions/164047/…
Ciro Santilli 新疆 新疆 at 六四 事件 六四

Antworten:

36

Das folgende Skript gibt Ihnen die Bildschirmkoordinaten oben links und die Größe des Fensters an (ohne Dekoration). . . . xwininfo -id $(xdotool getactivewindow)enthält genügend Informationen für Sie.


#!/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"
#
Peter.O
quelle
Dies scheint zu funktionieren, da xdotool getactivewindowdie Fenster-ID des Fenstermanager-Frames (einschließlich Dekoration) und nicht das darin enthaltene Client-Fenster zurückgegeben wird.
Adam Spires
2
Nein, dies gibt die Geometrie ohne die Dekorationen zurück, was ausdrücklich nicht der Frage entspricht. Wenn Sie nicht möchten, dass Dekorationen enthalten sind, gibt es einfachere Möglichkeiten, dies zu tun, zum Beispielxdotool getactivewindow getwindowgeometry
Slinkp
1
Dies funktioniert nicht gut für mich (dh Dekorationen sind nicht enthalten). Diese Antwort ist besser.
Jan Warchoł
7

Die akzeptierte Antwort kann erweitert werden, um das gesamte Fenster zu erhalten:

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

Obwohl es einfach ist, funktioniert Unity in Ubuntu 14.04 nicht, da die relative Information alle 0 ist. Ich fragte Get the full window dimensions (inclusive decorations) in Unity und bekam eine gute Antwort. So habe ich diese Antwort verwendet:

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

Diese zweite Methode funktioniert sowohl in Unity als auch in Xfce und sollte auch in Gnome funktionieren.

Colin Keenan
quelle
Der obere Ansatz ist auch außerhalb von Unity unter Ubuntu falsch, da angenommen wird, dass der linke, der rechte und der untere Rand alle die gleiche Breite haben, und dies kann nicht garantiert werden. Der zweite Ansatz sieht besser aus.
Adam Spires
Ich habe gerade überprüfte den zweiten Ansatz - es nur erforderlich , aw=`xdotool getactivewindow`oben zu vermeiden , hängt aufaddiert auf dem xwininfo Anruf. Dies ist gut zu wissen, weil ich erwäge, zu Unity zu wechseln, wo ich wmiface nicht zum Laufen bringen kann, ohne Segfaulting.
Slinkp
@slinkp, danke für den Hinweis auf die fehlende awDefinition. Ich werde die Antwort jetzt bearbeiten, um diese Zeile hinzuzufügen.
Colin Keenan
Der zweite Teil davon funktioniert großartig! Die einzige Änderung, die ich in Gnome 3 vornehmen musste, war, die Höhe der Titelleiste nicht hinzuzufügen h. Die Titelleiste scheint bereits in der Höhe enthalten zu sein, von der sie zurückkommt xwininfo.
Jonny Asmar
6

Viel einfacher Weg, um Fenstergröße und Position zu erhalten:

xdotool getwindowfocus getwindowgeometry
Radara
quelle
3

Die akzeptierte Antwort enthält ausdrücklich keine Fensterdekoration. Für diejenigen, die nach wie vor die Geometrie einschließlich aller Dekorationen gemäß dem Titel dieser Frage suchen , können Sie wmiface gemäß dieser anderen Frage https://superuser.com/questions/164047/how-to-get-accurate-window verwenden -information-dimensions-etc-in-linux-x . Beispiel:

wmiface frameGeometry `wmiface activeWindow`

Dies gibt Geometrie und Position relativ zu oben links wie folgt zurück:

650x437+0+1003

wmiface scheint nicht mit allen Linux-Distributionen zu kommen (ich habe kein Paket gefunden, das es auf Mint oder Ubuntu zur Verfügung stellt), aber ich konnte es von den Paketen hier installieren: http://kde-apps.org/content/show .php? content = 40425

Und es kommt ohne Dokumente noch einmal --help, aber die README ist hier:

https://gitorious.org/wmiface/wmiface/source/ea941eeb2076124734f6a3d3079326c826b462d7:README

schleich
quelle
Sorry - ich meine upvote dafür bedauern , weil die akzeptierte Antwort nicht enthalten Fensterdekoration wie pro mein Kommentar darauf.
Adam Spires
Ich wünschte, das wäre wahr, aber leider ist dieser Kommentar falsch. Sie stimmen über die aktive Fenster-ID überein: $ wmiface activeWindow 6291772 $ xdotool getactivewindow 6291772 Sie stimmen jedoch nicht über die Geometrie überein, und ich kann dies mit z. screenruler das wmiface enthält die fensterdekoration und xdotool nicht. Probieren Sie es aus. $ wmiface frameGeometry wmiface activeWindow570x434 + 870 + 31 $ xdotool getwindowgeometry xdotool getactivewindowWindow 6291772 Position: 878,77 (Bildschirm: 0) Geometrie: 562x407
Slinkp
sorry, hoffe du kannst rätseln, was ich dort meinte ... wünschte, stackoverflow würde Blockcode-Beispiele in Kommentaren erlauben.
Slinkp
3

Mit xdotool:

  • Zuerst müssen Sie die Fenster-ID abrufen:

sleep 3s && xdotool getactivewindow, Sie haben 3 Sekunden Zeit, um Ihr Fenster zu öffnen

  • Dann müssen Sie verwenden:
    1. Verwenden Sie diese Option, um Informationen in der Ausgabe abzurufen: xdotool getwindowgeometry $WINDOW_ID
    2. oder wenn Sie Shell-Parameter möchten, verwenden Sie diese: xdotool getwindowgeometry -shell $WINDOW_ID
LyndaOlexandr
quelle
0

Antworten auf dieser Seite kombinieren Ich habe dies verwendet:

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

Window 88080400
  Position: 4565,2345 (screen: 0)
  Geometry: 1186x885

Führen Sie den Einzeiler aus und klicken Sie dann innerhalb von 3 Sekunden auf das Fenster, für das Sie die Position und Geometrie festlegen möchten.

WinEunuuchs2Unix
quelle