Pencere boyutlarını ve dekoru da içeren pozisyonu nasıl bulurum?


37

Küçük bir komut dosyasında kullanmak için bir pencerenin boyutunu anlamaya çalışıyorum. Mevcut tekniğim wmctrl -lGboyutları bulmak için kullanıyor . Ancak, sorun şudur:

Verdiği x ve y rakamları, pencere dekorasyonlarının sol üst köşesi için, yükseklik ve genişlik ise sadece içerik alanı içindir. Bu, eğer pencere süslemeleri 20px yükseklik ve 2px genişlik eklerse, wmctrl, bir pencereyi ekranda 660x482 sürse bile 640x480 olarak bildirir. Bu bir sorundur çünkü betiğimdeki bir sonraki adım, ffmpeg'e ekranı kaydetmesini söylemek için o alanı kullanmak olacaktır. Şu anki kurulumumdan pencere dekorasyonlarının boyutunda kodlamadan kaçınmak istiyorum.

Uygun olan şey, pencere dekorasyonlarının boyutunu elde etmek için bir yöntemdir, böylece bunları 640x480 içerik alanının konumunu belirlemek için kullanabilirim veya içerik alanının konumunu doğrudan pencere dekorasyonlarının konumunu almak için kullanamazsınız. .


1
Diyagramdaki şekillerde yükseklik ve genişlik karıştırdım.
Macha

Ölü görüntü bağlantısı.
Ciro Santilli,

yakın soru ama başka şeyler de sorar: superuser.com/questions/164047/…
Ciro Santilli,

Yanıtlar:


36

Aşağıdaki komut size sol üst ekran kodlarını ve pencerenin boyutunu (dekorasyon olmadan) verecektir. . . . xwininfo -id $(xdotool getactivewindow)sizin için yeterli bilgiyi içerir.


#!/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"
#

Bu işe yarıyor, çünkü xdotool getactivewindowiçinde bulunan istemci penceresinden ziyade, pencere yöneticisi çerçevesinin (kimliği içeren) pencere kimliğini döndürüyor.
Adam

2
Hayır, bu geometriyi döndürür olmadan soru sorduk açıkça olmadığı, dekorasyon. Eğer dahil süslemeler istemiyorsanız, örneğin için bunu daha kolay yolları vardırxdotool getactivewindow getwindowgeometry
slinkp

1
Bu benim için iyi çalışmıyor (yani dekorasyon dahil değildir). Bu cevap daha iyi.
Jan Warchoł

7

Kabul edilen cevap, pencerenin tamamını almak için uzatılabilir:

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

Bağıl bilgi sordum hepsi 0. çünkü kolay olsa da, Ubuntu 14.04 Birlik çalışma değil çıkıyor Unity (süslemeleri dahil) tam pencere boyutlarını alın ve iyi bir cevap aldım. İşte bu cevabı nasıl kullandım:

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

Bu ikinci yöntem hem Unity hem de Xfce'de çalışır ve Gnome'da da çalışması gerekir.


Sol, sağ ve alt sınırların aynı genişlikte olduğunu varsaydığı için Ubuntu'daki Birlik dışında bile en üstteki yaklaşım yanlıştır ve bunun garantisi yoktur. İkinci yaklaşım daha iyi görünüyor.
Adam Spiers

Sadece ikinci yaklaşımı kontrol ettim - sadece aw=`xdotool getactivewindow`xwininfo çağrısına takılmamak için en üste eklenmesi gerekiyordu . Bunu bilmek harika, çünkü Unity'ye geçmeyi düşünüyorum, burada segfaulting olmadan çalışamayacağım.
slinkp

@slinkp, eksik awtanımı gösterdiğiniz için teşekkür ederiz . Bu satırı eklemek için şimdi cevabı düzenleyeceğim.
Colin Keenan,

Bunun ikinci kısmı harika çalışıyor! Gnome 3'te yapmam gereken tek değişiklik, başlık çubuğunun yüksekliğini eklememekti h. Başlık çubuğu zaten geri gelen yüksekliğe dahil edilmiş gibi görünüyor xwininfo.
Jonny Asmar

6

Pencere boyutunu ve konumunu almanın çok daha basit bir yolu:

xdotool getwindowfocus getwindowgeometry

3

Kabul edilen cevap açıkça pencere dekorasyonunu içermez. Tüm süslemeler dahil geometriyi hala elde etmek isteyenler için , bu sorunun başlığına göre, bu diğer soruya göre wmiface kullanabilirsiniz. Https://superuser.com/questions/164047/how-to-get-accurate-window -bilgi-boyutlar-etc-in-linux-x . Örnek:

wmiface frameGeometry `wmiface activeWindow`

Bu şekilde sola göre geometri ve pozisyon döner:

650x437+0+1003

wmiface tüm linux dağıtımlarıyla gelmiyor gibi görünüyor (Mint veya Ubuntu'da sağlayan bir paket bulamadım), ancak buradaki paketlerden yükleyebildim: http://kde-apps.org/content/show .php? content = 40425

Ve hiçbir belge ile gelmiyor --help, hatta README burada:

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


Maalesef, kabul ettiğim cevap , yorumumdaki pencereye göre pencere dekorasyonunu içerdiğinden dolayı, bu oy için üzgünüm .
Adam Spiers

Bunun doğru olmasını diliyorum, ancak ne yazık ki bu yorum yanlıştır. Aktif pencere kimliği hakkında hemfikirdirler: $ wmiface activeWindow 6291772 $ xdotool getactivewindow 6291772 wmiface pencere dekorasyonunu içerir ve xdotool içermez. Kendin için dene. $ wmiface frameGeometry wmiface activeWindow570x434 + 870 + 31 $ xdotool getwindowgeometry xdotool getactivewindowPencere 6291772 Konum: 878,77 (ekran: 0) Geometri: 562x407
sapan

üzgünüm, orada ne demek istediğimi çözebilirsin umarım ... İstif yığma akışı blok kod örneklerinin yorumlarda bulunmasına izin verir.
slinkp

3

Xdotool kullanarak:

  • İlk önce pencere kimliğini almanız gerekir:

sleep 3s && xdotool getactivewindow, pencerenizi açmak için 3 saniyeniz var

  • O zaman kullanmanız gerekir:
    1. çıktıda bilgi almak için şunu kullanın: xdotool getwindowgeometry $WINDOW_ID
    2. veya kabuk parametresi istiyorsanız bunu kullanın: xdotool getwindowgeometry -shell $WINDOW_ID

0

Bu sayfadaki cevapları birleştirerek bunu kullandım:

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

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

Tek astarı çalıştırın ve ardından 3 saniye içinde konum ve geometri için istediğiniz pencereye tıklayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.