#!/bin/sh set -eu set -f # ✅ 회전시킬 대상 모니터의 "id"를 적어주세요. # 값 찾는 법: `displayplacer list` 실행 → 맨 아래에 나오는 displayplacer 명령에서 # 해당 외장 모니터 조각 내의 id:XXXXXXXX-... 값을 복사 MONITOR_ID="FC383B72-B220-459C-B3C4-542367A9E560" if [ "$MONITOR_ID" = "PUT-YOUR-DISPLAY-ID-HERE" ]; then echo "❌ MONITOR_ID를 설정하세요. (export MONITOR_ID='...') 또는 스크립트 상단 수정" exit 1 fi # 1) displayplacer 가 뿜는 '전체 레이아웃' 명령의 '마지막 줄'만 가져온다. CMD=$(displayplacer list | grep '^displayplacer ' | tail -n 1 || true) if [ -z "${CMD:-}" ]; then echo "❌ 현재 구성 명령을 찾지 못했습니다. (displayplacer list 확인)" exit 1 fi # 2) 따옴표로 감싼 각 세그먼트("...")를 추출한다. # awk RS=\" 를 쓰면 따옴표 안쪽 텍스트만 짝수 NR 에서 얻을 수 있음. SEG_FILE="$(mktemp)" printf '%s\n' "$CMD" | awk -v RS='"' 'NR%2==0{print}' >"$SEG_FILE" if ! [ -s "$SEG_FILE" ]; then echo "❌ 세그먼트 파싱 실패" rm -f "$SEG_FILE" exit 1 fi # 3) (0,0) 메인 화면 id 파악(정보용). 바꾸지는 않음. MAIN_ID="" while IFS= read -r seg; do case "$seg" in *"origin:(0,0)"*) MAIN_ID=$(echo "$seg" | sed -n 's/.*id:\([^ ]*\).*/\1/p') ;; esac done <"$SEG_FILE" # 4) 대상 모니터 degree 토글 (0→90→180→270→0) next_degree() { case "$1" in 0) echo 90 ;; 90) echo 180 ;; 180) echo 270 ;; 270) echo 0 ;; *) echo 90 ;; esac } TARGET_FOUND=0 NEW_SEGMENTS_FILE="$(mktemp)" while IFS= read -r seg; do case "$seg" in id:"$MONITOR_ID"*) TARGET_FOUND=1 cur_deg=$(printf '%s' "$seg" | grep -o 'degree:[0-9]*' | cut -d: -f2 || true) [ -z "${cur_deg:-}" ] && cur_deg=0 new_deg=$(next_degree "$cur_deg") # degree 키가 원래 없던 경우엔 끝에 붙여준다. if printf '%s' "$seg" | grep -q 'degree:'; then seg=$(printf '%s' "$seg" | sed "s/degree:$cur_deg/degree:$new_deg/") else seg="$seg degree:$new_deg" fi ;; esac printf '%s\n' "$seg" >>"$NEW_SEGMENTS_FILE" done <"$SEG_FILE" rm -f "$SEG_FILE" if [ "$TARGET_FOUND" -ne 1 ]; then echo "❌ MONITOR_ID=$MONITOR_ID 가 현재 구성에 없습니다. (displayplacer list 로 id 재확인)" rm -f "$NEW_SEGMENTS_FILE" exit 1 fi # 5) 전체 세그먼트를 그대로(순서 포함) 재적용해 메인 유지 # 각 세그먼트를 다시 따옴표로 감싸 displayplacer에 전달 CMDLINE="displayplacer" while IFS= read -r seg; do # 따옴표로 감싸 공백/괄호 보존 CMDLINE="$CMDLINE \"$seg\"" done <"$NEW_SEGMENTS_FILE" rm -f "$NEW_SEGMENTS_FILE" # 실행 # shellcheck disable=SC2086 eval "$CMDLINE" # 안내 if [ -n "$MAIN_ID" ]; then if [ "$MONITOR_ID" = "$MAIN_ID" ]; then echo "ℹ️ 지금 돌린 대상은 (0,0) 메인 화면(ID=$MAIN_ID)입니다. 메인은 그대로 유지됩니다." else echo "✅ 회전 완료. 메인(ID=$MAIN_ID, origin:(0,0)) 유지됨." fi else echo "✅ 회전 완료." fi