add gamescope

This commit is contained in:
Ward Nakchbandi 2023-03-03 19:16:13 +03:00
parent ad86e17628
commit a2a6b53407
18 changed files with 540 additions and 2 deletions

40
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,40 @@
name: PikaOS Package Release
on:
workflow_dispatch
jobs:
build:
runs-on: self-hosted
container:
image: ubuntu:22.10
volumes:
- /proc:/proc
options: --privileged -it
steps:
- uses: actions/checkout@v3
- name: Install needed packages
run: apt update && apt install software-properties-common sudo git bc gpg gpg-agent bison build-essential ccache cpio fakeroot flex git kmod libelf-dev libncurses5-dev libssl-dev lz4 qtbase5-dev rsync schedtool wget zstd tar reprepro dpkg-sig devscripts dh-make -y
- name: Import GPG key
id: import_gpg
uses: crazy-max/ghaction-import-gpg@v5
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PASSPHRASE }}
- name: Install SSH key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_KEY }}
name: id_rsa
known_hosts: ${{ secrets.KNOWN_HOSTS }}
if_key_exists: replace
- name: Build Package
run: ./main.sh
- name: Release Package
run: ./release.sh

View File

@ -1,4 +1,4 @@
gamescope-session (0.0.git.92.60c3f5f9-99pika2) kinetic; urgency=low
gamescope-session (0.0.git.92.60c3f5f9-99pika3) kinetic; urgency=low
* Fix return to desktop

View File

@ -0,0 +1,24 @@
#!/bin/sh
# Script to start the session used by Valve with minor tweaks for ChimeraOS.
# Window managers sets this to wayland but apps using Gamescope must use x11
export XDG_SESSION_TYPE=x11
# Update the enviroment with DESKTOP_SESSION and all XDG variables
dbus-update-activation-environment --systemd DESKTOP_SESSION `env | grep ^XDG_ | cut -d = -f 1`
# This makes it so that xdg-desktop-portal doesn't find any portal implementations and doesn't start them and makes
# them crash/exit because the dbus env has no DISPLAY. In turn this causes dbus calls to the portal which don't rely
# on implementations to hang (such as SDL talking to the real time portal)
systemctl --user set-environment XDG_DESKTOP_PORTAL_DIR=""
# Remove these as they prevent gamescope-session from starting correctly
systemctl --user unset-environment DISPLAY XAUTHORITY
# If this shell script is killed then stop gamescope-session
trap 'systemctl --user stop gamescope-session.service' HUP INT TERM
# Start gamescope-session and wait
systemctl --user --wait start gamescope-session.service &
wait

View File

@ -0,0 +1,3 @@
#! /bin/bash
exit 0;

View File

@ -0,0 +1,32 @@
#!/bin/env python
import urllib.parse
import os.path
import argparse
import subprocess
def run(action, arg):
final_url = "steam://{0}/{1}".format(action, arg)
subprocess.run(["steam", final_url])
def main():
parser = argparse.ArgumentParser(description='Launch a link in the steam browser.')
parser.add_argument('uri')
args = parser.parse_args()
uri = args.uri
url = urllib.parse.urlparse(uri, "file")
# convert mailto://A@b.com to steam://mailto/A@b.com
if (url.scheme == 'mailto'):
run('mailto', url.netloc)
return
# open any other URL, converting paths to full file URIs
if (url.scheme == 'file' and not os.path.isabs(url.path)):
absolute_path = os.path.abspath(url.path)
url = url._replace(path=absolute_path)
run('openurl_external', url.geturl())
return
main()

View File

@ -0,0 +1,11 @@
#!/bin/bash
set -eu
if [[ $EUID -ne 0 ]];
then
exec pkexec --disable-internal-agent "$0" "$@"
fi
exec /usr/bin/jupiter-biosupdate "$@"

View File

@ -0,0 +1,11 @@
#!/bin/bash
set -eu
if [[ $EUID -ne 0 ]];
then
exec pkexec --disable-internal-agent "$0" "$@"
fi
exec /usr/bin/steamos-update "$@"

View File

@ -0,0 +1,11 @@
#! /bin/bash
if command -v frzr-deploy > /dev/null; then
if [ "$1" == "check" ]; then
frzr-deploy --check
else
frzr-deploy --steam-progress
fi
else
exit 7
fi

