web-dev-qa-db-fra.com

Comment déplacer toutes les fenêtres sur un seul écran avec une seule commande?

Lors du retrait de mon ordinateur portable de moniteurs externes twinview vers un seul écran, je voudrais avoir une seule commande pour déplacer toutes les fenêtres sur mon écran principal.

Bien que nvidia fasse une partie du travail pour que je puisse voir le bord des fenêtres, déplacer chacune avec les plugins de la souris, du clavier ou de la compiz prend du temps.

3
Cas

Le script que j'ai créé ci-dessous fonctionne pour moi, ne nécessite que wmctrl. Vous pouvez l'obtenir sur Ubuntu avec la commande Sudo apt-get install wmctrl.

Si nécessaire, vous devrez peut-être faire quelques modifications mineures.

$BEFORE_WINDOW_NAME doit être défini sur la dernière chaîne du nom de votre ordinateur extraite (vous pouvez le voir depuis System Settings> Details> Device name).

$MONITORS cela fonctionnera avec 2 moniteurs (avec une résolution de 1920x####) bien que vous puissiez redéfinir cette variable en définissant un élément pour chaque moniteur connecté à votre appareil et en le définissant sur n'importe quelle coordonnée x sur cet écran.

$SKIPPED_WINDOWS est une liste de fenêtres que vous ne souhaitez pas déplacer lors de l'appel de ce script. N'hésitez pas à ajouter ou supprimer des éléments. La liste des éléments peut être consultée en tapant la commande wmctrl -l.

Enfin, ce script accepte un paramètre, à savoir: window_control.sh n, où n est le moniteur pour déplacer les fenêtres.

#! /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
3
Miroslav Glamuzina

Vous pouvez utiliser wmctrl et un petit script bash pour parcourir les fenêtres, puis les positionner sur votre affichage principal. J'ai jeté ça ensemble. Cela pourrait vous suffire.

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

Enregistrez-le dans un fichier appelé "move_windows.sh" ou quelque chose et donnez-lui des autorisations d'exécution avec chmod +x move_windows.sh puis créez un lanceur pour celui-ci.

3
Ramón

J'aimerais trouver une meilleure solution, mais Compiz a Group ing de fenêtres.

0
earthmeLon