aboutsummaryrefslogtreecommitdiffstats
path: root/games
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-27 13:08:31 +0100
committerDanilo M. <danix@danix.xyz>2026-10-27 13:08:31 +0100
commit583ac2e98c3ff4fa379194b2eb4e7530c07b275d (patch)
tree73edd610bc767082a8671be1155dd7e78f74a713 /games
parenta35688e2e3a4e94d0f43f2548dfa6384a1bf1276 (diff)
downloadquickshell-583ac2e98c3ff4fa379194b2eb4e7530c07b275d.tar.gz
quickshell-583ac2e98c3ff4fa379194b2eb4e7530c07b275d.zip
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/<pid>/environ carries that variable. Checked with the shortcut that motivated it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'games')
-rw-r--r--games/README.md7
-rw-r--r--games/shell.qml18
2 files changed, 25 insertions, 0 deletions
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 <this dir> ipc call games toggle`
IpcHandler {
target: "games"