View File

@ -0,0 +1,17 @@
# Startup systemd unit for Gamescope session meant to be started by a script.
# Logs will go to journal and logged into /run/user/$USER
# This is the way Valve does it, we add our own file structure and scripts
[Unit]
Description=Gamescope Session
BindsTo=graphical-session.target
Before=graphical-session.target
Wants=graphical-session-pre.target
After=graphical-session-pre.target
[Service]
ExecStart=/usr/share/gamescope-session/gamescope-session-script
# This is a temporary workaround for the some proton apps becoming
# confused by the AF_UNIX socket they get for the stdout when the
# service outputs to the journal. (e.g. Vampire Survivors).
StandardOutput=append:%t/gamescope-session.log
StandardError=append:%t/gamescope-session.log

View File

@ -0,0 +1,7 @@
[Default Applications]
x-scheme-handler/http=steam_http_loader.desktop
x-scheme-handler/https=steam_http_loader.desktop
x-scheme-handler/mailto=steam_http_loader.desktop
application/pdf=steam_http_loader.desktop
application/x-extension-html=steam_http_loader.desktop
text/html=steam_http_loader.desktop

View File

@ -0,0 +1,5 @@
[Desktop Entry]
Type=Application
Name=Steam HTTP Handler
NoDisplay=true
Exec=steam-http-loader %u

View File

@ -0,0 +1,40 @@
# This file would be sourced by gamescope-session script (meant for
# ChimeraOS devices).
SYS_ID="$(cat /sys/devices/virtual/dmi/id/product_name)"
# OXP Devices
OXP_LIST="ONE XPLAYER:ONEXPLAYER 1 T08:ONEXPLAYER 1S A08:ONEXPLAYER 1S T08:ONEXPLAYER mini A07:ONEXPLAYER mini GA72:ONEXPLAYER mini GT72:ONEXPLAYER Mini Pro:ONEXPLAYER GUNDAM GA72:ONEXPLAYER 2 ARP23"
AOK_LIST="AOKZOE A1 AR07"
if [[ ":$OXP_LIST:" =~ ":$SYS_ID:" ]] || [[ ":$AOK_LIST:" =~ ":$SYS_ID:" ]]; then
# Dependent on a special --force-orientation option in gamescope
if ( gamescope --help 2>&1 | grep -e "--force-orientation" > /dev/null ) ; then
export GAMESCOPECMD="/usr/bin/gamescope \
-e \
--generate-drm-mode fixed \
--xwayland-count 2 \
-O *,eDP-1 \
--default-touch-mode 4 \
--hide-cursor-delay 3000 \
--fade-out-duration 200 \
--force-orientation left "
fi
# Set refresh rate range and enable refresh rate switching
export STEAM_DISPLAY_REFRESH_LIMITS=40,60
fi
# AYANEO AIR Devices
AIR_LIST="AIR:AIR Pro"
if [[ ":$AIR_LIST:" =~ ":$SYS_ID:" ]]; then
# Dependent on a special --force-orientation option in gamescope
if ( gamescope --help 2>&1 | grep -e "--force-orientation" > /dev/null ) ; then
export GAMESCOPECMD="/usr/bin/gamescope \
-e \
--xwayland-count 2 \
-O *,eDP-1 \
--default-touch-mode 4 \
--hide-cursor-delay 3000 \
--fade-out-duration 200 \
--force-orientation left "
fi
fi

View File

