diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2025-09-12 19:41:22 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2025-09-12 19:41:22 +0900 |
| commit | 373cef6a84fb83a3b58f09d0c17f0f590d4f831a (patch) | |
| tree | 42a21d63ac170d419225679e0fa857c9a918354b | |
| parent | edc9609f963aef18e9d3f8b4290f6a0f05f080e2 (diff) | |
created bin/rotating
| -rwxr-xr-x | mac/.local/bin/rotating | 107 |
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 |
