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