On Thu, 27 Jun 2024 at 09:45:41 +0000, Bastien Roucariès wrote:
sensible-utils will carry in trixie sensible-terminal.
It will allow one user to custumize the terminal to be used like sensible-
editor do.
Could you document it, in policy ?
Unfortunately I think the design currently implemented in
sensible-terminal has some significant limitations, and I think we can
do better.
A specification for what terminal to run needs to take into account
three groups of stakeholders:
* Consumers of the spec: applications/libraries that want to run a
terminal
* Providers: terminal emulators
* Configuration UIs like gnome-control-center and KDE's systemsettings
that should presumably offer a way to configure this choice per-user
The current design of sensible-terminal appears to be this:
* Users may configure their preferred terminal by setting environment
variable SENSIBLE_TERMINAL_EMULATOR or TERMINAL_EMULATOR.
Its value is a command, escaped as if in a shell script, to which
the options documented in Policy for x-terminal-emulator can be
appended.
* If users didn't configure this, each desktop environment may configure
its preferred terminal by creating a program in the PATH named
sensible-terminal-$desktop, where $desktop is the desktop
environment's name from $XDG_CURRENT_DESKTOP folded to lower-case
(for example sensible-terminal-gnome).
* If that doesn't exist, the default is the x-terminal-emulator
alternative.
If my summary is correct, then this interface is easy to use for
consumers and providers, but has some problems, especially around
configuration:
* Configuration is via environment variables. Because of how environment
variables inherit from parent to child, setting an environment variable
can't be "instant-apply": after changing it, the user has to terminate
all processes that already inherited it (in practice, log out and log
back in, or reboot).
* Configuration is via environment variables. There's no universal,
declarative way to set an environment variable for all login sessions,
which UIs like gnome-control-center and systemsettings would need
if they wanted to make this configurable. The closest I'm aware of
is environment.d(5), which I think only systemd implements (although
I would encourage non-systemd session managers to implement it too,
because it's a completely reasonable non-systemd-specific spec).
* A desktop environment can only nominate one preferred terminal.
GNOME would ideally say "ptyxis, gnome-console or gnome-terminal,
whichever one is installed", but there's no way to express that
declaratively. (We could make sensible-terminal-gnome be another layer
of imperative script, but I'd really rather not.)
* The terminal emulator has to accept the xterm-compatible "-e" syntax
where argument parsing stops at "-e", which is not straightforward to
implement in typical GNU-style command-line parsing (it requires "-e"
to behave like the conventional behaviour of "--"). For terminal
emulators that don't implement that syntax, like gnome-terminal, this
means SENSIBLE_TERMINAL_EMULATOR or TERMINAL_EMULATOR must be set to
an x-terminal-emulator-compatible wrapper (gnome-terminal.wrapper),
not to gnome-terminal itself.
* It's Debian-specific:
- Upstream configuration UIs are unlikely to offer configuration for
it unless specially patched by Debian, adding non-trivial
Debian-specific code.
- Upstream terminal emulators aren't going to integrate with it unless
Debian-specific code is added.
- Upstream consumers of the interface (like GLib) similarly aren't
going to integrate with it unless patched to do so; this is only
a small change, but could touch a large number of packages.
I would suggest that a better mechanism for choosing a terminal emulator
would be the one used by xdg-terminal-exec(1), in the package of the
same name, which avoids all of the problems I mentioned above:
* It can be configured on a per-user basis by writing files into
$XDG_CONFIG_HOME, without needing to set new tool-specific environment
variables like $TERMINAL_EMULATOR or $SENSIBLE_TERMINAL_EMULATOR,
which means that configuration is instant-apply and
non-session-specific. Advanced users can even configure a different
choice per (user,desktop) pair, although UIs aren't really expected
to offer this.
* A desktop environment can nominate a sequence of preferred terminals,
in priority order.
* It can cope with any "exec argument", typically "-e" (the default) or
"--". Terminal emulators can/should specify in their .desktop file
what their equivalent of "xterm -e" is, and several already do:
https://codesearch.debian.net/search?q=X-TerminalArgExec&literal=1
* It isn't Debian-specific: it already exists in other distros, and
various upstream projects already use/support it.
Unfortunately the configuration design that xdg-terminal-exec implements
is currently only a freedesktop.org proposal and has not been published
as a formal spec by freedesktop.org, but it's the best thing we have
available right now. It's modelled on the way that fdo MIME-type
handlers and URI scheme handlers are registered, which gives it a lot of
good properties "for free". Like the other related fdo specifications,
its design assumes that there could be any number of implementations,
with xdg-terminal-exec(1) merely being the reference implementation.
It's possible that freedesktop.org will end up recommending that
terminals are registered via the more general Intent Apps spec
<https://specifications.freedesktop.org/intent-apps/latest/>, which is
similarly modelled on how MIME-type and URI-scheme handlers already
work. If it does, then I would expect xdg-terminal-exec(1) to switch to
using that, plus backward compatibility to its previous draft spec.
When the specification to use has settled down, I would expect that
consumers of the interface (like GLib) are likely to stop exec'ing
xdg-terminal-exec as a program, and instead implement the spec directly
themselves, similar to how they implement fdo MIME-type handlers.
I'd recommend that any attempt to standardize this should be upstream
so that it benefits all distros, rather than being a downstream,
Debian-specific effort that is likely to end up being superseded by
whatever de facto standard has emerged upstream in the meantime.
In the short term, my suggestion would be for sensible-terminal to try
running xdg-terminal-exec, if installed (#1140004).
smcv