add attwm support

This commit is contained in:
2026-07-26 13:48:27 +02:00
parent 9058dd7926
commit 202879eb0e
10 changed files with 404 additions and 44 deletions
+35
View File
@@ -0,0 +1,35 @@
pragma Singleton
import Quickshell
import QtQuick
// Which window manager is driving this session? Detected once, from the
// environment only.
//
// This deliberately does no IPC of its own. Widgets branch on these flags to
// pick a backend, and reading a flag must never be able to instantiate the
// service singleton for a window manager that isn't running -- an idle backend
// would sit there retrying a socket that will never answer. Anything that
// wants a backend gates on the matching flag first (`Compositor.isAttwm &&
// Attwm.x`), relying on `&&` / `?:` to leave the other branch untouched.
Singleton {
// Hyprland always exports this signature.
readonly property bool _hyprSig: !!Quickshell.env("HYPRLAND_INSTANCE_SIGNATURE")
// Sway and i3 both point clients at their IPC socket.
readonly property bool _i3Sock: !!Quickshell.env("SWAYSOCK")
|| !!Quickshell.env("I3SOCK")
// attwm exports no signature of its own: it is a window management client
// of river rather than a compositor, so there is nothing session-wide to
// look for. Treat it as the fallback -- an explicit socket override wins
// outright, otherwise assume attwm once the two that do announce
// themselves are ruled out. Guessing wrong is cheap: everything attwm
// renders also gates on `Attwm.connected`, so a session with no window
// manager we recognise shows nothing rather than a row of dead tags.
readonly property bool isAttwm: !!Quickshell.env("ATTWM_SOCKET")
|| (!_hyprSig && !_i3Sock)
readonly property bool isHyprland: !isAttwm && _hyprSig
readonly property bool isI3: !isAttwm && !isHyprland && _i3Sock
}