Files
hq/01-RESEARCH/026-the-graphical-session-as-modules/04-screensaver-displays-and-menus.md
T

6.6 KiB

04 — Screensaver, displays and menus

Three areas the operator named on 2026-10-04, as their own modules. Each sharpens a row of 01 and a question of 02.

The screensaver: idle, lock and display power

Measured on both workstations:

  • Idle and lock are three things wired by hand in the session's start script:
    • the X screensaver timeout (xset s 1800);
    • the display power timeouts (xset dpms);
    • xss-lock running the colour build of i3lock through a wrapper, in a respawn loop.
  • A second screensaver, xscreensaver, is installed and deliberately not started. Earlier it overrode the display power settings with its own, and locked nothing. Its configuration file is still in the home.
  • The lock screen's 20-odd colours and formats were predecessor theme variables.
  • The colour build is not in the official repositories (research 026/01).

Starting position:

  • One module for the lock screen, holding node-lock-screen: the locker and its wrapper as the module's own files, the screensaver and display power timeouts, and xss-lock.
  • The timeouts and colours are its defaults, and settings later (issue 168).
  • The colour build ships as ADR 0205's pinned archive, or the module uses the official i3lock. That is the operator's choice, and the colours are the only difference.
  • xscreensaver is not a module; its package and file are removed.
  • xss-lock needs the logind session, so it stays a session-start line contributed into .xinitrc's block (question 4), not a unit.

Monitor layout (xrandr)

Measured:

  • Each workstation has a layout script generated by arandr, with the monitor names baked in. One workstation also has several layouts for named places, a hotplug rule and a wizard.
  • The desktop carried the laptop's layout scripts.
  • No xorg.conf.d, and no layout tool beyond the scripts.

Starting position: autorandr (official repositories) inside the display server's module.

  • autorandr saves a layout as a profile keyed by the connected monitors' identities (their EDID) and applies the matching one at login and on hotplug.
  • Profiles therefore need no machine's name. A profile can be shared mesh-wide and simply never matches on a machine without those monitors. That is exactly the "say it by what is there, never by a name" rule (ADR 0112).
  • The profiles are the operator's data, saved by the tool itself, so they are found (ADR 0182). A layout verb on node-display-server lists, saves and applies them.
  • The arandr scripts and the hotplug rule retire once a profile exists for each.

Menus: rofi and dmenu

Measured:

  • rofi is the launcher, the power menu, the theme picker and the clipboard menu.
  • The operator's scripts call rofi -dmenu in four places and plain dmenu in two. dmenu is installed on neither workstation, so those two fail.

Starting position:

  • rofi holds node-launcher, and the seat's protocol includes a dmenu-compatible command: read choices on standard input, print the chosen one. Scripts call that command, not a program by name.
  • dmenu is a module of its own (official repositories), able to hold the same seat on a machine that wants it, for instance a Wayland session where wofi or fuzzel would hold it instead.
  • The rofi module carries its theme files, and the menus that belong to other modules arrive as those modules' scripts:
    • power menu → the session;
    • clipboard menu → the clipboard module;
    • theme picker → settings, once issue 168 closes.

The clipboard: xclip and greenclip

Measured:

  • greenclip keeps the clipboard's history, and rofi shows it on a key binding.
  • greenclip is not in the official repositories.
  • It is started two ways: the window manager's configuration starts it on both workstations, and on one a user unit is enabled as well.
  • Its configuration names an absolute home path.
  • xclip (official) is the command-line clipboard the operator's scripts use.

Starting position:

  • xclip is a module of its own, a package and nothing else. It is the tool scripts depend on, and a module that needs it requires it.
  • The clipboard manager holds node-clipboard: its daemon, started once by the session (a session contribution, or a user unit once user-scoped units ship, never both), its configuration with no absolute path, and its menu binding contributed to the window manager.
  • Which manager holds it is the operator's choice:
    • greenclip, as today, shipped under ADR 0205;
    • or clipmenu (official), which feeds the same dmenu-compatible command as the launcher seat above, and needs no archive.
  • On Wayland the same seat is held by cliphist with wl-clipboard, both official.

Fonts

Measured:

  • The fonts the desktop uses are hand-copied files in the account's font directory, not packages:
    • a Nerd font for the window manager, the bar and the terminal;
    • a second one for the prompt;
    • on one workstation, the same four files twice, once under URL-encoded names;
    • on the other, a different build of the same font and three more copied from a theme's repository.
  • The system's default monospace is a different font (Noto Sans Mono), so anything that asks for monospace gets another face than the terminal.
  • The DPI is fixed in an X resource.
  • Every Nerd font in use is in the official repositories (Hack, Meslo, Iosevka, JetBrains Mono).

Decided (the operator left the choice open, except that it must not be today's Hack):

role face why
monospace: terminal, window manager, bar, launcher, prompt JetBrains Mono Nerd Font built for long reading in a terminal, unambiguous 0O1lI, optional ligatures; a version-3 Nerd font, so every icon the prompt and bar use is present
interface: GTK, Qt, notifications Inter designed for screens, clear at small sizes
icons missing from any face Nerd Fonts Symbols a fallback, so a font without icons still shows them
emoji Noto Color Emoji
serif and every other script Noto

All five are official packages.

Starting position:

  • A fonts module: those packages, and a fontconfig file it owns that maps monospace, sans-serif, serif and the emoji and symbol fallbacks to the chosen faces, so every program agrees.
  • The terminal, bar, launcher and prompt modules name the family, not a file.
  • The DPI becomes the display server's setting (issue 168).
  • The copied files are removed by the operator once the packages are in (ADR 0182).
  • Fonts are not a seat: several coexist. The module owns the one place where the default is said.