1{ pkgs, lib, ... }:
2{
3 name = "sx";
4 meta.maintainers = with lib.maintainers; [
5 figsoda
6 thiagokokada
7 ];
8
9 nodes.machine =
10 { ... }:
11 {
12 imports = [ ./common/user-account.nix ];
13
14 environment.systemPackages = with pkgs; [ icewm ];
15
16 services.getty.autologinUser = "alice";
17
18 services.xserver = {
19 enable = true;
20 displayManager.sx.enable = true;
21 };
22
23 # Create sxrc file on login and start sx
24 programs.bash.loginShellInit =
25 # bash
26 ''
27 mkdir -p "$HOME/.config/sx"
28 echo 'exec icewm' > "$HOME/.config/sx/sxrc"
29 chmod +x "$HOME/.config/sx/sxrc"
30
31 sx
32 '';
33 };
34
35 testScript =
36 { nodes, ... }:
37 let
38 user = nodes.machine.users.users.alice;
39 in
40 # python
41 ''
42 start_all()
43
44 machine.wait_for_unit("multi-user.target")
45
46 xauthority = "${user.home}/.local/share/sx/xauthority"
47 machine.wait_for_file(xauthority)
48 machine.succeed(f"xauth merge {xauthority}")
49
50 def icewm_is_visible(_last_try: bool) -> bool:
51 # sx will set DISPLAY as the TTY number we started, in this case
52 # TTY1:
53 # https://github.com/Earnestly/sx/blob/master/sx#L41.
54 # We can't use `machine.wait_for_window` here since we are running
55 # X as alice and not root.
56 return "IceWM" in machine.succeed("DISPLAY=:1 xwininfo -root -tree")
57
58 # Adding a retry logic to increase reliability
59 retry(icewm_is_visible)
60 '';
61}