From eb1704764fc98a817212553de27b8f0c20b1c718 Mon Sep 17 00:00:00 2001 From: Emma Thorpe Date: Tue, 9 Jun 2026 18:31:47 +0100 Subject: [PATCH] fix(sway): use the us(dvorak) variant, not a "dvorak" layout Dvorak is a variant of the "us" XKB layout, not a layout of its own: there is no symbols/dvorak file, so "dvorak" fails to compile. In the greetd/cage greeter the keymap comes solely from XKB_DEFAULT_*, so the failure left the greeter with no keymap and therefore no keyboard input at all (mouse unaffected). Split it into XKB_DEFAULT_LAYOUT=us + XKB_DEFAULT_VARIANT=dvorak. The same mistake in the Sway session (home/sway.nix) was masked: the default us keymap compiled and the failing override was silently dropped, so the session ran QWERTY despite the dvorak setting. Use xkb_variant there too so it is actually Dvorak. console.keyMap = "dvorak" (workstation.nix) is unaffected -- that is a kbd console map, a separate subsystem where "dvorak" is valid. Co-Authored-By: Claude Opus 4.8 (1M context) --- lyrathorpe/home/sway.nix | 8 +++++++- lyrathorpe/swaywm.nix | 12 ++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lyrathorpe/home/sway.nix b/lyrathorpe/home/sway.nix index 0d0d709..7add6c9 100644 --- a/lyrathorpe/home/sway.nix +++ b/lyrathorpe/home/sway.nix @@ -26,7 +26,13 @@ # Launcher: sway-launcher-desktop running inside a floating foot window. menu = "${pkgs.foot}/bin/foot --app-id=launcher ${pkgs.sway-launcher-desktop}/bin/sway-launcher-desktop"; - input."type:keyboard".xkb_layout = "dvorak"; + # Dvorak is a variant of the "us" layout, not a standalone layout -- + # `xkb_layout = "dvorak"` fails to compile (no symbols/dvorak) and wlroots + # silently falls back to QWERTY. Use the variant. + input."type:keyboard" = { + xkb_layout = "us"; + xkb_variant = "dvorak"; + }; window.commands = [ { diff --git a/lyrathorpe/swaywm.nix b/lyrathorpe/swaywm.nix index 200c91c..b90192c 100644 --- a/lyrathorpe/swaywm.nix +++ b/lyrathorpe/swaywm.nix @@ -52,13 +52,17 @@ in # features.swayDesktop (e.g. EDaaS) keep plain TTY login. programs.regreet.enable = true; # cage reads the XKB_* environment at startup, so force the greeter onto the - # same Dvorak layout as the console (workstation.nix) and the Sway session - # (home/sway.nix) -- otherwise the password field would be QWERTY. This - # overrides the greetd command regreet sets with mkDefault. + # same Dvorak layout as the Sway session (home/sway.nix) -- otherwise the + # password field would be QWERTY. Dvorak is the "us" layout's variant, NOT a + # layout of its own: "dvorak" alone has no symbols/ file, so the keymap + # fails to compile and the greeter ends up with no keyboard at all (the + # greeter has no fallback, unlike a running Sway session). This overrides the + # greetd command regreet sets with mkDefault. services.greetd.settings.default_session.command = let greeter = pkgs.writeShellScript "regreet-cage" '' - export XKB_DEFAULT_LAYOUT=dvorak + export XKB_DEFAULT_LAYOUT=us + export XKB_DEFAULT_VARIANT=dvorak exec ${pkgs.dbus}/bin/dbus-run-session ${lib.getExe pkgs.cage} -s -- ${lib.getExe config.programs.regreet.package} ''; in