elsa in mac

hyprland, Master Layout 설정 #2 - window 개수에 따른 자동 재배치 본문

Mac(OS X)/Asahi Linux

hyprland, Master Layout 설정 #2 - window 개수에 따른 자동 재배치

elsa in mac 2024. 1. 30. 01:10

이번 포스트에서는 앞서  Master Layout 설정 기본편에 이은 좀 더 심화된 설정에 대해 알아보고자 합니다.

Master Layout을 기본으로 설정하게 되면, 문제가 하나 발생하게 됩니다. 윈도우가 1개 떠 있을 때는, 중앙에 표시가 되지만, Window가 두 개가 뜨게 되면, Master Window의 오른쪽에 위치하게 됩니다. 왼쪽은 텅 비게 되지요. 이러한 단점을 보안하는 방법입니다.  아래는 window 수에 따른 Master Layout 요구 규칙 입니다.

Case Study
1. 윈도우가 하나일 경우에는 중앙에 배치하되 window 폭을 65%로 설정한다.(mfact = 0.65)
2. 윈도우가 2개 일때는 mfact를 0.5(50%)로 변경하고, master window는 오른에 배치한다.
3. 윈도우가 3개 이상 일때는 mfact는 0.45로 변경하고, master window는 center window로 정한다. 
2. 윈도우가 2개 일때는 splitratio exact를 0.5(50%)로 변경하고, master window는 오른에 배치한다.
3. 윈도우가 3개 이상 일때는 splitratioexact를 0.45로 변경하고, master window는 center window로 정한다. 

How to
위와 같이 window 수에 따른 자동화를 구현하기 위해서는 hyprctl 도구를 사용해야 합니다. hyprctl은 shell 에서 사용할 수 있는 CLI도구로 옵션을 직접 외부에서 설정할 수 있습니다. 다음, 실시간으로 window가 open되거나 close되는 것을 감지할 수 있어야 하며, 이러한 이벤트가 발생했을 때 active workspace의 왼도우 수를 확인할 수 있어야 합니다.  hyprland는 socat을 이용한 IPC를 통해 이러한 이벤트를 확인할 수 있습니다. 

Implementation
예를들어 changelayout.sh 라는 shell script를 하나 생성하고, 실행권한을 부여 합니다. (파일명은 아무거나 상관없음)

touch changelayout.sh
chmod +x changelayout.sh

다음, editor로 해당 파일을 열고, 아래와 같이 작성합니다.

#!/bin/sh

handle() {
  case $1 in
    openwindow*|closewindow*|changefloatingmode*)
      sleep 0.1
      workspace_info=$(hyprctl activeworkspace -j)
      workspace_id=$(echo "$workspace_info" | jq -r '.id')
      workspace_name=$(echo "$workspace_info" | jq -r '.name')

      clients_info=$(hyprctl clients -j)
      matching_windows=$(echo "$clients_info" | jq -r --arg workspace_id "$workspace_id" --arg workspace_name "$workspace_name" 'map(select(.workspace.id == ($workspace_id | tonumber) and .workspace.name == $workspace_name and .floating == false)) | length')

      # debugging
      #echo "Matching non-floating windows for workspace $workspace_name (ID: $workspace_id): $matching_windows"

      case $matching_windows in
        1)
          hyprctl dispatch splitratio exact 0.65 ; hyprctl dispatch "layoutmsg orientationcenter" ; hyprctl reload
          ;;
        2)
          hyprctl dispatch splitratio exact 0.5 ; hyprctl dispatch "layoutmsg orientationright" ; hyprctl reload
          ;;
        *)
          hyprctl dispatch splitratio exact 0.45 ; hyprctl dispatch "layoutmsg orientationcenter" ; hyprctl reload
          ;;
      esac
      ;;
  esac
}

socat -U - UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do
    handle "$line"
done

코드의 맨 아래 부분을 보면, socat -U - UNIX-CONNECT... 부분이 있습니다. hyprland가 실행되면, 생성되는 socket2.sock을 통해 while loop를 돌며.. 각 line을 읽고, handle 함수를 호출하게 됩니다.

handle 함수를 보면, widow의 open/close 그리고 floating 변환 이벤트가 발생했을 경우, activeworkspace의 window 수를 확인합니다.  그리고, window의 수가 1개, 2개 또는 그 이상의 각 조건에 대해 window의 layout 조건을 변경하게 됩니다.  각 조건에 대한 제어는 위의 case study에 준합니다.

결과는 아래와 같습니다.

원하는 결과가 정상적으로 나왔다면.. 이제 마지막으로 부팅 시에 자동으로 이 shell script가 실행되도록 아래와 같이 파일의 경로를 hyprland 설정파일 내에  exec-once로 설정해 주면 됩니다. (경로와 이름은 각자 환경에 맞게 수정하면 됨)

exec-once /home/elsa/.config/hypr/UserScripts/changelayout.sh &

 event 조건과 실행 루틴에 대한 것만 바꿔주거나 추가해 주면  hyprland 관련되어 다양한 커스텀 자동화를 구현할 수 있습니다. 참고하시고 도움이 되었으면 합니다.  

공유하기 링크
Comments