Como encontro as dimensões e a posição da janela com precisão, incluindo decorações?

32

Eu tenho tentado descobrir o tamanho de uma janela para usar em um script pequeno. Minha técnica atual está usando wmctrl -lG para descobrir as dimensões. No entanto, o problema é este:

As figuras x e y são dadas na parte superior esquerda das decorações da janela, enquanto a altura e a largura são apenas para a área de conteúdo. Isso significa que se as decorações da janela adicionam 20 px de altura e 2 px de largura, o wmctrl reportará uma janela como sendo 640x480, mesmo que ocupe 660x482 na tela. Isso é um problema porque o próximo passo do meu script seria usar essa área para dizer ao ffmpeg para gravar a tela. Eu gostaria de evitar a codificação no tamanho das decorações da janela da minha configuração atual.

O que convém é um método para obter o tamanho das decorações da janela, para que eu possa usá-las para descobrir a posição da área de conteúdo de 640x480 ou uma maneira de obter a posição da área de conteúdo diretamente, não a de as decorações da janela.

    
por Macha 01.06.2011 / 18:40

5 respostas

33

O script a seguir lhe dará as coordenadas de tela superior e o tamanho da janela (sem nenhuma decoração). . . . xwininfo -id $(xdotool getactivewindow) contém informações suficientes para você.

#!/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=/p" \
           -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=/p" \
           -e "s/^ \+Width: \+\([0-9]\+\).*/w=/p" \
           -e "s/^ \+Height: \+\([0-9]\+\).*/h=/p" )
  echo -n "$x $y $w $h"
#
    
por 01.06.2011 / 19:50
7

A resposta aceita pode ser estendida para obter a janela inteira:

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=/p" \
         -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=/p" \
         -e "s/^ \+Width: \+\([0-9]\+\).*/w=/p" \
         -e "s/^ \+Height: \+\([0-9]\+\).*/h=/p" \
         -e "s/^ \+Relative upper-left X: \+\([0-9]\+\).*/b=/p" \
         -e "s/^ \+Relative upper-left Y: \+\([0-9]\+\).*/t=/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

Apesar de fácil, não funciona no Unity no Ubuntu 14.04 porque a informação relativa é toda 0. Eu perguntei Obtenha as dimensões completas da janela (incluindo decorações) na Unity e obtenha uma boa resposta. Aqui está como eu usei essa resposta:

aw=$(xdotool getactivewindow)
eval $(xwininfo -id "$aw" |
      sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=/p" \
             -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=/p" \
             -e "s/^ \+Width: \+\([0-9]\+\).*/w=/p" \
             -e "s/^ \+Height: \+\([0-9]\+\).*/h=/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

Este segundo método funciona tanto no Unity quanto no Xfce, e deve funcionar no Gnome também.

    
por 19.09.2014 / 04:27
2

A resposta aceita explicitamente não inclui decoração de janelas. Para aqueles que ainda estão procurando como obter a geometria incluindo todas as decorações, de acordo com o título desta pergunta, você pode usar wmiface de acordo com essa outra pergunta link . Exemplo:

wmiface frameGeometry 'wmiface activeWindow'

Isso retorna a geometria e a posição em relação ao canto superior esquerdo da seguinte forma:

650x437+0+1003

O wmiface não parece vir com todas as distribuições linux (eu não encontrei um pacote fornecendo no Mint ou no Ubuntu), mas eu pude instalá-lo a partir dos pacotes aqui: link

E não vem com documentos nem com --help , mas o README está aqui:

link

    
por 18.09.2014 / 16:37
1

Usando o xdotool:

  • Primeiro, você precisa obter o ID da janela:

sleep 3s && xdotool getactivewindow , você tem 3 segundos para abrir sua janela

  • Então você precisa usar:
    1. para obter informações na saída use isto: xdotool getwindowgeometry $WINDOW_ID
    2. ou se você quiser que o parâmetro shell use isto: xdotool getwindowgeometry -shell $WINDOW_ID
por 25.08.2016 / 15:05
1

Uma maneira muito mais simples de obter o tamanho e a posição da janela:

xdotool getwindowfocus getwindowgeometry
    
por 23.11.2018 / 12:44