Chromium/Firefox "Share desktop" / "Share window" silently broke after the SDDM-restart cycle: xdg-desktop-portal-hyprland stays bound to the killed Hyprland instance, so the new compositor's screencasts get no frames. Tab sharing kept working because Chromium captures tabs internally, bypassing the portal. switch-to-desktop now drops /tmp/.deckshift-just-returned before the SDDM restart. A new helper (/usr/local/bin/deckshift-portal-recovery), exec-once'd from ~/.config/hypr/autostart.conf, checks for that marker on every Hyprland start and bounces the portal + pipewire user services when present. No marker = no-op. README troubleshooting updated with both this and the suspend-access fix from the previous commit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
26 KiB
DeckShift
Version 0.1.3 — Steam Deck-style gaming mode for Linux + Hyprland. Press Super+Shift+S to enter Gaming Mode (Steam Big Picture in Gamescope), Super+Shift+R to return to your desktop.
Lineage: forked from Super-Shift-S-Omarchy-Deck-Mode, briefly renamed Omarchy Deck, then renamed DeckShift as the project moves toward distro-portability.
Current status: targets Omarchy (Arch + Hyprland + SDDM + iwd). Works on other Arch + Hyprland setups with minor manual tweaks. Cross-distro support (Fedora / openSUSE / Cachy) is the next direction.
What's New
v0.1.3 — power-state save/restore + reliable exit
- Saves your real pre-Gaming-Mode state (CPU governor + power profile) on entry to
~/.cache/deckshift/saved-stateand restores those exact values on exit. No more guessingpowersave/balanced. - Synchronous restore in
switch-to-desktop— runs before SDDM is restarted, so the restore can't be SIGKILL'd mid-write by session teardown. switch-to-desktopnow uses an atomicsystemctl restart sddminstead of a racy stop+disowned-start that could leave the display manager stopped (= black screen).powerprofilesctlis now in the NOPASSWD allowlist so the restore call can succeed without a polkit auth agent.
v0.1.2 — TUI hardening + hybrid PRIME offload
- Hybrid GPU support in the Settings TUI. Two new GPU modes:
[hybrid-nvidia]— for laptops with NVIDIA dGPU + AMD/Intel iGPU where the laptop screen (eDP-1) is wired to the iGPU. Sets__NV_PRIME_RENDER_OFFLOAD=1+ friends so Gamescope runs on the iGPU but games inside still render on the NVIDIA dGPU via PRIME render offload. Tested working on Acer Nitro (AMD APU + RTX 3050) playing Homeworld 3 with NVIDIA acceleration on the laptop screen.[hybrid-amd]— for AMD dGPU + AMD/Intel iGPU laptops. Asks which GPU is the dGPU, then setsDRI_PRIME+MESA_VK_DEVICE_SELECTso games offload to the AMD dGPU.
- Settings TUI no longer crashes on stale
OUTPUT_CONNECTOR. When the saved monitor is currently unplugged the TUI falls back gracefully instead of trippingpipefail. - Installer no longer preselects monitor / resolution / refresh rate. Display selection is now exclusively the TUI's job; the installer writes only GPU and static keys to
gamescope-session-plus.conf. - Conf writer is now per-key set/unset (sed-based), idempotent — re-running the installer preserves user-set display values from the TUI instead of clobbering them.
v0.1.1 / v0.1.0 — original deckshift fork
- Settings TUI launched from Walker (
Super+Space → "DeckShift Settings"). - NVIDIA driver branch auto-pick (Pascal/Maxwell/Volta →
nvidia-580xx-utils, Turing+ →nvidia-utils) via Omarchy'somarchy-hw-nvidia-gsp. - Idempotent package installs via
omarchy-pkg-add. - Optional Xbox Bluetooth controller support (
xpadneo-dkms, opt-in). - Intel GPU support (Iris Xe, Arc) with a generation warning for older Gen8/9.
- Multilib check removed (Omarchy ships with multilib enabled).
Settings TUI
After install, launch DeckShift Settings from Walker (or run deckshift-settings directly) to change Gaming Mode display settings without editing config files:
| Option | What it sets in gamescope-session-plus.conf |
|---|---|
| Monitor | OUTPUT_CONNECTOR (auto-detected from connected DRM outputs; pick or clear) |
| Resolution | SCREEN_WIDTH / SCREEN_HEIGHT (offers monitor's native modes + common presets) |
| Refresh rate | CUSTOM_REFRESH_RATES (parsed from EDID, plus common rates as fallback) |
| GPU — direct | VULKAN_ADAPTER + GBM_BACKEND (NVIDIA) or DRI_PRIME (AMD/Intel) — single-GPU desktops |
GPU — [hybrid-nvidia] |
__NV_PRIME_RENDER_OFFLOAD=1, __VK_LAYER_NV_optimus=NVIDIA_only, __GLX_VENDOR_LIBRARY_NAME=nvidia — hybrid laptops with NVIDIA dGPU + iGPU-attached eDP |
GPU — [hybrid-amd] |
DRI_PRIME=pci-… + MESA_VK_DEVICE_SELECT=<vendor:device> + MESA_VK_DEVICE_SELECT_FORCE_DEFAULT_DEVICE=1 — hybrid laptops with AMD dGPU + iGPU |
| (clear) | Removes all GPU keys; gamescope auto-picks at runtime |
The [hybrid-*] options only appear when the relevant GPU pair is detected.
The TUI launches as a floating window via Omarchy's TUI.float pattern. Selections are buffered — nothing is written to disk until you pick Save and exit. Cancel discards unsaved changes. Saved changes apply next time you enter Gaming Mode (Super+Shift+S).
What It Does
This installer transforms your desktop into a dual-mode system:
- Desktop Mode — your normal Hyprland session.
- Gaming Mode — full-screen Steam Big Picture running inside Gamescope (the same compositor used by the Steam Deck), with automatic performance tuning, controller support, and external drive mounting.
Switching between modes is seamless — SDDM handles session transitions, and your network, audio, and peripherals carry over automatically.
Requirements
- OS: Omarchy (Arch Linux + Hyprland + SDDM)
- GPU: AMD (discrete or APU), NVIDIA (discrete), or Intel (Arc / Iris Xe), or any hybrid combo of the above
- Intel Arc (Alchemist, Battlemage): well-supported
- Tiger Lake / Alder Lake Iris Xe: playable for indies / older AAA
- Older Gen8/9 Intel (Skylake, Kaby Lake): expect slow/glitchy — installer warns and asks before continuing
- Hybrid laptops (NVIDIA + iGPU, AMD dGPU + iGPU): use the corresponding
[hybrid-*]GPU mode in the Settings TUI
- AUR Helper: yay or paru (for ChimeraOS session packages)
Note
: This script targets Omarchy and its stack (Hyprland, SDDM, iwd, UWSM, PipeWire). It works on other Arch + Hyprland setups with light tweaks, but isn't tested there.
Quick Start
git clone https://git.no-signal.uk/nosignal/deckshift.git
cd deckshift
chmod +x deckshift.sh
./deckshift.sh
The installer is fully interactive and walks you through each step.
After install, open DeckShift Settings from Walker and pick:
- A monitor
- A resolution / refresh rate
- A GPU mode — for hybrid laptops, prefer
[hybrid-nvidia]or[hybrid-amd]over the direct options
Save, then Super+Shift+S to launch Gaming Mode.
Usage
| Action | How |
|---|---|
| Enter Gaming Mode | Super + Shift + S |
| Return to Desktop | Super + Shift + R (global keybind monitor catches it inside Gamescope) |
| Return to Desktop (alternative) | Steam → Power → Switch to Desktop |
| Open settings | Walker → DeckShift Settings, or run deckshift-settings |
Command-Line Options
./deckshift.sh # Full installation
./deckshift.sh --verify # Verify installation only
./deckshift.sh --version # Show version
./deckshift.sh --help # Show help
Recovery from a Black Screen
If Gaming Mode (or anything else) leaves you on a black screen, here's the order of escalation:
Super + Shift + R— the keybind monitor inside Gamescope still works on a black screen as long as the kernel is processing input.- Wait 10 seconds. Sometimes the display is just renegotiating EDID after a session swap; give it a beat.
- Switch to a TTY: press
Ctrl + Alt + F2(tryF3/F4if F2 is blank). You'll get a text login prompt. - Log in as your user, then run one of:
- Cleanest — log the graphical session out cleanly and bounce back to SDDM:
loginctl terminate-user $USER - Heavier — restart the whole display manager:
sudo systemctl restart sddm
- Cleanest — log the graphical session out cleanly and bounce back to SDDM:
- From SSH (from another machine on the network) the same commands work — handy if the box is wedged but its network is alive.
- Last resort: hold the power button. Safe in this situation; you didn't cause the freeze, gamescope did.
If you keep ending up on a black screen, see Troubleshooting — most often it's a GPU↔connector mismatch on hybrid laptops (e.g. NVIDIA mode targeting eDP-1, which on a hybrid is wired to the iGPU). Switch the GPU mode in DeckShift Settings to [hybrid-nvidia] and pick eDP-1 for the monitor.
What Gets Installed
Packages
The installer checks for and offers to install:
Core Steam Dependencies
steam,gamescope,mangohud,gamemode- Vulkan loaders and Mesa libraries (32-bit and 64-bit)
- Audio libraries (
lib32-alsa-plugins,lib32-libpulse,lib32-openal) - Networking (
networkmanager,lib32-libnm) - Fonts (
ttf-liberation)
GPU-Specific Drivers
- NVIDIA (Turing+ / GSP firmware — GTX 16xx, RTX 20–50xx, etc.):
nvidia-utils,lib32-nvidia-utils,nvidia-settings,libva-nvidia-driver - NVIDIA (legacy Maxwell/Pascal/Volta — GTX 9xx/10xx, Quadro P/M):
nvidia-580xx-utils,lib32-nvidia-580xx-utils,nvidia-settings,libva-nvidia-driver - AMD:
vulkan-radeon,lib32-vulkan-radeon,libvdpau,lib32-libvdpau - Intel:
vulkan-intel,lib32-vulkan-intel,intel-media-driver
The correct NVIDIA driver branch is auto-selected via Omarchy's omarchy-hw-nvidia-gsp / omarchy-hw-nvidia-without-gsp helpers — no manual override needed. Intel-only systems get a generation warning + Y/N prompt before continuing (Skylake/Kaby Lake era is slow; Tiger Lake / Arc is fine).
AUR Packages (via yay/paru)
gamescope-session-git— ChimeraOS base session frameworkgamescope-session-steam-git— ChimeraOS Steam session with compatibility scriptsproton-ge-custom-bin(optional)
Other Requirements
python-evdev— for the keyboard shortcut monitorgum,jq— for the Settings TUIntfs-3g— for mounting NTFS game drivesudisks2— for external drive auto-mountingxcb-util-cursor,libcap,curl,pciutils
Optional: Xbox Bluetooth Controllers
xpadneo-dkms,linux-headers— wireless Xbox pad button mapping & rumble for Big Picture / RetroArch (wired pads work without this)- Prompted opt-in during install; pair with
Super+Ctrl+B
Package installs use Omarchy's omarchy-pkg-add (idempotent, double-checks pacman actually installed each package).
Files Created
Session Scripts
| Path | Purpose |
|---|---|
/usr/local/bin/switch-to-gaming |
Hyprland → Gaming Mode |
/usr/local/bin/switch-to-desktop |
Gaming Mode → Hyprland (synchronous power-state restore + atomic SDDM restart) |
/usr/local/bin/gamescope-session-nm-wrapper |
Main session wrapper (performance mode, NM, drive mounting, saves pre-Gaming-Mode state) |
/usr/local/bin/gaming-session-switch |
Helper that toggles SDDM autologin between Hyprland and Gamescope |
/usr/local/bin/gaming-keybind-monitor |
Python evdev daemon catching Super+Shift+R inside Gamescope |
/usr/lib/os-session-select |
Handler for Steam's "Exit to Desktop" button |
/usr/local/lib/gamescope-nvidia/gamescope |
NVIDIA wrapper that adds --force-composition |
NetworkManager Integration
| Path | Purpose |
|---|---|
/usr/local/bin/gamescope-nm-start |
Starts NetworkManager on gaming session entry |
/usr/local/bin/gamescope-nm-stop |
Stops NetworkManager and restores iwd on session exit |
/etc/NetworkManager/conf.d/10-iwd-backend.conf |
Configures NM to use iwd backend (if iwd is detected) |
/etc/NetworkManager/conf.d/20-unmanaged-systemd.conf |
Prevents NM/systemd-networkd conflicts (if networkd is detected) |
External Drive Support
| Path | Purpose |
|---|---|
/usr/local/bin/steam-library-mount |
Auto-detects and mounts drives with Steam libraries |
Session & Display Manager
| Path | Purpose |
|---|---|
/usr/share/wayland-sessions/gamescope-session-steam-nm.desktop |
SDDM session entry for Gaming Mode |
/etc/sddm.conf.d/zz-gaming-session.conf |
SDDM autologin session switching config |
Permissions & Security
| Path | Purpose |
|---|---|
/etc/sudoers.d/gaming-session-switch |
NOPASSWD: session switching, NM, bluetooth, powerprofilesctl set * |
/etc/sudoers.d/gaming-mode-sysctl |
NOPASSWD: performance sysctl tuning |
/etc/polkit-1/rules.d/50-gamescope-networkmanager.rules |
Polkit rules for NM D-Bus access |
/etc/polkit-1/rules.d/50-udisks-gaming.rules |
Polkit rules for external drive mounting |
/etc/udev/rules.d/99-gaming-performance.rules |
Udev rules for CPU/GPU performance control |
/etc/security/limits.d/99-gaming-memlock.conf |
Memory lock limits (2 GB) for gaming |
Performance & Environment
| Path | Purpose |
|---|---|
/etc/environment.d/99-shader-cache.conf |
Shader cache optimisation (12 GB Mesa/DXVK cache) |
/etc/environment.d/90-nvidia-gamescope.conf |
NVIDIA Gamescope environment variables |
/etc/pipewire/pipewire.conf.d/10-gaming-latency.conf |
PipeWire low-latency audio config |
User Config
| Path | Purpose |
|---|---|
~/.config/environment.d/gamescope-session-plus.conf |
Gamescope session config (display + GPU keys) — managed via the Settings TUI |
~/.config/hypr/bindings.conf |
Hyprland keybind for Super+Shift+S (appended) |
~/.cache/deckshift/saved-state |
Pre-Gaming-Mode CPU governor + power profile (created on entry, cleaned up on exit) |
Settings TUI
| Path | Purpose |
|---|---|
/usr/local/bin/deckshift-settings |
Gum-based TUI for Gaming Mode display + GPU settings |
/usr/share/applications/deckshift-settings.desktop |
Walker launcher (floats via Omarchy's TUI.float windowrule) |
How It Works
Session Switching Flow
Desktop Mode (Hyprland)
│
├─ Super+Shift+S pressed
│ └─ switch-to-gaming runs:
│ ├─ Masks suspend targets (prevents sleep during switch)
│ ├─ Updates SDDM config to gaming session
│ └─ Restarts SDDM → boots into Gaming Mode
│
Gaming Mode (Gamescope + Steam Big Picture)
│
├─ On session start (gamescope-session-nm-wrapper):
│ ├─ Saves current CPU governor + power profile to ~/.cache/deckshift/saved-state
│ ├─ Enables performance mode (CPU governor → performance, GPU max power, PPD → performance)
│ ├─ Starts NetworkManager (for Steam network access)
│ ├─ Launches steam-library-mount (external drive detection)
│ ├─ Starts gaming-keybind-monitor (Super+Shift+R listener)
│ └─ Launches gamescope-session-plus with Steam
│
├─ Super+Shift+R pressed (or Steam → Power → Switch to Desktop)
│ └─ switch-to-desktop runs:
│ ├─ Reads ~/.cache/deckshift/saved-state and restores CPU governor + PPD synchronously
│ ├─ Unmasks suspend targets
│ ├─ Restores Bluetooth
│ ├─ Shuts down Steam gracefully
│ ├─ Kills gamescope
│ ├─ Updates SDDM config to Hyprland session
│ └─ Atomic systemctl restart sddm → boots into Desktop Mode
│
└─ On session cleanup (trap handler — backup path):
├─ Kills steam-library-mount and keybind-monitor
├─ Stops NetworkManager, restores iwd WiFi
└─ Re-applies saved CPU governor + power profile (idempotent if switch-to-desktop already ran)
Performance Mode
When Gaming Mode starts, the session wrapper saves your current CPU governor and power-profiles-daemon profile to ~/.cache/deckshift/saved-state, then:
- Sets CPU governor to
performanceon all cores - NVIDIA: enables persistence mode, sets power limit to maximum, disables runtime suspend
- AMD: sets GPU to high performance via
power_dpm_force_performance_level - Sets the power profile to
performance(whenpower-profiles-daemonis available)
On exit, both switch-to-desktop (synchronous, runs first) and the wrapper's trap (backup) read the saved file and restore the exact values that were set before Gaming Mode.
Caveat — Omarchy + AC: Omarchy's
omarchy-powerprofiles-initautostarts on every Hyprland session and sets the power profile toperformancewhenever the laptop is on AC. So even after a perfect deckshift restore, the next Hyprland session will reset toperformanceif you're plugged in. This is Omarchy's intended behaviour, not a deckshift bug — it'd happen to any program that tries to setbalancedand then a Hyprland session restarts. To opt out, commentexec-once = omarchy-powerprofiles-initin~/.config/hypr/autostart.conf. On battery the deckshift restore lands at the saved value and stays there.
GPU Detection
The installer detects:
- AMD dGPU: PCI device names (Navi, RDNA, Vega discrete cards)
- AMD APU: integrated GPU codenames (Phoenix, Rembrandt, Van Gogh, etc.)
- NVIDIA: lspci, configures
nvidia-drm.modeset=1if missing, picksnvidia-utilsvsnvidia-580xx-utilsvia Omarchy's GSP-firmware detection - Intel (Arc / Iris Xe / iGPU):
i915/xekernel drivers - Hybrid combinations: detected by the Settings TUI, which surfaces the appropriate
[hybrid-*]GPU mode
The installer itself no longer picks a monitor / resolution / refresh / GPU — those are user choices, made via the Settings TUI after install.
NetworkManager Integration
Many systems running Hyprland use iwd or systemd-networkd instead of NetworkManager. Since Steam requires NetworkManager for its network settings UI, the installer creates a managed handoff:
- On Gaming Mode entry: NetworkManager starts, takes over networking.
- On Gaming Mode exit: NetworkManager stops, iwd/networkd resumes.
This avoids conflicts and ensures both desktop and gaming sessions have network access.
External Drive Auto-Mount
The steam-library-mount daemon runs during Gaming Mode and:
- Scans all connected drives for Steam library folders.
- Mounts drives containing
steamapps/directories via udisks2. - Monitors udev for hot-plugged drives.
- Unmounts non-Steam drives to avoid clutter.
Supports ext4, NTFS, btrfs, xfs, exfat, f2fs, and vfat filesystems.
Configuration
Config File
The installer reads from /etc/gaming-mode.conf (or ~/.gaming-mode.conf if it exists):
PERFORMANCE_MODE=enabled # Set to "disabled" to skip performance tuning
Gamescope Session Config
The installer only writes GPU + static keys to ~/.config/environment.d/gamescope-session-plus.conf:
# Static — every install:
STEAM_ALLOW_DRIVE_UNMOUNT=1
FCITX_NO_WAYLAND_DIAGNOSE=1
SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0
# GPU-specific (NVIDIA shown):
VULKAN_ADAPTER=10de:25ac
GBM_BACKEND=nvidia-drm
Display keys (SCREEN_WIDTH, SCREEN_HEIGHT, CUSTOM_REFRESH_RATES, OUTPUT_CONNECTOR) and hybrid-PRIME env vars are owned exclusively by the Settings TUI. Re-running the installer preserves your TUI choices.
NVIDIA note: Gamescope on NVIDIA is currently capped at 2560×1440. The TUI flags any higher resolution as unsupported.
Shader Cache
The installer configures a 12 GB shader cache by default in /etc/environment.d/99-shader-cache.conf:
MESA_SHADER_CACHE_MAX_SIZE=12G
__GL_SHADER_DISK_CACHE_SIZE=12884901888
DXVK_STATE_CACHE=1
NVIDIA-Specific Notes
- Kernel parameter:
nvidia-drm.modeset=1is required. The installer can configure this for Limine, GRUB, or systemd-boot. - Resolution cap: Gamescope on NVIDIA is limited to 2560×1440 maximum.
- Force composition: the NVIDIA wrapper automatically adds
--force-compositionif your Gamescope version supports it. - Environment:
GBM_BACKEND=nvidia-drmand related vars are set automatically. - Persistence mode: enabled during gaming, disabled on exit.
Hybrid laptop note
On a hybrid laptop (NVIDIA dGPU + AMD/Intel iGPU), the laptop screen (eDP-1) is wired to the iGPU. NVIDIA cannot scan out directly to it — pointing the direct [nvidia] mode at eDP-1 will black-screen.
Use [hybrid-nvidia] in the Settings TUI instead. Gamescope will run on the iGPU (which owns eDP-1) and games inside will render on NVIDIA via PRIME render offload, with the rendered frames flowing back through DMA-BUF for scanout. This is the same architecture Steam Deck uses (just with one GPU).
Bootloader Support
The installer can automatically configure nvidia-drm.modeset=1 for:
- Limine — appends to
cmdline:in/boot/limine.conf - GRUB — adds to
GRUB_CMDLINE_LINUX_DEFAULTand regenerates config - systemd-boot — provides manual instructions for
/boot/loader/entries/*.conf
A backup is created before any bootloader modification.
Troubleshooting
Verify Installation
Run the built-in verification to check all files, permissions, packages, and services:
./deckshift.sh --verify
Common Issues
Gaming Mode shows a black screen on eDP-1
Most likely a hybrid-laptop GPU↔connector mismatch — NVIDIA can't drive the iGPU's display.
- Switch the GPU mode to
[hybrid-nvidia](or[hybrid-amd]for AMD-only hybrids) in DeckShift Settings. - If you only have the laptop screen, that's the only working path — direct NVIDIA mode requires an external display plugged into the dGPU's HDMI/DP output.
See Recovery from a Black Screen for how to get out of the black-screen state.
Gaming Mode doesn't start
- Check NVIDIA kernel params:
cat /proc/cmdline | grep nvidia - Verify gamescope works:
gamescope -- steam - Check session logs:
journalctl --user -u gamescope-session -n 50
No network in Gaming Mode
- Test NM manually:
sudo systemctl start NetworkManager && nmcli general - Check polkit rules:
ls -la /etc/polkit-1/rules.d/50-gamescope-* - Check logs:
journalctl -t gamescope-nm -n 20
Super+Shift+R doesn't work in Gaming Mode
- Ensure
python-evdevis installed:pacman -Qi python-evdev - Ensure user is in
inputgroup:groups | grep input - Check the keybind monitor:
journalctl -t gaming-keybind-monitor -n 20 - Fallback: Steam → Power → Switch to Desktop
External drives not mounting
- Ensure
udisks2is installed:pacman -Qi udisks2 - Check polkit rules exist:
ls /etc/polkit-1/rules.d/50-udisks-gaming.rules - Check mount logs:
journalctl -t steam-library-mount -n 20
Audio stuttering in Gaming Mode
- Check PipeWire config exists:
cat /etc/pipewire/pipewire.conf.d/10-gaming-latency.conf - Try lower quantum: edit the config and set
default.clock.min-quantum = 128
Screen sharing in Chromium / Firefox is broken after returning from Gaming Mode (only "Share a tab" works)
xdg-desktop-portal-hyprland is bound to the killed Hyprland instance — tab capture works because it bypasses the portal, but desktop/window capture goes through it and fails silently.
DeckShift handles this automatically via /usr/local/bin/deckshift-portal-recovery (autostarted from ~/.config/hypr/autostart.conf). If you installed before this fix or the autostart hook didn't get added, run:
systemctl --user restart xdg-desktop-portal-hyprland xdg-desktop-portal pipewire pipewire-pulse wireplumber
then re-open the browser tab.
Suspend fails with "Access denied" after returning from Gaming Mode
The runtime mask on suspend.target from the gaming switch wasn't cleared. DeckShift now handles this in switch-to-desktop. For older installs, the one-time fix is:
sudo systemctl unmask --runtime sleep.target suspend.target hibernate.target hybrid-sleep.target
sudo systemctl daemon-reload
Power profile stays on performance after Gaming Mode exit
If you're on AC and using Omarchy, this is expected — see the Performance Mode caveat above. The deckshift restore is correctly running; Omarchy's session-init policy is overriding it on the next Hyprland start.
Intel-only system, Gaming Mode is laggy
- Older Gen8/9 Intel iGPUs (Skylake, Kaby Lake) struggle with Vulkan workloads. Lower the launch resolution via the Settings TUI (
deckshift-settings) — 720p / 1080p makes a big difference. - If you have a discrete GPU that should take over, check its driver is loaded:
lspci -k | grep -A2 VGA
Log Locations
| Component | Command |
|---|---|
| Gaming session | journalctl --user -u gamescope-session |
| NetworkManager | journalctl -t gamescope-nm |
| Drive mounting | journalctl -t steam-library-mount |
| Keybind monitor | journalctl -t gaming-keybind-monitor |
| Session wrapper | journalctl -t gamescope-wrapper |
| Installation | journalctl -t gaming-mode |
Uninstalling
To completely remove DeckShift:
# Stop any running gaming-mode bits
sudo pkill -f gamescope
sudo pkill -f gaming-keybind-monitor
sudo pkill -f steam-library-mount
# Remove scripts
sudo rm -f /usr/local/bin/{switch-to-gaming,switch-to-desktop,gamescope-session-nm-wrapper,\
gaming-session-switch,gaming-keybind-monitor,gamescope-nm-start,gamescope-nm-stop,\
steam-library-mount,deckshift-settings}
sudo rm -f /usr/lib/os-session-select
sudo rm -rf /usr/local/lib/gamescope-nvidia
# Remove SDDM session entry
sudo rm -f /usr/share/wayland-sessions/gamescope-session-steam-nm.desktop
sudo rm -f /usr/share/wayland-sessions/gamescope-session-steam.desktop
sudo rm -f /usr/share/wayland-sessions/gamescope-session.desktop
# Remove permissions
sudo rm -f /etc/sudoers.d/gaming-session-switch
sudo rm -f /etc/sudoers.d/gaming-mode-sysctl
sudo rm -f /etc/polkit-1/rules.d/50-gamescope-networkmanager.rules
sudo rm -f /etc/polkit-1/rules.d/50-udisks-gaming.rules
sudo rm -f /etc/udev/rules.d/99-gaming-performance.rules
sudo rm -f /etc/security/limits.d/99-gaming-memlock.conf
# Remove configs
sudo rm -f /etc/sddm.conf.d/zz-gaming-session.conf
sudo rm -f /etc/environment.d/99-shader-cache.conf
sudo rm -f /etc/environment.d/90-nvidia-gamescope.conf
sudo rm -f /etc/pipewire/pipewire.conf.d/10-gaming-latency.conf
sudo rm -f /etc/NetworkManager/conf.d/10-iwd-backend.conf
sudo rm -f /etc/NetworkManager/conf.d/20-unmanaged-systemd.conf
# Remove user files
rm -f ~/.config/environment.d/gamescope-session-plus.conf
rm -rf ~/.cache/deckshift
sudo rm -f /usr/share/applications/deckshift-settings.desktop
# Strip the Hyprland keybind line
sed -i '/switch-to-gaming/d' ~/.config/hypr/bindings.conf
# Reload polkit/udev
sudo systemctl restart polkit
sudo udevadm control --reload-rules
# Optionally remove AUR packages
yay -Rns gamescope-session-git gamescope-session-steam-git
Credits
- Omarchy — the Arch Linux distribution this was built for
- ChimeraOS — gamescope-session packages
- Valve — Steam, Gamescope, and the Steam Deck inspiration
- Hyprland — Wayland compositor
License
This project is provided as-is for the Omarchy community.
