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
|