Como posso mover todas as janelas para uma tela com um único comando?

3

Ao desancorar meu laptop de monitores externos de visão dupla para uma única tela, gostaria de ter um único comando para mover todas as janelas para a tela principal.

Embora a nvidia faça alguns dos trabalhos para que eu possa ver a borda das janelas, mover cada um deles com o mouse, o teclado ou o plug-in do compiz leva tempo.

    
por Cas 24.05.2011 / 14:05

3 respostas

3

Você pode usar wmctrl e um pequeno script para percorrer as janelas e, em seguida, posicioná-las na exibição principal. Eu joguei isso juntos. Pode ser suficiente para você.

#! /bin/bash

#dump the list of windows to a file
wmctrl -l > /tmp/window_list.txt
x=40; y=40

#read the window information from the file
while read id sticky host win_title; do

    #move any non-sticky windows except the desktop
    if [ "$sticky" == "0" -a "$win_title" != "x-nautilus-desktop" ]
      then
        wmctrl -i -r $id -e 0,$x,$y,-1,-1
        x=$(($x + 40))
        y=$(($y + 40))
    fi

done < /tmp/window_list.txt

#delete the temporary file
rm /tmp/window_list.txt
exit 0

Salve-o em um arquivo chamado "move_windows.sh" ou algo assim e conceda a ele permissões de execução com chmod +x move_windows.sh e crie um iniciador para ele.

    
por Ramón 26.05.2011 / 02:23
3

O script que fiz abaixo funciona para mim, requer apenas wmctrl . Você pode obter isso no Ubuntu com o comando sudo apt-get install wmctrl .

Se necessário, você pode precisar fazer algumas pequenas modificações .

$BEFORE_WINDOW_NAME deve ser definido para a última string do nome do seu computador (você pode ver isso de System Settings > Details > Device name ).

$MONITORS isso funcionará com dois monitores (com uma resolução de 1920x#### ), embora seja possível redefinir essa variável definindo um elemento para cada monitor conectado ao seu dispositivo e configurando-o para qualquer coordenada x nessa tela.

$SKIPPED_WINDOWS é uma lista de janelas que você não deseja mover quando esse script é chamado. Sinta-se à vontade para adicionar ou remover itens. Lista de itens pode ser vista digitando o comando wmctrl -l .

Por fim, esse script recebe um parâmetro, por exemplo: window_control.sh n , em que n é o monitor que move as janelas.

#! /bin/bash
IFS=$'\n' #prevents window names from breaking in loop

#Computers Name
#change this to the last characters before window names 
#0x02a00002  0 mycomputer-Envy-M3970 XdndCollectionWindowImp -> ie:last characters in computer name

BEFORE_WINDOW_NAME="M3970" #MODIFY ME!!
WINDOWS=$(wmctrl -l | grep -oh -P "(?<=$BEFORE_WINDOW_NAME\ ).*")
#MODIFY MONITORS if needed
declare -a MONITORS=(
'0'     # Monitor 1
'2150'  # Monitor 2
);  
declare -a SKIPPED_WINDOWS=(
'XdndCollectionWindowImp'
'unity-launcher'
'unity-panel'
'unity-dash'
'Hud'
'Desktop'
'Ubuntu'
);

#loop through window names and move them
for i in $WINDOWS; do
  if [[ " ${SKIPPED_WINDOWS[@]} " =~ " ${i} " ]]; then
    # whatever you DO NOT want to do when arr contains value
#    echo "Skipping $i"
    echo ""
  else
    # whatever you want to do when arr contains value
    echo "Moving $i"
    wmctrl -r "$i" -b remove,maximized_vert,maximized_horz
    wmctrl -r "$i" -e 0,"${MONITORS[$1]}",0,800,800
    wmctrl -r "$i" -b add,maximized_vert,maximized_horz
  fi
done
    
por Miroslav 01.08.2016 / 05:36
0

Adoraria encontrar uma solução melhor, mas o Compiz tem Agrupar das janelas.

    
por earthmeLon 25.05.2011 / 22:55