Skip to content

Instantly share code, notes, and snippets.

@MizterB
Last active March 23, 2023 22:34
Show Gist options
  • Save MizterB/e7f7ec78559bc995488aa59d490a22d3 to your computer and use it in GitHub Desktop.
Save MizterB/e7f7ec78559bc995488aa59d490a22d3 to your computer and use it in GitHub Desktop.
Rotated Vertical Arcade Screen
#!/bin/bash
# INPUT FULL RESOLUTION
# BASED ON HORIZONTAL LAYOUT X/Y
FULL_RESOLUTION_X=1920
FULL_RESOLUTION_Y=1080
# INPUT CROPPED RESOLUTION - NOT ROTATED
# CROPPED_RESOLUTION_X=1400
# CROPPED_RESOLUTION_Y=1080
# ROTATION=normal
# INPUT CROPPED RESOLUTION
# BASED ON ROTATED VERTICAL LAYOUT X/Y
CROPPED_RESOLUTION_X=1080
CROPPED_RESOLUTION_Y=1480
ROTATION=left
# Ensure cropped resolution is a multiple of 8 to prevent possible resizing issues
CROPPED_RESOLUTION_X=$(($CROPPED_RESOLUTION_X/8*8))
CROPPED_RESOLUTION_Y=$(($CROPPED_RESOLUTION_Y/8*8))
# X Offset: Shift to right side
# OFFSET_X=$(($CROPPED_RESOLUTION_X - $FULL_RESOLUTION_X))
# Y Offset: Shift to bottom
# OFFSET_Y=$(($CROPPED_RESOLUTION_Y - $FULL_RESOLUTION_Y))
# WHEN ROTATED
# X Offset: Centered
OFFSET_X=$((($FULL_RESOLUTION_Y - $CROPPED_RESOLUTION_X)/2))
# Y Offset: Centered
OFFSET_Y=$((($FULL_RESOLUTION_X - $CROPPED_RESOLUTION_Y)/2))
# X Offset: Shift to left side
# OFFSET_X=0
# Y Offset: Shift to top
# OFFSET_Y=0
# Customize if desired
# OFFSET_X=0
OFFSET_Y=400
# Resolution as "XxY" strings
FULL_RESOLUTION="$FULL_RESOLUTION_X"x"$FULL_RESOLUTION_Y"
CROPPED_RESOLUTION="$CROPPED_RESOLUTION_X"x"$CROPPED_RESOLUTION_Y"
# Apply to the first connected device
#OUTPUT_DEVICE=$(xrandr | grep -e " connected [^(]" | sed -e "s/\([A-z0-9]\+\) connected.*/\1/")
OUTPUT_DEVICE=HDMI-A-0
# Generate a modeline for the cropped resolution
CROPPED_MODELINE=$(cvt $CROPPED_RESOLUTION_X $CROPPED_RESOLUTION_Y | grep Modeline | cut -d' ' -f3-)
# Debug information
echo
echo "------------------------------------------------------------------------------------------------------------------------------"
echo "Full Resolution: $FULL_RESOLUTION"
echo "Cropped Resolution: $CROPPED_RESOLUTION"
echo "X Offset: $OFFSET_X"
echo "Y Offset: $OFFSET_Y"
echo "Output Device: $OUTPUT_DEVICE"
echo "Cropped Modeline: $CROPPED_MODELINE"
echo "------------------------------------------------------------------------------------------------------------------------------"
echo "xrandr --newmode $CROPPED_RESOLUTION $CROPPED_MODELINE"
echo "xrandr --addmode $OUTPUT_DEVICE $CROPPED_RESOLUTION"
echo "xrandr --output $OUTPUT_DEVICE --fb $CROPPED_RESOLUTION --panning $CROPPED_RESOLUTION --mode $CROPPED_RESOLUTION"
echo "xrandr --fb $CROPPED_RESOLUTION --output $OUTPUT_DEVICE --mode $FULL_RESOLUTION --transform 1,0,$OFFSET_X,0,1,$OFFSET_Y,0,0,1 --rotate $ROTATION"
echo
echo
# Create a new mode for the cropped resolution
xrandr --newmode $CROPPED_RESOLUTION $CROPPED_MODELINE
# Add the new mode to the output device
xrandr --addmode $OUTPUT_DEVICE $CROPPED_RESOLUTION
# Apply the new mode to the output device
xrandr --output $OUTPUT_DEVICE --fb $CROPPED_RESOLUTION --panning $CROPPED_RESOLUTION --mode $CROPPED_RESOLUTION
# Apply the new mode inside the full resolution with offsets
xrandr --fb $CROPPED_RESOLUTION --output $OUTPUT_DEVICE --mode $FULL_RESOLUTION --transform 1,0,$OFFSET_X,0,1,$OFFSET_Y,0,0,1 --rotate $ROTATION
#!/bin/bash
# INPUT FULL RESOLUTION - NOT ROTATED
FULL_RESOLUTION_X=1920
FULL_RESOLUTION_Y=1080
# INPUT CROPPED RESOLUTION - NOT ROTATED
CROPPED_RESOLUTION_X=1400
CROPPED_RESOLUTION_Y=1080
# Ensure cropped resolution is a multiple of 8 to prevent possible resizing issues
CROPPED_RESOLUTION_X=$(($CROPPED_RESOLUTION_X/8*8))
CROPPED_RESOLUTION_Y=$(($CROPPED_RESOLUTION_Y/8*8))
# X Offset: Shift to right side
# OFFSET_X=$(($CROPPED_RESOLUTION_X - $FULL_RESOLUTION_X))
# Y Offset: Shift to bottom
# OFFSET_Y=$(($CROPPED_RESOLUTION_Y - $FULL_RESOLUTION_Y))
# X Offset: Centered
OFFSET_X=$((($CROPPED_RESOLUTION_X - $FULL_RESOLUTION_X)/2))
# Y Offset: Centered
OFFSET_Y=$((($CROPPED_RESOLUTION_Y - $FULL_RESOLUTION_Y)/2))
# X Offset: Shift to left side
# OFFSET_X=0
# Y Offset: Shift to top
# OFFSET_Y=0
# Customize if desired
# OFFSET_X=0
# OFFSET_Y=0
# Resolution as "XxY" strings
FULL_RESOLUTION="$FULL_RESOLUTION_X"x"$FULL_RESOLUTION_Y"
CROPPED_RESOLUTION="$CROPPED_RESOLUTION_X"x"$CROPPED_RESOLUTION_Y"
# Apply to the first connected device
#OUTPUT_DEVICE=$(xrandr | grep -e " connected [^(]" | sed -e "s/\([A-z0-9]\+\) connected.*/\1/")
OUTPUT_DEVICE=HDMI-A-0
# Generate a modeline for the cropped resolution
CROPPED_MODELINE=$(cvt $CROPPED_RESOLUTION_X $CROPPED_RESOLUTION_Y | grep Modeline | cut -d' ' -f3-)
# Debug information
echo
echo "------------------------------------------------------------------------------------------------------------------------------"
echo "Full Resolution: $FULL_RESOLUTION"
echo "Cropped Resolution: $CROPPED_RESOLUTION"
echo "X Offset: $OFFSET_X"
echo "Y Offset: $OFFSET_Y"
echo "Output Device: $OUTPUT_DEVICE"
echo "Cropped Modeline: $CROPPED_MODELINE"
echo "------------------------------------------------------------------------------------------------------------------------------"
echo "xrandr --newmode $CROPPED_RESOLUTION $CROPPED_MODELINE"
echo "xrandr --addmode $OUTPUT_DEVICE $CROPPED_RESOLUTION"
echo "xrandr --output $OUTPUT_DEVICE --fb $CROPPED_RESOLUTION --panning $CROPPED_RESOLUTION --mode $CROPPED_RESOLUTION"
echo "xrandr --fb $CROPPED_RESOLUTION --output $OUTPUT_DEVICE --mode $FULL_RESOLUTION --transform 1,0,$OFFSET_X,0,1,$OFFSET_Y,0,0,1"
echo
echo
# Create a new mode for the cropped resolution
xrandr --newmode $CROPPED_RESOLUTION $CROPPED_MODELINE
# Add the new mode to the output device
xrandr --addmode $OUTPUT_DEVICE $CROPPED_RESOLUTION
# Apply the new mode to the output device
xrandr --output $OUTPUT_DEVICE --fb $CROPPED_RESOLUTION --panning $CROPPED_RESOLUTION --mode $CROPPED_RESOLUTION
# Apply the new mode inside the full resolution with offsets
xrandr --fb $CROPPED_RESOLUTION --output $OUTPUT_DEVICE --mode $FULL_RESOLUTION --transform 1,0,$OFFSET_X,0,1,$OFFSET_Y,0,0,1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment