rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

X Window System : 画面解像度を変更するシェルスクリプト

2026 Sep. 12.
2026 Feb. 22.
2025 Aug. 30.

changeScreenResolution.sh

#!/bin/bash

# 2026 Sep. 12.
# 2025 Aug. 30.
# Change screen-resolution

set -euo pipefail

MyXResolution=""
MyYResolution=""

## parse command-line options
while getopts "x:y:" opt; do
  case $opt in
    x) MyXResolution="$OPTARG" ;;
    y) MyYResolution="$OPTARG" ;;
    *) echo "Usage: $0 -x XResolution -y YResolution" >&2
       exit 1 ;;
  esac
done

## check if both options are provided
if [ -z "$MyXResolution" ] || [ -z "$MyYResolution" ]; then
  echo "Error: Both -x and -y options must be specified." >&2
  echo "Example: ${0##*/} -x 1024 -y 768" >&2
  exit 1
fi

## validate resolution values
if ! [[ "$MyXResolution" =~ ^[1-9][0-9]*$ ]] || ! [[ "$MyYResolution" =~ ^[1-9][0-9]*$ ]]; then
  echo "Error: Both -x and -y must be positive integers." >&2
  echo "Example: ${0##*/} -x 1024 -y 768" >&2
  exit 1
fi

W=$MyXResolution
H=$MyYResolution

# Xfceの初期化が完了するまで少し待機する
sleep 2

# スクリーン名取得
Screen=$(xrandr | awk '/ connected /{print $1; exit}')

# 既存モードチェック
StdMode="${W}x${H}"
if xrandr | awk '/ connected /{flag=1; next} flag && $1==StdMode{exit 0} END{exit 1}'; then
  ModeToUse=$StdMode
else
  # CVTでModeline取得
  CvtLine=$(cvt "$W" "$H" \
            | awk '/Modeline/ { sub("Modeline ",""); print }')
  read -r RawName RestParams <<< "$CvtLine"
  RawName=${RawName//\"/}      # "1600x900_60.00"

  # モード名正規化: 先頭に'M'を付け,ピリオドを'p'に置換(例: M1600x900_60p00)
  SafeName="M${RawName//./p}"

  # パラメータを配列へ
  read -r -a Params <<< "$RestParams"

  # 新規モード登録
  xrandr --newmode "$SafeName" "${Params[@]}"

  ModeToUse=$SafeName
fi

# 画面に追加&適用
xrandr --addmode "$Screen" "$ModeToUse"
xrandr --output  "$Screen" --mode "$ModeToUse"

exit 0