При расстыковке моего ноутбука от twinview внешних мониторов назад к одному экрану я хотел бы иметь единственную команду, чтобы перейти все окна на мой основной экран.
Хотя Nvidia делает часть работы так, чтобы я видел, что край окон, перемещая каждого с мышью, клавиатурой или compiz плагинами занимает время.
Можно использовать wmctrl
и немного сценария удара, чтобы циклично выполниться через окна и затем расположить их на Ваш главный дисплей. Я бросил это вместе. Это могло бы быть достаточно для Вас.
#! /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
Сохраните его в файл, названный "move_windows.sh" или чем-то, и дайте его, выполняют полномочия с chmod +x move_windows.sh
и затем создайте средство запуска для него.
Я хотел бы найти лучшее решение, но Compiz имеет Группировку окон.
Сценарий, который я сделал ниже работ для меня, только требует wmctrl
. Можно получить это на Ubuntu с командой sudo apt-get install wmctrl
.
В случае необходимости Вы, возможно, должны сделать некоторые незначительные модификации.
$BEFORE_WINDOW_NAME
должен быть установлен на последнюю строку Вашего имени компьютера, которое вытягивают (можно просмотреть это от System Settings
>Details
>Device name
).
$MONITORS
это будет работать с 2 мониторами (с resoloution 1920x####
) хотя можно переопределить эту переменную путем установки элемента для каждого монитора, подключенного к устройству и установки его на любого x
координата на том экране.
$SKIPPED_WINDOWS
список окон, которые Вы не хотите перемещать, когда этот сценарий называют. Не стесняйтесь добавлять или удалять объекты. Список объектов может быть представлением путем ввода в команде wmctrl -l
.
Наконец, этот сценарий берут в одном параметре т.е.: window_control.sh n
, где n
монитор для перемещения окон.
#! /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