Control: retitle -1 dbus: brltty cannot correlate orca user-service with
current VT
Control: affects -1 + brltty
On Mon, 05 Jan 2026 at 12:57:22 +0100, Samuel Thibault wrote:
Simon McVittie, le lun. 05 janv. 2026 11:17:10 +0000, a ecrit:
Is there a solution-neutral problem statement for these Braille output
issues?
Orca is not the only producer of braille on the system. When the user
switches to another VT, the actual braille driver (brltty) needs to know
that the Orca output was meant only for its own VT and not the others.
Am I correct to think that orca is a user-service (a child of systemd --user
or dbus-daemon --session), while brltty is a system service (a child of
pid 1 or dbus-daemon --system)?
So during VT switching, one of these approaches is needed?
- brltty keeps track of potentially multiple orca instances, correlates
them with the currently active console session, and silences text output
from the others
- or, orca keeps track of which session it conceptually belongs to,
and silences itself when a different console session is active
- or potentially a hybrid where brltty silences *uids* that differ from the
active console session, but orca is responsible for silencing itself
when the graphical session is not the active one
But if the same user is logged-in on more than one VT, then the Orca
instance is (conceptually) shared between all of those login sessions -
that's what it means to be a systemd user-service or a D-Bus session
service. That would suggest that it might be the user-session (uid) that
should matter, not individual login sessions.
Simon McVittie, le lun. 05 janv. 2026 11:15:01 +0000, a ecrit:
Is there a specification for how XDG_VTNR is meant to work?
https://www.freedesktop.org/software/systemd/man/latest/pam_systemd.html#%24XDG_VTNR
documents it.
That documents how libpam_systemd uses XDG_VTNR, but doesn't describe
how other components (like brltty and/or orca) are allowed/expected to
use it, or how the components that set and propagate it are expected to
set it.
From codesearch, it looks as though the component that sets XDG_VTNR is
the display manager (gdm or similar), so this is "API" between multiple
components. https://systemd.io/WRITING_DISPLAY_MANAGERS/ is perhaps
closer to a specification, but doesn't really say anything about
how/whether brltty can rely on it. I couldn't see anything obvious in
https://specifications.freedesktop.org/ either.
I had the impression that in this scenario, XDG_VTNR should be 2 for
processes belonging to the graphical login session on tty2, 6 for processes
belonging to the text-mode login session on tty6, unset for processes in the
ssh login session, and also unset for services started by `systemd --user`
that are (at least conceptually) shared between all of those login sessions.
Is that correct?
Yes.
That's what I thought, but then this contradicts the next thing you said:
What you're proposing seems to be that the XDG_VTNR of a graphical login
session should be copied to the environment of services started by `systemd
--user`, the same way we copy around DISPLAY and WAYLAND_DISPLAY.
Yes, exactly.
For these services, XDG_VTNR can't be both unset, and also set to the VT
where the graphical session (if any) is running: we have to choose one
or the other. You're asking me to change that choice, and before doing
that, I want to be sure that I'm not undermining the way XDG_VTNR was
meant to work and regressing some other component that relies on
specific semantics for it.
gnome-session also specifically doesn't copy around the XDG_VTNR (and
some others) "as they might end up in the wrong session":
<https://sources.debian.org/src/gnome-session/49.2-3/gnome-session/gsm-util.c?hl=40#L40>.
How does this work in other distros?
Other distros are probably using xorg/50-systemd-user.sh which requires
the same.
If you mean the xorg/50-systemd-user.sh from src:systemd, that copies the
DISPLAY and XAUTHORITY (like dbus' 20dbus_xdg-runtime), but does not
copy XDG_VTNR (again, same as dbus' 20dbus_xdg-runtime).
smcv