Я использую свой ноутбук в разных конфигурациях. Иногда я использую только ноутбук с выходом LVDS1. Иногда у меня есть один монитор (DP1) справа от LVDS. Иногда слева. Иногда у меня есть два монитора (DP2 / DP3) - один слева и один справа от LVDS
Я хотел бы настроить свой рабочий стол для этой среды. Я хочу, чтобы панель xfce всегда была на LVDS, веб-браузер - всегда на внешнем мониторе (и, если есть 2 монитора - справа), коммуникатор (pidgin) слева (DP2) или LVDS, если левого монитора нет.
Я подготовил набор скриптов для настройки xserver с использованием xrandr - для всех конфигураций. положение панели я устанавливаю с помощью xfconf-запроса.
Но - как перенести конкретное приложение на конкретный монитор? Например - как запустить все приложения pidgin для DP2? Я не хочу делать это мышью - я хочу переместить все отфильтрованные клиенты xwindow на определенный экран. Это возможно?
Если Ваша главная цель состоит в том, чтобы избегать использования мыши, этот сценарий позволяет, чтобы клавиша быстрого вызова переместила окна между мониторами. Это работает отлично для меня на моей тройной установке монитора. Тогда Вы можете назначить клавишу быстрого вызова на плитку после перемещения к новому монитору.
Источник: 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
Для различных мониторов размера
я имею 1920x1080 монитор центра и два 1440x900 мониторы стороны.
display_width=`xdotool getdisplaygeometry | cut -d" " -f1`
display_height=`xdotool getdisplaygeometry | cut -d" " -f2`
вышеупомянутые две команды производят размеры моего самого большого монитора, даже если окно, оказывается, находится на мониторе стороны. Поэтому сценарий всегда перемещал окно согласно этим размерам. Это вызвало сценарий к не, всегда двигаются к следующему монитору, но иногда он двигался бы к предыдущему монитору. Я взял свой полный экран width (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