Repository navigation
Conversation
A headless session starts on an empty workspace of its own, so the windows open on the remote stay on its physical screens, out of view; and on a machine whose monitor is asleep, mirroring it shows nothing. `--move-workspaces` (server, and the client, which passes it on) moves every regular workspace onto the headless output when the session starts and shows there the one the main monitor was showing. At the end each goes back to the monitor it came from and each monitor shows what it did, before the output is removed; left to itself, Hyprland would pile them all onto one monitor. hypr-ipc gains workspace listing, each monitor's active workspace, and the two dispatchers this needs, with the Lua fallback. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
[Medium impact] The PR appears safe to merge; no blocking issue remains. SummaryAdds
|
Hyprland gives named workspaces negative IDs, like the scratchpads, so skipping every ID at or below zero left named workspaces and their windows on the physical screens. Scratchpads are now told apart by their "special" name, and named workspaces are moved and shown by "name:<name>". A workspace's home was recorded only after the move answered ok. A move whose answer timed out could still happen, and then nothing put that workspace back. The home is now recorded before the move; restoration already moves only the workspaces still on the session's output. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JauiFwn6qx2NBFZJ7FvEva
Restoration retried its snapshot but sent each move once. If IPC stalled then, the move failed silently and the output was removed anyway, leaving that workspace wherever Hyprland put it. Each move is now retried like the snapshot, and one that still fails is logged with the monitor it should have gone back to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JauiFwn6qx2NBFZJ7FvEva
A named workspace reaches the Lua dispatchers as "name:<name>", and the name went into the Lua string unescaped. A quote or backslash in it broke the call or changed the name Hyprland read, so that workspace was neither moved nor returned. Both calls now quote the selector as a Lua string. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JauiFwn6qx2NBFZJ7FvEva
Main's keep-awake cancellation gave the dispatcher a third argument, the check that lets teardown skip a request. Workspace moves and focus are never cancelled, so they pass `|| true`, as set_dpms does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NWLtaPFL1Y2jfFD7qm2QjZ
Unayung
added a commit
to Unayung/gliff
that referenced
this pull request
Oct 27, 2026
Brings in current main through omacom#58. Main's session test still passed a bare VideoMode; it now passes Wants, without moving workspaces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NWLtaPFL1Y2jfFD7qm2QjZ
Showing the restored workspace now retries like the moves before it, and warns if it still fails. Special workspaces are recognized by the "special:" prefix Hyprland gives them, so a regular named workspace such as "special-mail" is moved like any other. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NWLtaPFL1Y2jfFD7qm2QjZ
Hyprland 0.57 leaves `id` out of a special workspace in `j/workspaces`. With a scratchpad open the whole list failed to parse (`missing field `id``), so a session moved no workspaces. A missing id reads as 0, which selects by name as the negative ids of special workspaces did. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMMntUgWn4YwdAk17sViei
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
A
--headlesssession starts on an empty workspace of its own. The windows already open on the remote stay on its physical screens, out of view, so the session does not show the desktop you left at home. Mirroring the physical screen instead shows nothing when that monitor is asleep.Details
--move-workspaces(with--headless) is a new server flag. The client takes the same flag and passes it on.workspaces, andMonitor::active_workspace;move_workspace_to_monitorandshow_workspace, which go through the same Lua-aware dispatcher helper.This builds on #57 for that
dispatcherhelper, so its first commit is that change. Once that merges, only the second commit remains.Additional information
scripts/check.shpasses. I have not runscripts/e2e.sh. Tested by hand on Hyprland 0.56.2 with a Lua config, a 3440x1440 monitor and a client on macOS: workspaces 1–3 and their windows move onto the headless output and go back to DP-2 on disconnect, and DP-2 shows the workspace it showed before.🤖 Generated with Claude Code