Skip to content

Accessibility profiles

The 🌳 umi profiles (Unified Multimodal Input, unified multimodal input) generate a workstation usable without keyboard or mouse. It is controlled by several input methods coordinated with each other: touch, voice, gaze… The goal is accessibility, especially for people with motor disabilities.

They consist of two parts: a host profile umi which declares the hardware and session, and a user profile umi which sets the user’s environment.

No single input method replaces keyboard and mouse on its own: each has its limits (gaze precision, voice fatigue, gesture range). The UMI workstation combines them so they complement each other, and adjusts to the user’s abilities.

Input methodToolUsage
TouchTouchscreen, Onboard on-screen keyboardPoint, click, enter text
VoiceTalonVoice commands
GazeTobii Eye Tracker 5, driven by TalonMove the pointer

Coordination example: gaze places the pointer, voice or dwell-click confirms, on-screen keyboard enters text.

Diagram

Each device serves one input method : only equip the workstation with those suited to the user.

ItemRequirement
Eye trackerTobii Eye Tracker 5 (USB, manufacturer ID 2104)
Architecturex86_64-linux only (Talon provides no other binary)
MicrophoneNeeded for voice commands
SpeakersAudio feedback for visual keyboard keystrokes
ScreenA good touchscreen for controlling the desktop and applications
  1. Declare the host and its user in etc/config.yaml, both with the umi profile :

    etc/config.yaml
    users:
    alice:
    uid: 1010
    name: "Alice"
    profile: "umi"
    groups: ["global"]
    hosts:
    - hostname: "umi-desktop"
    name: "Poste accessible"
    zone: "maison:2.3"
    profile: "umi"
    users: ["alice"]

    On the umi host, the user profile adds the account to the input and uinput groups, without which Talon cannot inject events.

  2. Enable automatic login in the machine configuration, if the user cannot use a keyboard to log in :

    usr/machines/umi-desktop/configuration.nix
    darkone.host.umi.autoLoginUser = "alice";
  3. Generate and deploy :

    Fenêtre de terminal
    just generate
    just apply umi-desktop
  4. Test and configure

Options of darkone.host.umi, to set in usr/machines/<host>/configuration.nix.

OptionDefaultRole
enableenabled by the profileActivates the host profile
autoLoginUsernullumi account started at boot
packagepkgs.talonTalon package, or null to install it manually

Options of darkone.home.umi, set in usr/users/<login>/default.nix.

OptionDefaultRole
enableenabled by the profileEnables the user profile
enableTalonAutostarttrueStarts Talon at login
communityScriptsnulltalonhub/community tree deployed in ~/.talon/user/community
enableDwellfalsePermanent dwell clicking
enableTrackerAutotrueGaze and click follow the tracker
gazeFilterSpeed1.0Gaze responsiveness (Talon’s)
cursorFilterSpeed4.0Pointer responsiveness (Talon : 2.0)
enableGazeControltrueThe pointer follows the gaze
enableHeadControltrueThe head refines the pointer placed by the gaze
headSpeed5.0Head sensitivity (Talon : 1)
enableHeadJumpfalseA head movement brings the pointer back to the gaze
enableMouseJumpfalseMoving a mouse toward the gaze brings the pointer there
enableGazeFocusfalseThe gazed window takes focus (experimental)
dwellTime1.6Dwell click delay, in seconds
panelHeight64Cinnamon panel height, in pixels
textScaling1.5Text magnification factor (Cinnamon)
enablePaneltrueImposed panel, rewritten at each deployment
enableMaximizetrueApplication windows open maximized (Cinnamon)
panelLaunchersFiles, FirefoxPanel launchers (.desktop files)
menuFavoritesCalibration, Calculator, Calendar, SettingsMenu favorites, rewritten at deployment
enableRofiMenutrueFull-screen application grid
rofiGridResolution{ columns = 6; rows = 4; }Tiles per grid page
hiddenAppsTerminals, duplicates, NixOS manualHidden from the grid and menu
enableStkWithMousefalseSuperTuxKart with the mouse

With enableStkWithMouse, the user drives SuperTuxKart 🡕 with their mouse alone, for example an adapted joystick recognized as a mouse (n-ABLER…). umi host only. The game is installed, its launcher also starts the dnf-stk-mouse converter.

GestureAction in the game
Joystick forwardAccelerate
Joystick backwardBrake, reverse
Joystick left, rightTurn
Left click heldDrift
Double left clickUse item (weapon)
Right click heldNitro

The pointer stays active : the game menus are driven with the mouse, the race ignores it. The gestures only act when the game window is active, elsewhere the mouse stays a mouse.

The workstation is deliberately stripped of everything that assumes a keyboard or mouse.

ChangeReason
Cinnamon session on X11Talon does not (unfortunately) run under Wayland
Automatic loginNo password can be typed
Lock and sleep disabledA locked screen is a dead end
Keyring without passwordAvoids a prompt that cannot be satisfied
Accessibility active from loginNo activation prompt (Onboard)
Cursor, text, panel and icons enlargedLimited gaze precision (a few tens of pixels) and finger precision
Application windows maximizedLarge targets, panel always reachable
Open with a single click (Nemo)A dwell double click would require changing modes
Visual keyboard anchored at the bottomLarge targets, word prediction
Visual keyboard hidden at startupUncluttered screen, shown by its button
Dark theme by default (Cinnamon)Like GNOME sessions

