2025-10-27 00:06:05 +01:00
|
|
|
#!/bin/bash
|
|
|
|
|
set -euo pipefail
|
2025-10-28 00:04:17 +01:00
|
|
|
LOG_FILE="$HOME/.local/logs/session.log"
|
2025-10-27 00:06:05 +01:00
|
|
|
|
2025-10-28 00:04:17 +01:00
|
|
|
log() { echo "[$(date --iso-8601=seconds)] $*" | tee -a "$LOG_FILE"; }
|
2025-10-27 00:06:05 +01:00
|
|
|
|
|
|
|
|
start_gamescope() {
|
|
|
|
|
log "Starting Gamescope session..."
|
|
|
|
|
|
2025-10-28 00:04:17 +01:00
|
|
|
CONF_FILE="$HOME/.config/gamescope/gamescope.conf"
|
|
|
|
|
[ -f "$CONF_FILE" ] && source "$CONF_FILE"
|
|
|
|
|
|
|
|
|
|
OUTPUT_CONNECTOR=${OUTPUT_CONNECTOR:-HDMI-A-1}
|
|
|
|
|
FRAMERATE=${FRAMERATE:-60}
|
|
|
|
|
RESOLUTION=${RESOLUTION:-1920x1080}
|
|
|
|
|
WIDTH="${RESOLUTION%x*}"
|
|
|
|
|
HEIGHT="${RESOLUTION#*x}"
|
|
|
|
|
|
2025-10-28 19:24:43 +01:00
|
|
|
# export __GL_GSYNC_ALLOWED=1
|
|
|
|
|
# export __GL_VRR_ALLOWED=1
|
|
|
|
|
# # export __GL_THREADED_OPTIMIZATIONS=1
|
|
|
|
|
# export __GL_SHADER_DISK_CACHE=1
|
|
|
|
|
# export __GL_SYNC_TO_VBLANK=0
|
2025-10-27 00:06:05 +01:00
|
|
|
|
|
|
|
|
GAMESCOPE_BIN="$(command -v gamescope || true)"
|
|
|
|
|
if [ -z "$GAMESCOPE_BIN" ]; then
|
|
|
|
|
log "ERROR: gamescope not found in PATH"
|
|
|
|
|
exit 127
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
HDR_FLAG=""
|
|
|
|
|
if [[ "$HDR_ENABLED" == "1" || "$HDR_ENABLED" == "true" || "$HDR_ENABLED" == "yes" ]]; then
|
|
|
|
|
HDR_FLAG="--hdr-enabled"
|
|
|
|
|
log "HDR flag added: --hdr-enabled"
|
|
|
|
|
else
|
|
|
|
|
log "HDR disabled, no HDR flag added"
|
|
|
|
|
fi
|
|
|
|
|
|
2025-10-31 19:57:42 +01:00
|
|
|
env | tee -a "$LOG_FILE"
|
|
|
|
|
|
2025-10-28 19:24:43 +01:00
|
|
|
# Build gamescope argument array for safe quoting and readability
|
|
|
|
|
GAMESCOPE_ARGS=(
|
|
|
|
|
--generate-drm-mode fixed
|
|
|
|
|
--fade-out-duration 200
|
|
|
|
|
--cursor-scale-height 720
|
|
|
|
|
-f
|
|
|
|
|
-W "$WIDTH" -H "$HEIGHT"
|
|
|
|
|
-w "$WIDTH" -h "$HEIGHT"
|
|
|
|
|
--rt --mangoapp -e
|
|
|
|
|
-O "$OUTPUT_CONNECTOR"
|
|
|
|
|
-r "$FRAMERATE"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Append HDR flag if enabled
|
|
|
|
|
if [ -n "${HDR_FLAG:-}" ]; then
|
|
|
|
|
GAMESCOPE_ARGS+=("$HDR_FLAG")
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
log "Launching Gamescope: $GAMESCOPE_BIN ${GAMESCOPE_ARGS[*]} -- $*"
|
|
|
|
|
|
|
|
|
|
# Execute gamescope inside a DBus session, preserving proper argument quoting
|
|
|
|
|
exec dbus-run-session -- "$GAMESCOPE_BIN" "${GAMESCOPE_ARGS[@]}" -- "$@" >>"$LOG_FILE" 2>&1
|
2025-10-27 00:06:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
start_kwin() {
|
|
|
|
|
log "Starting KWin session..."
|
|
|
|
|
KWIN_BIN="$(command -v kwin_wayland || true)"
|
|
|
|
|
if [ -z "$KWIN_BIN" ]; then
|
|
|
|
|
log "ERROR: kwin_wayland not found in PATH"
|
|
|
|
|
exit 127
|
|
|
|
|
fi
|
|
|
|
|
|
2025-10-28 00:04:17 +01:00
|
|
|
export XDG_CURRENT_DESKTOP=plasma
|
|
|
|
|
export XDG_SESSION_TYPE=wayland
|
|
|
|
|
export XDG_DATA_DIRS=/usr/local/share/:/usr/share/
|
|
|
|
|
export XDG_CONFIG_DIRS=/usr/local/etc/xdg:/etc/xdg
|
|
|
|
|
export XDG_CURRENT_DESKTOP=KDE
|
|
|
|
|
export XDG_RUNTIME_DIR=/run/user/$(id -u)
|
|
|
|
|
|
|
|
|
|
# Ensure we don't run nested; width/height/fullscreen are for the windowed backend.
|
|
|
|
|
unset DISPLAY WAYLAND_DISPLAY
|
|
|
|
|
KWIN_ARGS="--drm --exit-with-session"
|
|
|
|
|
log "Launching KWin (DRM): $KWIN_BIN ${KWIN_ARGS} $*"
|
|
|
|
|
exec dbus-run-session -- "$KWIN_BIN" ${KWIN_ARGS} "$@" >>"$LOG_FILE" 2>&1
|
2025-10-27 00:06:05 +01:00
|
|
|
}
|
|
|
|
|
|
2025-10-28 19:24:43 +01:00
|
|
|
export XDG_SEAT=seat0
|
|
|
|
|
|
2025-10-27 00:06:05 +01:00
|
|
|
if [[ -f "$HOME/.desktop-session-plasma" ]]; then
|
|
|
|
|
log "Plasma session selected."
|
|
|
|
|
rm "$HOME/.desktop-session-plasma"
|
|
|
|
|
start_kwin /usr/local/bin/launch_kde.sh
|
|
|
|
|
else
|
|
|
|
|
log "Gamescope session selected."
|
|
|
|
|
start_gamescope /usr/local/bin/launch_steam.sh
|
2025-10-28 00:04:17 +01:00
|
|
|
fi
|
|
|
|
|
|