diff --git a/distribution/linux/Ryujinx.sh b/distribution/linux/Ryujinx.sh index daeea9bfd..b697aa2b1 100755 --- a/distribution/linux/Ryujinx.sh +++ b/distribution/linux/Ryujinx.sh @@ -20,4 +20,40 @@ if command -v gamemoderun > /dev/null 2>&1; then COMMAND="$COMMAND gamemoderun" fi -exec $COMMAND "$SCRIPT_DIR/$RYUJINX_BIN" "$@" +# Check if user already has a manual Avalonia scaling override or session type is x11. +if [ -n "${AVALONIA_GLOBAL_SCALE_FACTOR-}" ] || [ "$XDG_SESSION_TYPE" = "x11" ]; then + echo "Scaling: Performed by environment, skipping." >&2 +else + # Query monitor config directly (GNOME), default display only. + if [[ "$(echo "$XDG_CURRENT_DESKTOP")" == "GNOME" && -f ~/.config/monitors.xml ]] then + echo -n 'Scaling: Monitor config located, querying scale...' >&2 + SCALING="$(grep '"|cut -f1 -d"<")" + SCALING="${SCALING##* }" + echo "found! Factor: ${SCALING}" >&2 + + # Fallback to X DPI query for others. + # Plasma handles this fine, GNOME will always round up e.g. 1.25 -> 2.00. + elif command -v xrdb >/dev/null; then + echo -n 'Scaling: Attempting to get scaling from X DPI value...' >&2 + dpi="$(xrdb -get Xft.dpi)" + if [[ -n "${dpi}" ]]; then + SCALING=$(awk -vdpi="$dpi" 'BEGIN{print dpi/96}') + fi + echo "found! Factor: ${SCALING}" + + # Query kscreen-doctor for Plasma as a fallback. + elif [[ "$(echo "$XDG_CURRENT_DESKTOP")" == "KDE" ]] && command -v kscreen-doctor >/dev/null; then + # gsub strips ANSI color codes from ksd output + SCALING=$(kscreen-doctor --outputs | awk '/Scale:/{gsub(/\x1b\[[0-9;]*m/,""); print $2; exit}') + echo "found! Factor: ${SCALING}" + fi + + if [[ -z "${SCALING-}" || "${SCALING-}" == "0" ]]; then + echo 'Unset invalid scaling value' >&2 + SCALING="1" + fi + + COMMAND="$COMMAND AVALONIA_GLOBAL_SCALE_FACTOR=$SCALING" +fi + +exec $COMMAND "$SCRIPT_DIR/$RYUJINX_BIN" "$@" \ No newline at end of file