@ -0,0 +1,266 @@
#!/bin/bash
# Some environment variables by default (taken from Deck session)
export SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0
# Enable Mangoapp
export STEAM_USE_MANGOAPP=1
export MANGOHUD_CONFIGFILE=$(mktemp /tmp/mangohud.XXXXXXXX)
export STEAM_USE_DYNAMIC_VRS=1
export RADV_FORCE_VRS_CONFIG_FILE=$(mktemp /tmp/radv_vrs.XXXXXXXX)
# Plop GAMESCOPE_MODE_SAVE_FILE into $XDG_CONFIG_HOME (defaults to ~/.config).
export GAMESCOPE_MODE_SAVE_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/gamescope/modes.cfg"
# Make path to gamescope mode save file.
mkdir -p "$(dirname "$GAMESCOPE_MODE_SAVE_FILE")"
touch "$GAMESCOPE_MODE_SAVE_FILE"
#echo "Making Gamescope Mode Save file at \"$GAMESCOPE_MODE_SAVE_FILE\""
# Support for gamescope tearing with GAMESCOPE_ALLOW_TEARING atom
export STEAM_GAMESCOPE_HAS_TEARING_SUPPORT=1
# Enable tearing controls in steam
export STEAM_GAMESCOPE_TEARING_SUPPORTED=1
# There is no way to set a color space for an NV12
# buffer in Wayland. And the color management protocol that is
# meant to let this happen is missing the color range...
# So just workaround this with an ENV var that Remote Play Together
# and Gamescope will use for now.
export GAMESCOPE_NV12_COLORSPACE=k_EStreamColorspace_BT601
# Initially write no_display to our config file
# so we don't get mangoapp showing up before Steam initializes
# on OOBE and stuff.
mkdir -p "$(dirname "$MANGOHUD_CONFIGFILE")"
echo "no_display" > "$MANGOHUD_CONFIGFILE"
# Prepare our initial VRS config file
# for dynamic VRS in Mesa.
mkdir -p "$(dirname "$RADV_FORCE_VRS_CONFIG_FILE")"
echo "1x1" > "$RADV_FORCE_VRS_CONFIG_FILE"
# To expose vram info from radv
export WINEDLLOVERRIDES=dxgi=n
# Workaround for steam getting killed immediatly during reboot
export STEAMOS_STEAM_REBOOT_SENTINEL="/tmp/steamos-reboot-sentinel"
# Workaround for steam getting killed immediatly during shutdown
# Same idea as reboot sentinel above
export STEAMOS_STEAM_SHUTDOWN_SENTINEL="/tmp/steamos-shutdown-sentinel"
# Enable volume key management via steam for this session
export STEAM_ENABLE_VOLUME_HANDLER=1
# Have SteamRT's xdg-open send http:// and https:// URLs to Steam
export SRT_URLOPEN_PREFER_STEAM=1
# Disable automatic audio device switching in steam, now handled by wireplumber
export STEAM_DISABLE_AUDIO_DEVICE_SWITCHING=1
# Enable support for xwayland isolation per-game in Steam
export STEAM_MULTIPLE_XWAYLANDS=1
# We have the Mesa integration for the fifo-based dynamic fps-limiter
export STEAM_GAMESCOPE_DYNAMIC_FPSLIMITER=1
# We have gamma/degamma exponent support
export STEAM_GAMESCOPE_COLOR_TOYS=1
# We have NIS support
export STEAM_GAMESCOPE_NIS_SUPPORTED=1
# Don't wait for buffers to idle on the client side before sending them to gamescope
export vk_xwayland_wait_ready=false
# Let steam know it can unmount drives without superuser privileges
export STEAM_ALLOW_DRIVE_UNMOUNT=1
# We no longer need to set GAMESCOPE_EXTERNAL_OVERLAY from steam, mangoapp now does it itself
export STEAM_DISABLE_MANGOAPP_ATOM_WORKAROUND=1
# Enable horizontal mangoapp bar
export STEAM_MANGOAPP_HORIZONTAL_SUPPORTED=1
# Scaling support
export STEAM_GAMESCOPE_FANCY_SCALING_SUPPORT=1
# Set input method modules for Qt/GTK that will show the Steam keyboard
export QT_IM_MODULE=steam
export GTK_IM_MODULE=Steam
# To play nice with the short term callback-based limiter for now
export GAMESCOPE_LIMITER_FILE=$(mktemp /tmp/gamescope-limiter.XXXXXXXX)
# Use SteamOS background if exists
if [ -f "/usr/share/steamos/steamos.png" ] ; then
export STEAM_UPDATEUI_PNG_BACKGROUND=/usr/share/steamos/steamos.png
fi
ulimit -n 524288
# Source device quirks if exists
if [ -f /usr/share/gamescope-session/device-quirks ]; then
. /usr/share/gamescope-session/device-quirks
fi
# Source environment from ~/.config/environment.d with user overrides
set -a
for i in "${HOME}"/.config/environment.d/*.conf ;
do
[[ -f "${i}" ]] && . "${i}"
done
set +a
# Setup socket for gamescope
# Create run directory file for startup and stats sockets
tmpdir="$([[ -n ${XDG_RUNTIME_DIR+x} ]] && mktemp -p "$XDG_RUNTIME_DIR" -d -t gamescope.XXXXXXX)"
socket="${tmpdir:+$tmpdir/startup.socket}"
stats="${tmpdir:+$tmpdir/stats.pipe}"
# Fail early if we don't have a proper runtime directory setup
if [[ -z $tmpdir || -z ${XDG_RUNTIME_DIR+x} ]]; then
echo >&2 "!! Failed to find run directory in which to create stats session sockets (is \$XDG_RUNTIME_DIR set?)"
exit 0
fi
export GAMESCOPE_STATS="$stats"
mkfifo -- "$stats"
mkfifo -- "$socket"
# Attempt to claim global session if we're the first one running (e.g. /run/1000/gamescope)
linkname="gamescope-stats"
# shellcheck disable=SC2031 # (broken warning)
sessionlink="${XDG_RUNTIME_DIR:+$XDG_RUNTIME_DIR/}${linkname}" # Account for XDG_RUNTIME_DIR="" (notfragileatall)
lockfile="$sessionlink".lck
exec 9>"$lockfile" # Keep as an fd such that the lock lasts as long as the session if it is taken
if flock -n 9 && rm -f "$sessionlink" && ln -sf "$tmpdir" "$sessionlink"; then
# Took the lock. Don't blow up if those commands fail, though.
echo >&2 "Claimed global gamescope stats session at \"$sessionlink\""
else
echo >&2 "!! Failed to claim global gamescope stats session"
fi
# Use cursor if file exist
if [ -z "$CURSOR_FILE" ] ; then
CURSOR_FILE="${HOME}/.local/share/Steam/tenfoot/resource/images/cursors/arrow_right.png"
fi
CURSOR=""
if [ -f "$CURSOR_FILE" ] ; then
CURSOR="--cursor ${CURSOR_FILE}"
fi
# Define session if not overriden
if [ -z "$STEAMCMD" ] ; then
STEAMCMD="steam -gamepadui -steamos3 -steampal -steamdeck"
fi
if [ -z "$GAMESCOPECMD" ] ; then
RESOLUTION=""
if [ -n "$SCREEN_WIDTH" ] && [ -n "$SCREEN_HEIGHT" ] ; then
RESOLUTION="-W $SCREEN_WIDTH -H $SCREEN_HEIGHT"
fi
GAMESCOPECMD="/usr/bin/gamescope \
$CURSOR \
-e \
$RESOLUTION \
--xwayland-count 2 \
-O *,eDP-1 \
--default-touch-mode 4 \
--hide-cursor-delay 3000 \
--fade-out-duration 200 \
-R $socket -T $stats"
else
# Add socket and stats read
GAMESCOPECMD+=" -R $socket -T $stats"
fi
# Workaround for Steam login issue while Steam client change propagates out of Beta
touch "${HOME}"/.steam/root/config/SteamAppData.vdf || true
# Log rotate the last session
if [ -f "${HOME}"/.steam-tweaks.log ]; then
cp "${HOME}"/.steam-tweaks.log "${HOME}"/.steam-tweaks.log.old
fi
if [ -f "${HOME}"/.steam-stdout.log ]; then
cp "${HOME}"/.steam-stdout.log "${HOME}"/.steam-stdout.log.old
fi
if [ -f "${HOME}"/.gamescope-stdout.log ]; then
cp "${HOME}"/.gamescope-stdout.log "${HOME}"/.gamescope-stdout.log.old
fi
# Start gamescope compositor, log it's output and background it
$GAMESCOPECMD > "${HOME}"/.gamescope-stdout.log 2>&1 &
gamescope_pid="$!"
if read -r -t 3 response_x_display response_wl_display <> "$socket"; then
export DISPLAY="$response_x_display"
export GAMESCOPE_WAYLAND_DISPLAY="$response_wl_display"
# We're done!
else
kill -9 "$gamescope_pid"
wait
exit 0
# Systemd or Session manager will have to restart session
fi
# Run steam-tweaks if exists
if command -v steam-tweaks > /dev/null; then
steam-tweaks > "${HOME}"/.steam-tweaks.log
fi
# Input method support if present
if command -v /usr/bin/ibus-daemon > /dev/null; then
/usr/bin/ibus-daemon -d -r --panel=disable --emoji-extension=disable
fi
# If we have mangoapp binary start it
if command -v mangoapp > /dev/null; then
mangoapp > "${HOME}"/.mangoapp-stdout.log 2>&1 &
fi
# Start Steam client
$STEAMCMD > "${HOME}"/.steam-stdout.log 2>&1
# When the client exits, kill gamescope nicely
kill $gamescope_pid
# Start a background sleep for five seconds because we don't trust it
sleep 5 &
sleep_pid="$!"
# Catch reboot and poweroof sentinels here
if [[ -e "$STEAMOS_STEAM_REBOOT_SENTINEL" ]]; then
rm -f "$STEAMOS_STEAM_REBOOT_SENTINEL"
reboot
fi
if [[ -e "$STEAMOS_STEAM_SHUTDOWN_SENTINEL" ]]; then
rm -f "$STEAMOS_STEAM_SHUTDOWN_SENTINEL"
poweroff
fi
# Wait for gamescope or the sleep to finish for timeout purposes
ret=0
wait -n $gamescope_pid $sleep_pid || ret=$?
# If we get a SIGTERM/etc while waiting this happens. Proceed to kill -9 everything but complain
if [[ $ret = 127 ]]; then
echo >&2 "gamescope-session: Interrupted while waiting on teardown, force-killing remaining tasks"
fi
# Kill all remaining jobs and warn if unexpected things are in there (should be just sleep_pid, unless gamescope failed
# to exit in time or we hit the interrupt case above)
for job in $(jobs -p); do
# Warn about unexpected things
if [[ $ret != 127 && $job = "$gamescope_pid" ]]; then
echo >&2 "gamescope-session: gamescope timed out while exiting, killing"
elif [[ $ret != 127 && $job != "$sleep_pid" ]]; then
echo >&2 "gamescope-session: unexpected background pid $job at teardown: "
# spew some debug about it
ps -p "$job" >&2
fi
kill -9 "$job"
done

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>ChimeraOS Chimera</vendor>
<vendor_url>http://chimeraos.org</vendor_url>
<action id="org.chimeraos.policykit.steamos.pkexec.run-steamos-update">
<description>Main update script from Steam client</description>
<icon_name>package-x-generic</icon_name>
<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/steamos-polkit-helpers/steamos-update</annotate>
</action>
<action id="org.chimeraos.policykit.steamos.pkexec.run-jupiter-biosupdate">
<description>Dummy script for jupiter-biosupdate on Steam client</description>
<icon_name>package-x-generic</icon_name>
<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/steamos-polkit-helpers/jupiter-biosupdate</annotate>
</action>
</policyconfig>

View File

@ -0,0 +1,7 @@
[Desktop Entry]
Encoding=UTF-8
Name=ChimeraOS (gamescope)
Comment=Steam Big Picture session
Exec=gamescope-session
Type=Application
DesktopNames=gamescope

22
main.sh Executable file
View File

@ -0,0 +1,22 @@
DEBIAN_FRONTEND=noninteractive
# Add dependent repositories
wget -q -O - https://ppa.pika-os.com/key.gpg | sudo apt-key add -
add-apt-repository https://ppa.pika-os.com
add-apt-repository ppa:pikaos/pika
add-apt-repository ppa:kubuntu-ppa/backports
# Clone Upstream
cd ./gamescope-session
# Get build deps
ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
apt-get build-dep ./ -y
# Build package
dpkg-buildpackage
# Move the debs to output
cd ../
mkdir -p ./output
mv ./*.deb ./output/

View File

@ -1 +0,0 @@
#https://github.com/KyleGospo/gamescope-session

11
release.sh Executable file
View File

@ -0,0 +1,11 @@
# Sign the packages
dpkg-sig --sign builder ./output/*.deb
# Pull down existing ppa repo db files etc
rsync -azP --exclude '*.deb' ferreo@direct.pika-os.com:/srv/www/pikappa/ ./output/repo
# Add the new package to the repo
reprepro -V --basedir ./output/repo/ includedeb kinetic ./output/*.deb
# Push the updated ppa repo to the server
rsync -azP ./output/repo/ ferreo@direct.pika-os.com:/srv/www/pikappa/