From 583ac2e98c3ff4fa379194b2eb4e7530c07b275d Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Tue, 27 Oct 2026 13:08:31 +0100 Subject: games: route every Steam-launched window to workspace 8 Hyprland's class rules only catch Proton games (steam_app_N) and whatever else is listed by name, so a non-Steam shortcut, here a GOG Ren'Py build with its own class, opened on the current workspace. Steam sets SteamGameId in the environment of everything it launches, native, Proton and shortcuts alike, so on openwindow the shell looks up the window's pid and moves it when /proc//environ carries that variable. Checked with the shortcut that motivated it. Co-Authored-By: Claude Opus 5.5 --- games/README.md | 7 +++++++ games/shell.qml | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/games/README.md b/games/README.md index 26e592e..b0b6f5b 100644 --- a/games/README.md +++ b/games/README.md @@ -29,6 +29,13 @@ they come from `~/.cache/keystone/games/owned.json`, which key is read with `pass show "$GAMES_PASS_ENTRY"`; the SteamID is derived from the userdata account directory. +Every game window lands on workspace 8, however it was started. Steam +sets `SteamGameId` in the environment of every game it runs, native, +Proton or a non-Steam shortcut, so the shell moves any newly opened +window whose process carries it. Class rules in the Hyprland config miss +games that name themselves: a GOG Ren'Py build added as a shortcut had no +`steam_app_` class and opened wherever focus was. + ## Running qs -p ./games diff --git a/games/shell.qml b/games/shell.qml index c667ec4..f6ca8b3 100644 --- a/games/shell.qml +++ b/games/shell.qml @@ -10,11 +10,29 @@ // GNU General Public License for more details. import Quickshell +import Quickshell.Hyprland import Quickshell.Io +import QtQuick ShellRoot { Games { id: games } + // Every game Steam starts, native, Proton or a non-Steam shortcut, + // inherits SteamGameId; class rules miss the ones naming themselves + // (a Ren'Py shortcut did), so route on the window's environment. + Connections { + target: Hyprland + function onRawEvent(event) { + if (event.name !== "openwindow") return; + const addr = "0x" + event.data.split(",")[0]; + Quickshell.execDetached(["sh", "-c", + 'pid=$(hyprctl clients -j | jq -r --arg a "$1" \'.[] | select(.address == $a) | .pid\') && ' + + 'grep -qz "^SteamGameId=" "/proc/$pid/environ" && ' + + 'hyprctl dispatch "hl.dsp.window.move({ workspace = \\"8\\", window = \\"address:$1\\" })"', + "sh", addr]); + } + } + // `qs -p ipc call games toggle` IpcHandler { target: "games" -- cgit v1.2.3