расставить окна по сценарию

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

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

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

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

0
задан 6 October 2015 в 10:21

2 ответа

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

  1. Загрузка сценарий ниже. Спасите под ~/, мусорное ведро /
  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 - добираются, устанавливают xdotool wmctrl
  2. , Затем назначают клавишу быстрого вызова для сценария под Клавиатурой> Прикладные Короткие пути. (Я использую Alt+Right. Затем, чтобы крыть право черепицей я использую Ctrl+Alt+Right и крыть черепицей оставленный Ctrl+Alt+Left. Окно, кроющее клавиши быстрого вызова черепицей, находится под Администратором полноэкранного режима.)
    Источник: http://makandracards.com/makandra/12447-how-to-move-a-window-to-the-next-monitor-on-xfce-xubuntu

Для различных мониторов размера
я имею 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`
0
ответ дан 6 October 2015 в 20:21
  • 1
    Странный, плюс изменение должно быть непосредственным. Возможно, попытайтесь войти в гостевую сессию, используйте dconf-редактора или cli & посмотрите, работает ли это там. – doug 26 December 2016 в 13:55

По некоторым причинам я могу добавить ответ, но не могу прокомментировать ответ 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
0
ответ дан 6 October 2015 в 20:21

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

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