Как я могу переместить все окна в один экран с единственной командой?

При расстыковке моего ноутбука от twinview внешних мониторов назад к одному экрану я хотел бы иметь единственную команду, чтобы перейти все окна на мой основной экран.

Хотя Nvidia делает часть работы так, чтобы я видел, что край окон, перемещая каждого с мышью, клавиатурой или compiz плагинами занимает время.

3
задан 14 August 2011 в 12:23

3 ответа

Можно использовать 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 и затем создайте средство запуска для него.

3
ответ дан 1 December 2019 в 15:30

Я хотел бы найти лучшее решение, но Compiz имеет Группировку окон.

0
ответ дан 1 December 2019 в 15:30

Сценарий, который я сделал ниже работ для меня, только требует 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
3
ответ дан 1 December 2019 в 15:30

Другие вопросы по тегам:

Похожие вопросы: