упорядочивать окна по сценарию

Я использую свой ноутбук в разных конфигурациях. Иногда я использую только ноутбук с выходом LVDS1. Иногда у меня один монитор (DP1) справа от LVDS. Иногда слева. Иногда у меня есть два монитора (DP2 / DP3) – один слева, а один справа от LVDS

Я бы хотел настроить свой рабочий стол для этой среды. Я хочу, чтобы панель xfce всегда находилась на LVDS, веб-браузер – всегда на внешнем мониторе (а если есть 2 монитора – справа), коммуникатор (pidgin) слева (DP2) или LVDS, если нет левого монитора.

Я подготовил набор сценариев для конфигурирования xserver с помощью xrandr – для всех конфигураций. положение панели, которую я устанавливаю по запросу xfconf.

Но – как перенести конкретное приложение на конкретный монитор? Например, как запустить все приложения pidgin для DP2? Я не хочу делать это с помощью мыши – я хочу перенести все отфильтрованные клиенты xwindow на определенный экран. Возможно?

Если ваша главная цель – не использовать мышь, этот скрипт позволяет использовать сочетание клавиш для перемещения окон между мониторами. Он отлично работает для меня на моей установке с тремя мониторами. Затем вы можете назначить сочетание клавиш для фрагментации после перехода на новый монитор.

  1. Загрузите скрипт ниже. Сохранить в ~ / bin /
  2. Сделайте его исполняемым: chmod + x ~ / bin / move-to-next-monitor

Источник: https://github.com/jc00ke/bin/blob/master/move-to-next-monitor . Благодаря jc00ke!

#!/bin/sh # # Move the current window to the next monitor. # # Also works only on one X screen (which is the most common case). # # Props to # http://icyrock.com/blog/2012/05/xubuntu-moving-windows-between-monitors/ # # Unfortunately, both "xdotool getwindowgeometry --shell $window_id" and # checking "-geometry" of "xwininfo -id $window_id" are not sufficient, as # the first command does not respect panel/decoration offsets and the second # will sometimes give a "-0-0" geometry. This is why we resort to "xwininfo". # Make sure your largest monitor is set to Primary display. screen_width=`xdpyinfo | awk '/dimensions:/ { print $2; exit }' | cut -d"x" -f1` screen_height=`xdpyinfo | awk '/dimensions:/ { print $2; exit }' | cut -d"x" -f2` display_width=`xdotool getdisplaygeometry | cut -d" " -f1` display_height=`xdotool getdisplaygeometry | cut -d" " -f2` window_id=`xdotool getactivewindow` # Remember if it was maximized. window_state=`xprop -id $window_id _NET_WM_STATE | awk '{ print $3 }'` # Un-maximize current window so that we can move it wmctrl -ir $window_id -b remove,maximized_vert,maximized_horz # Read window position x=`xwininfo -id $window_id | awk '/Absolute upper-left X:/ { print $4 }'` y=`xwininfo -id $window_id | awk '/Absolute upper-left Y:/ { print $4 }'` # Subtract any offsets caused by panels or window decorations x_offset=`xwininfo -id $window_id | awk '/Relative upper-left X:/ { print $4 }'` y_offset=`xwininfo -id $window_id | awk '/Relative upper-left Y:/ { print $4 }'` x=`expr $x - $x_offset` y=`expr $y - $y_offset` # Compute new X position new_x=`expr $x + $display_width` # Compute new Y position new_y=`expr $y + $display_height` # If we would move off the right-most monitor, we set it to the left one. # We also respect the window's width here: moving a window off more than half its width won't happen. width=`xdotool getwindowgeometry $window_id | awk '/Geometry:/ { print $2 }'|cut -d"x" -f1` if [ `expr $new_x + $width / 2` -gt $screen_width ]; then new_x=`expr $new_x - $screen_width` fi height=`xdotool getwindowgeometry $window_id | awk '/Geometry:/ { print $2 }'|cut -d"x" -f2` if [ `expr $new_y + $height / 2` -gt $screen_height ]; then new_y=`expr $new_y - $screen_height` fi # Don't move off the left side. if [ $new_x -lt 0 ]; then new_x=0 fi # Don't move off the bottom if [ $new_y -lt 0 ]; then new_y=0 fi # Move the window xdotool windowmove $window_id $new_x $new_y # Maintain if window was maximized or not if [ "${window_state}" = "_NET_WM_STATE_MAXIMIZED_HORZ," ]; then wmctrl -ir $window_id -b add,maximized_vert,maximized_horz fi 
  1. Если вы еще не установили, установите xdotool и wmctrl: sudo apt-get install xdotool wmctrl
  2. Затем назначьте сочетание клавиш для скрипта в разделе «Клавиатура»> «Ярлыки приложений». (Я использую Alt + Right, а затем, чтобы правильно рисовать, я использую Ctrl + Alt + Right и оставляю Ctrl + Alt + Left. Клавиши быстрого доступа к окнам в Window Manager.)
    Источник: http://makandracards.com/makandra/12447-how-to-move-a-window-to-the-next-monitor-on-xfce-xubuntu

Для мониторов разного размера
У меня есть центральный монитор 1920×1080 и два боковых монитора 1440×900.

 display_width=`xdotool getdisplaygeometry | cut -d" " -f1` display_height=`xdotool getdisplaygeometry | cut -d" " -f2` 

Вышеуказанные две команды выводят размеры моего самого большого монитора, даже если окно находится на боковом мониторе. Поэтому сценарий всегда перемещал окно в соответствии с этими размерами. Это привело к тому, что сценарий не всегда переходил на следующий монитор, но иногда он переходил на предыдущий монитор. Я взял общую ширину экрана (4800) и разделил ее на три. Теперь он всегда переходит к следующему монитору.

 display_width="1600" display_height=`xdotool getdisplaygeometry | cut -d" " -f2` 

По какой-то причине я могу добавить ответ, но не могу комментировать ответ jbrock выше …

на моей платформе (Fedora 22) xprop -id $window_id _NET_WM_STATE возвращает «_NET_WM_STATE_FOCUSED», а не ничего для не максимизированных окон, поэтому скрипт как всегда максимизирует окно после его перемещения.

Также возможно, чтобы окно было максимизировано только в одном направлении, но сценарий всегда применяет оба направления назад в конце.

Чтобы восстановить окно точно до состояния максимизации, которое было раньше, дважды проверьте два флажка и добавьте их отдельно. Замените последние 3 строки исходного скрипта следующим:

 if [[ $window_state = *MAXIMIZED_HORZ* ]]; then wmctrl -ir $window_id -b add,maximized_horz fi if [[ $window_state = *MAXIMIZED_VERT* ]]; then wmctrl -ir $window_id -b add,maximized_vert fi