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.
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
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.