summaryrefslogtreecommitdiff
path: root/mac/.local/bin/rotating
blob: 982042cea33baaa23160ff97ab453ef6df7e2230 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/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