Skip to content

[Bug] Non-Steam games try to invoke steam - Non-Steam shortcuts always launch through the real Steam client, with no direct-exec option #38

Description

@ryansdecker

Omakade version

1.6.1

System

System: Omarchy 4.0.2, Hyprland 0.56.2, native (non-Flatpak) Omakade and Steam

Game source

Steam

What happened?

I have a natively-installed Linux game (Unreal Tournament 2004, run through a small wrapper script, not through Proton) registered as a Steam "non-Steam game" shortcut purely so Omakade would discover it — Omakade has no generic "native app" source, so a Steam shortcut is the only way to get an arbitrarily-installed native binary into the library.

Clicking Play on it in Omakade always launches it via the real Steam client (steam://rungameid/), even though the shortcut's Exe already points directly at a runnable wrapper script that needs nothing from Steam (no Proton, no cloud saves, no achievements). I can confirm this from the live process list when launching from Omakade:

$ pgrep -x steam -a
592333 /home/user/.local/share/Steam/ubuntu12_32/steam -srt-logger-opened steam://rungameid/10036044037577768960

Expected: for a non-Steam shortcut, Omakade would launch the shortcut's Exe directly (optionally via an explicit "Launch without Steam" action, so real Steam games/Proton titles keep going through the client as they should).

Actual: every Steam-sourced entry, non-Steam shortcuts included, is launched by shelling out to the Steam client and asking it to run the shortcut via protocol handler. This adds Steam-client overhead/focus-stealing to a launch that doesn't need it, and (combined with the shortcut's default AllowOverlay=1) the Steam overlay hook broke the game's own SDL fullscreen toggle (Alt+Enter got stuck windowed) until I disabled the overlay by hand in shortcuts.vdf.

Root cause (from source)

  • src/sources/steam/SteamScanner.cpp, importNonSteamShortcuts(): parses Exe out of each shortcut only to derive installDirectory when StartDir is empty — the Exe path itself is never stored on SteamGameRecord, so nothing downstream can launch it directly even if it wanted to.
  • src/launch/SteamLauncher.cpp, SteamLauncher::launch() / SteamLauncher::open(): unconditionally builds a steam://rungameid/ URL and shells out to the steam binary (or the Flatpak) for every Steam-sourced game. There's no branch that distinguishes an owned Steam appid from a non-Steam shortcut, even though launchTargetId() a few lines above already has to special-case the shortcut's 32-bit-with-high-bit-set id format.

Suggested direction

Keep the shortcut's Exe/StartDir on the scanned record, and give non-Steam shortcuts a way to launch directly (QProcess::startDetached on Exe in StartDir, the same shape as the existing Lutris/Heroic/Faugus commands in GameLauncher.cpp) instead of always going through steam://rungameid. This probably wants to be opt-in per shortcut (or a separate "Launch without Steam" action) rather than the default, since some non-Steam shortcuts genuinely need the real Steam client (Proton, Steam Input, overlay screenshots).

Relevant diagnostics

$ pacman -Q omakade
omakade 1.6.1-1
$ pacman -Q omarchy
omarchy 4.0.2-1
$ hyprctl version | head -1
Hyprland 0.56.2 built from branch v0.56.2 at commit efb50993...

Relevant diagnostics

No response

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions