summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2025-09-12 19:41:22 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2025-09-12 19:41:22 +0900
commit373cef6a84fb83a3b58f09d0c17f0f590d4f831a (patch)
tree42a21d63ac170d419225679e0fa857c9a918354b
parentedc9609f963aef18e9d3f8b4290f6a0f05f080e2 (diff)
created bin/rotating
-rwxr-xr-xmac/.local/bin/rotating107
1 files changed, 107 insertions, 0 deletions
diff --git a/mac/.local/bin/rotating b/mac/.local/bin/rotating
new file mode 100755
index 0000000..982042c
--- /dev/null
+++ b/mac/.local/bin/rotating
@@ -0,0 +1,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