창 관리자 독립적인 창 크기 조정

창 관리자 독립적인 창 크기 조정

최근에 Windows 7에서 화면 크기 조정 기능을 접했는데 매우 좋다고 생각합니다. 다음과 같이 작동합니다.

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

현재 포커스가 있는 모니터 1에 응용 프로그램이 열려 있다고 가정해 보겠습니다.

  • mod4+up을 누르면 모니터 1에서 전체 화면으로 전환됩니다(즉, 영역 1과 2를 포함합니다).

  • mod4+왼쪽을 누르면 모니터 1의 절반 화면으로 전환됩니다(즉, 영역 1을 덮습니다).

  • mod4+오른쪽을 누르면 모니터 1의 절반 화면으로 전환됩니다(그러나 이제는 영역 2를 포함합니다).

  • mod4+right를 다시 누르면 모니터 2(영역 3)에서 절반 화면으로 전환됩니다.

  • mod4+right를 다시 누르면 모니터 2(영역 4)에서 절반 화면으로 전환됩니다.

  • mod4+up을 다시 누르면 모니터 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

xdotool다음은 두 가지 를 모두 사용하여 xrandr작업을 수행하는 bash 스크립트입니다 . 가능해지면/사람들이 요청할 경우 더 자세한 내용/새 버전을 제공할 것입니다.

명령줄에서 해당 작업을 수행하며 특정 키 조합을 눌렀을 때 실행을 시작하려면 창 관리자에서 구성해야 합니다.

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

관련 정보