оконный менеджер, независимое изменение размера экрана

Недавно я столкнулся с изменением размера экрана в Windows 7, и мне это очень приятно. Это работает так:

    monitor 1                       monitor 2
-------------------------   ----------------------------
|          |            |   |             |            | 
|          |            |   |             |            |
|          |            |   |             |            |
|   1      |    2       |   |    3        |    4       |
|          |            |   |             |            |
|          |            |   |             |            |
|          |            |   |             |            |
-------------------------   ----------------------------

Скажем, у вас есть приложение, открытое на мониторе 1, в данный момент в фокусе.

  • Если вы нажмете mod4 + вверх, он переходит в полноэкранный режим на мониторе 1 (то есть охватывает области 1 и 2).

  • Если вы нажмете mod4 + влево, на мониторе 1 появится половина экрана (то есть охватит область 1).

  • Если вы нажмете mod4 + вправо, на мониторе 1 появится половина экрана (но теперь он покрывает область 2).

  • Снова нажмите mod4 + вправо, и на мониторе 2 (область 3) появится половина экрана

  • Снова нажмите клавишу mod4 +, и на мониторе 2 (область 2) она перейдет. 4)

  • Снова нажмите mod4 + вверх, и он переходит в полноэкранный режим на мониторе 2 (области 3 и 4)

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

  • p_right перемещается вправо: переход от полноэкранного режима на мониторе 1 к области 2, к области 3, к области 4
  • p_left перемещается влево
  • p_full делает приложение полноэкранным на текущем мониторе
  • p_right и p_left умны: они отправляют программу на другой монитор только при ее наличии.

Конечно, тогда мне нужно будет подключить свои приложения к моему оконному менеджеру, чтобы программы вызывались при нажатии комбинации клавиш

Как мне поступить так? ? Нужно ли программировать на X / Wayland, или есть какая-то утилита, которую я могу использовать, и мои программы могут стать относительно тривиальными скриптами bash ?

Редактировать:

xdotool getactivewindow windowmove 21% 0 windowsize 21% 70%

Предыдущая команда устанавливает размер окна размером

xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o

Эта команда получает геометрию всех мониторов

Я выложу полный ответ, когда он будет готов

1
задан 22 June 2019 в 01:28

1 ответ

Далее следует скрипт bash, использующий как xdotool, так и xrandr. Я предоставлю более подробную информацию / новые версии, когда это станет возможным / если люди попросят об этом.

Он выполняет свою работу из командной строки и должен быть настроен в вашем оконном менеджере для запуска при нажатии определенной комбинации клавиш

first_monitor=`xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o | head -n 1`
#echo $first_monitor
number_monitors=`xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o | wc -l`
#echo $number_monitors

if [ $number_monitors -eq 2 ] 
then
   second_monitor=`xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o | tail -n 1`
fi
if [ $number_monitors -ne 2 ] 
then
   second_monitor='not there'
fi

size_first_monitor=`echo $first_monitor | awk 'BEGIN { FS="x" } { print $1 }'`
[ $second_monitor != 'not there' ] &&  size_second_monitor=`echo $second_monitor | awk 'BEGIN { FS="x" } { print $1 }'`

position_px=`xdotool getactivewindow getwindowgeometry | grep Position | awk '{print $2}' | awk 'BEGIN { FS="," } { print $1 }'`

position='outside'
(( $position_px < $size_first_monitor/2 )) && position='first_half_first_monitor'
(( $position_px >= $size_first_monitor/2 )) && (($position_px < $size_first_monitor)) && position='second_half_first_monitor'
if [ '$second_monitor' != 'not there' ] 
 then
 (( $position_px >= $size_first_monitor )) && (($position_px < $size_first_monitor+($size_second_monitor/2) )) && position='first_half_second_monitor'
 (($position_px >= $size_first_monitor+($size_second_monitor/2)  )) && position='second_half_second_monitor'
fi

height_first_monitor=`echo $first_monitor | awk 'BEGIN { FS="+" } { print $1 }'|awk 'BEGIN { FS="x" } { print $2 }'`
height_second_monitor=`echo $second_monitor | awk 'BEGIN { FS="+" } { print $1 }'|awk 'BEGIN { FS="x" } { print $2 }'`
height_first_monitor=$(( $height_first_monitor - 20 ))
height_second_monitor=$(( $height_second_monitor - 20 ))

first_position="xdotool getactivewindow windowmove 0 0 windowsize $(( $size_first_monitor/2 )) $height_first_monitor"
second_position="xdotool getactivewindow windowmove $(( $size_first_monitor/2 )) 0  windowsize $(( $size_first_monitor/2 )) $height_first_monitor"
third_position="xdotool getactivewindow windowmove $size_first_monitor 0  windowsize $(( $size_second_monitor/2 )) $height_second_monitor"
fourth_position="xdotool getactivewindow windowmove $(( $size_first_monitor + $size_second_monitor/2 )) 0 windowsize $(( $size_second_monitor/2 )) $height_second_monitor"

if [ "$1" == 'right' ]
then
   [ "$position" == 'first_half_second_monitor' ] && [ $second_monitor != 'not there' ]&& $fourth_position
   [ "$position" == 'second_half_first_monitor' ] && [ $second_monitor != 'not there' ]&& $third_position
   [ "$position" == 'first_half_first_monitor' ] && $second_position
fi

size_window=`xdotool getactivewindow  getwindowgeometry | grep Geometry | awk '{print $2}' | awk 'BEGIN { FS="x" } { print $1 }'`
if [ "$1" == 'left' ]
then
   [ "$position" == 'first_half_first_monitor' ] && $first_position
   [ "$position" == 'second_half_first_monitor' ] && $first_position
   [ "$position" == 'first_half_second_monitor' ] && [ $size_window != $size_second_monitor ] && $second_position
   [ "$position" == 'first_half_second_monitor' ] && [ $size_window == $size_second_monitor ] && $third_position
   [ "$position" == 'second_half_second_monitor' ] && $third_position
fi

echo $size_window
echo $size_second_monitor

max_first_monitor="xdotool getactivewindow windowmove 0 0  windowsize $size_first_monitor $height_first_monitor"
max_second_monitor="xdotool getactivewindow windowmove $size_first_monitor 0  windowsize $size_second_monitor $height_second_monitor"
if [ "$1" == 'maximize' ]
then
   [ "$position" == 'first_half_first_monitor' ] && $max_first_monitor
   [ "$position" == 'second_half_first_monitor' ] && $max_first_monitor
   [ "$position" == 'first_half_second_monitor' ] && $max_second_monitor
   [ "$position" == 'second_half_second_monitor' ] && $max_second_monitor
fi
0
ответ дан 22 June 2019 в 01:28

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

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