Centralizar uma janela via linha de comando


19

Existe uma maneira de colocar uma janela no centro da tela depois de aberta ou fazer com que ela se abra no centro da tela?

Isso precisa ser feito usando a linha de comando.

Respostas:


33

A ferramenta wmctrl fornece acesso à linha de comandos para quase todos os recursos definidos na especificação EWMH (Extended Window Manager Hints) . Ele pode ser usado, por exemplo, para obter informações sobre o gerenciador de janelas, para obter uma lista detalhada de áreas de trabalho e janelas gerenciadas, para alternar e redimensionar áreas de trabalho, para tornar as janelas em tela cheia , sempre acima ou adesivas , e para ativar , feche , mova , redimensione , maximize e minimize- os.

Você pode instalá-lo

sudo apt-get install wmctrl

Você pode obter informações sobre seus desktops virtuais (áreas de trabalho) com wmctrl -d

one@onezero:~$ wmctrl -d
0  * DG: 2720x1536  VP: 0,0  WA: 0,24 1360x744  N/A

E liste janelas abertas com wmctrl -l. A -Gopção mostra a geometria das janelas:

one@onezero:~$ wmctrl -l
0x02000004  0 onezero Desktop
0x02e00002  0     N/A DNDCollectionWindow
0x02e00003  0     N/A launcher
0x01e00004  0 onezero cairo-dock
0x02e00004  0     N/A panel
0x04800061  0 onezero Transmission
0x02e0000a  0     N/A Dash
0x03a00044  0 onezero arranging windows from the gnu/linux command line with wmctrl ~ Moving to Freedom - Chromium
0x04400006  0 onezero one@onezero: ~
0x04c000e9  0 onezero Google - Mozilla Firefox

wmctrl -lG

one@onezero:~$ wmctrl -lG
0x02000004  0 0    0    1360 768  onezero Desktop
0x02e00002  0 -1460 -868 1360 768      N/A DNDCollectionWindow
0x02e00003  0 0    24   58   744      N/A launcher
0x01e00004  0 290  653  780  115  onezero cairo-dock
0x02e00004  0 0    0    1360 24       N/A panel
0x04800061  0 408  95   732  500  onezero Transmission
0x02e0000a  0 -1402 -844 1302 744      N/A Dash
0x03a00044  0 0    24   1360 744  onezero Center a window via command line - Ask Ubuntu - Stack Exchange - Chromium
0x04400006  0 127  94   983  434  onezero one@onezero: ~
0x04c000e9  0 5    47   1349 715  onezero Google - Mozilla Firefox

Você pode especificar uma janela referenciando seu título ou título parcial após -r. -e é para mover e redimensionar

wmctrl -r "Mozilla Firefox" -e <G>,<X>,<Y>,<W>,<H>

<G>: Gravity specified as a number. The numbers are defined in the EWMH specification. The value of zero is particularly
     useful, it means "use the default gravity of the window".
<X>,<Y>: Coordinates of new position of the window.
<W>,<H>: New width and height of the window.

Portanto, para mover uma janela para o canto superior esquerdo e torná-la com 1000 pixels de largura por 700 de altura, você usaria 0,0,0,1000,700

one@onezero:~$ wmctrl -r "Mozilla Firefox" -e 0,0,0,1000,700

insira a descrição da imagem aqui

Para movê-lo / redimensioná-lo. Para isso, usei a solução alternativa de “desmaximizar” primeiro, usando a -bopção

wmctrl -r "Mozilla Firefox" -b add, maximized_vert, maximized_horz

wmctrl -r "Mozilla Firefox" -b remove, maximized_vert, maximized_horz

one@onezero:~$ wmctrl -r "Mozilla Firefox" -b add,maximized_vert,maximized_horz

insira a descrição da imagem aqui

As coisas que você precisa entender

The -e option expects a list of comma separated integers: "gravity,X,Y,width,height"

insira a descrição da imagem aqui

essa é a minha resolução da tela, então x = 1360 & y = 786

Alinhando uma janela à metade esquerda da tela

one@onezero:~$ wmctrl -r "Mozilla Firefox" -e 1,0,0,680,768

Alinhando uma janela à metade direita da tela

one@onezero:~$ wmctrl -r "Mozilla Firefox" -e 1,680,0,680,768

Alinhando uma janela a center of screen1360/4 = 340

one@onezero:~$ wmctrl -r "Mozilla Firefox" -e 1,340,0,680,768

insira a descrição da imagem aqui

Manipule-o a partir das configurações da tela

Para obter mais ajuda 1 2 3 4


7

que funciona com a janela ativa no momento

