Install gliff by default and show when a remote session is active (#14712)

* Install gliff by default

Gliff is the Hyprland remote desktop over SSH. Ship it in the base
package set for new installs, with a migration for existing ones.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Show a bar indicator while a gliff remote session is active

The machine being controlled should make it obvious that someone is on
it. A first-party remote-session service watches Hyprland's screencast
events, which gliff-server triggers through ext-image-copy-capture, and
probes for the server process, picking up the ssh client address from
its environment. The RemoteSession indicator in the default tray lights
up in the urgent colour while a session runs, and a notification
announces each session start and end.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Address review of the remote session indicator

Probe only the current user's gliff-server processes, forward refresh
through the third-party service proxy so cloned indicator widgets can
re-probe, exercise the Hyprland screencast event path in the service
test with a grim capture instead of calling refresh by hand, and
describe the indicator as status only in the manual.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Drop the remote session notifications

The bar indicator is the signal; a toast on every connect and
disconnect is noise on top of it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Tighten remote session detection after review

Hyprland reports a screencast stopped as soon as frames pause for half a
second and says nothing more when the server later exits, so poll every
two seconds while a session is active instead of trusting a stop event.
Match only the screencast event, not its screencastv2 twin, and debounce
the burst around one transition so it costs one probe. Move the probe
into its own script that the service and the test both run, poll for
state in the service test instead of fixed delays, and drop the unused
session count.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
David Heinemeier HanssonandClaude Fable 5.1 authored and GitHub committed 2026-10-09 17:02:42 +02:00
1 parent 54fc12db76
commit 9d48fc402e
17 files changed
+483 -4

No files matched your search

@@ -41,12 +41,23 @@ ShellRoot {
}
}
QtObject {
id: remoteSessionService
property bool active: false
property var peers: []
property int refreshes: 0
function refresh() {
refreshes++
}
}
QtObject {
id: mockShell
function firstPartyServiceFor(id) {
if (id === "omarchy.notifications") return notificationService
if (id === "omarchy.idle") return idleService
if (id === "omarchy.nightlight") return nightlightService
if (id === "omarchy.remote-session") return remoteSessionService
return null
}
}
@@ -74,6 +85,7 @@ ShellRoot {
QtObject {
id: indicatorHost
property bool revealInactiveIndicators: true
signal refreshRequested()
}
function createIndicator(name) {
@@ -198,6 +210,19 @@ ShellRoot {
root.assertTrue(root.commandCount("omarchy-capture-screenrecording --stop-recording") === 1, "Screen Recording left click stops active recording")
}
var remoteSession = root.createIndicator("RemoteSession")
if (remoteSession) {
remoteSession.moduleName = "RemoteSession"
root.injectBar(remoteSession)
root.assertTrue(remoteSession.active === false, "Remote Session starts inactive without a gliff server")
remoteSessionService.active = true
remoteSessionService.peers = ["10.0.0.5"]
root.assertTrue(remoteSession.active === true, "Remote Session follows the service state")
root.assertTrue(remoteSession.tooltipText === "Remote session from 10.0.0.5", "Remote Session tooltip names the connected peer")
indicatorHost.refreshRequested()
root.assertTrue(remoteSessionService.refreshes === 1, "Remote Session refresh re-probes the service")
}
var stayAwake = root.createIndicator("StayAwake")
if (stayAwake) {
stayAwake.moduleName = "StayAwake"