Under Cinnamon, enablePanel organizes the bottom panel for the gaze.

PositionContent
LeftMenu, grid, launchers, open windows
RightClick types, pause zone, gaze
ThenAccessibility, visual keyboard
FinallyStatus icons (Talon, Nextcloud…), clock

No Bluetooth icon and no corner bar (show desktop). Pairing goes through the Bluetooth Manager in the menu.

The click types (single, one-shot, double, drag, secondary) and the pause zone only appear if dwell clicking is active. The pause zone lets the gaze explore the screen without triggering anything ; the click types hide during the pause.

The one-shot single click (orange “1” badge) clicks once, then pauses dwell clicking. On resume, the simple click repeats.

Action on the pause zoneEffect
Click, clicks activeSuspends dwell clicking
Pointer resting 1.5 s, pausedReactivates clicks (green bar)
Mouse click, pausedReactivates clicks

The gaze button (eye) turns off pointer control by gaze : the eyes no longer move anything, and dwell clicking pauses to leave the hand to the mouse. Turning it back on with the mouse, touch, or the Talon action user.umi_gaze also reactivates clicks. It is turned back on at every start.

With enableRofiMenu, the first launcher on the panel opens all applications full screen, in pages of large tiles, with no scrollbar.

TargetEffect
Hovered tileHighlighted
Click a tileLaunches the application, closes the grid
◀ ▶ (screen edges)Previous, next page
CloseCloses the grid

Settings panels stay in the Cinnamon menu. hiddenApps hides other applications (.desktop files) from both the grid and the menu. rofiGridResolution sets the number of tiles per page.

The Calibrate gaze favorite, at the top of the Cinnamon menu, launches Talon’s calibration, without going through its menu in the notification area. It appears with enableTrackerAuto.

Recalibrate after a change of screen, tracker position or user, or lighting.

The tracker mounts under the main screen, the one where Talon calibrates. The Tobii 5 supports a 16:9 screen up to 27”, at 45-95 cm : beyond that (TV…), calibration stops at the first point.

With enableHeadControl, the gaze brings the pointer into the target zone and the head refines it. Above 1, headSpeed makes the head more sensitive ; below, it tames overly large head movements. These settings can be tried without redeploying, from Talon’s console (REPL), and are lost when Talon restarts.

  1. Open the console of the user’s Talon, from an administrator account on the host :

    Fenêtre de terminal
    sudo -u alice env HOME=/home/alice /home/alice/.talon/.venv/bin/repl
  2. Read the applied settings :

    print(actions.user.umi_tuning())
  3. Try values, the user at the workstation :

    CommandEffect
    actions.tracking.control_head_toggle(True)Enables the head
    actions.user.umi_head_speed(5)Head 5 times more sensitive (default)
    actions.user.umi_head_speed(0.3)Head 3 times less sensitive
    actions.user.umi_head_speed(1)Talon’s original sensitivity
    actions.user.umi_filter_speed(1, 4)Gaze and pointer responsiveness (default)
  4. Record the chosen values in usr/users/<login>/default.nix (enableHeadControl, headSpeed, gazeFilterSpeed, cursorFilterSpeed), then deploy.

A regular account keeps its GNOME Wayland session, with a few differences inherited from the host :

  • Startup: the machine opens the session for the UMI account. Close that session or switch users to open your own.
  • Seahorse: not present, as it is unusable without a keyboard.
  • su: does not transmit screen access, and a prompt (keyring…) would block the UMI account. Administer via SSH or from your own session.
  • Shutdown: each service has 5 seconds to stop.
SymptomLead
Talon does not see the trackerReplug the tracker, then restart Talon (udev rule applied on connection)
Talon icon missing from the panelReopen the session
Firmware not initializedRun Tobii Experience once under Windows
Session opened under GNOMECheck the account’s umi profile and its presence in the host’s users, then reboot
The pointer clicks by itselfenableDwell enabled without a tracker, disable it
“Hover Click” window, clicks always simple, wheel unusableA mousetweaks daemon is running in the session, started before the update : reopen the session
The pointer always aims beside the gazeRecalibrate
Calibration stops at the first pointScreen larger than 27”, or too far away
The pointer stops before the gazed pointIncrease gazeFilterSpeed and cursorFilterSpeed
The pointer overshoots or jittersDecrease them
The head moves the pointer too muchLower headSpeed, or set enableHeadControl to false
The kart does not respond to the mouseRestore the game’s default keys, read the converter’s messages (journalctl -b -g 'dnf-stk-mouse:')
The joystick is not in the mice read (reading …)Absent from lsusb : plug it into another USB port (connect-debounce failed in dmesg)

Not on a umi host: the Cinnamon session is re-imposed at every boot, because Talon requires X11.

The account opens the host’s GNOME Wayland session, with the GNOME on-screen keyboard, the enlarged cursor and text. Talon and Onboard, which require X11, stay inactive.