IFS='x' read screenWidth screenHeight < <(xdpyinfo | grep dimensions | grep -o '[0-9x]*' | head -n1)

width=$(xdotool getactivewindow getwindowgeometry --shell | head -4 | tail -1 | sed 's/[^0-9]*//')
height=$(xdotool getactivewindow getwindowgeometry --shell | head -5 | tail -1 | sed 's/[^0-9]*//')

newPosX=$((screenWidth/2-width/2))
newPosY=$((screenHeight/2-height/2))

xdotool getactivewindow windowmove "$newPosX" "$newPosY"

Isso precisa bashou zshpara executar, simples shnão vai funcionar.
Wingedsubmariner

Funciona 👍, exceto no Unity, para janelas com 1/2 ou 1/4 de lado a lado (por exemplo, arraste uma janela para o lado direito, ela ocupará a metade direita da tela). Essas janelas parecem especiais, e não sei para qual xdotoolação chamar primeiro, para torná-las "normais" antes de chamar windowmove. Ideias?
Ronan Jouchet

Encontrei uma solução para o meu problema neste segmento do askubuntu . Envolve wmctrltambém a chamada , boas soluções. TL; DR: chamada wmctrl -ir "$(xdotool getactivewindow)" -b remove,maximized_vert,maximized_horzantes da xdotool getactivewindow windowmovechamada final .
Ronan Jouchet

4

Se alguém quiser que um snippet de código copie / cole para fazer isso, aqui está um:

winname='foo'
IFS='x' read sw sh < <(xdpyinfo | grep dimensions | grep -o '[0-9x]*' | head -n1)
read wx wy ww wh < <(wmctrl -lG | grep $winname | sed 's/^[^ ]* *[^ ]* //;s/[^0-9 ].*//;')
wmctrl -r $winname -e 0,$(($sw/2-$ww/2)),$(($sh/2-$wh/2)),$ww,$wh

Substitua foopelo nome da janela que você deseja centralizar na primeira linha, é claro.


Explicação (quebra na forma de uma sessão de console de exemplo):

Obtendo as dimensões da tela

llama@llama:~$ xdpyinfo | grep dimensions
  dimensions:    1920x1080 pixels (508x285 millimeters)
llama@llama:~$ xdpyinfo | grep dimensions | grep -o '[0-9x]*'
1920x1080
x
508x285
llama@llama:~$ xdpyinfo | grep dimensions | grep -o '[0-9x]*' | head -n1
1920x1080
llama@llama:~$ IFS='x' read sw sh < <(xdpyinfo | grep dimensions | grep -o '[0-9x]*' | head -n1)
llama@llama:~$ echo $sw $sh
1920 1080

Obtendo as informações de geometria da janela

llama@llama:~$ wmctrl -lG | grep foo
0x00a0000c  0 1113 510  722  475  llama foo
llama@llama:~$ wmctrl -lG | grep foo | sed 's/^[^ ]*//;'
  0 1113 510  722  475  llama foo
llama@llama:~$ wmctrl -lG | grep foo | sed 's/^[^ ]* *[^ ]*//;'
 1113 510  722  475  llama foo
llama@llama:~$ wmctrl -lG | grep foo | sed 's/^[^ ]* *[^ ]* //;s/[^0-9 ].*//;'
1143 505  722  475  
llama@llama:~$ read wx wy ww wh < <(wmctrl -lG | grep foo | sed 's/^[^ ]* *[^ ]* //;s/[^0-9 ].*//;')
llama@llama:~$ echo $wx $wy $ww $wh
1143 505 722 475

Movendo a janela

llama@llama:~$ echo 0,foo,bar,$ww,$wh
0,foo,bar,722,475
llama@llama:~$ echo 0,$(($sw/2)),bar,$ww,$wh                                    
0,960,bar,722,475
llama@llama:~$ echo 0,$(($sw/2-$ww/2)),bar,$ww,$wh
0,599,bar,722,475
llama@llama:~$ echo 0,$(($sw/2-$ww/2)),$(($sh/2-$wh/2)),$ww,$wh
0,599,303,722,475

0

A maioria dos aplicativos deve respeitar o parâmetro --geometry ao iniciar (alguns preferem -geometry, tente o segundo se o primeiro não funcionar para você):

gnome-terminal --geometry 80x25+100+100

O parâmetro geometry tem este formato:

WIDTHxHEIGHT+XOFF+YOFF

Você pode deixar peças desnecessárias de fora:

gnome-terminal --geometry +20+50 #No size, just offsets

Para mais detalhes:

man X

pressione "/" e procure por ESPECIFICAÇÕES DE GEOMETRIA

ou veja aqui: http://www.cotse.com/dlf/man/xwindows/geometry.htm

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.