1{ lib, ... }: 2{ 3 name = "fcitx5"; 4 meta.maintainers = with lib.maintainers; [ nevivurn ]; 5 6 nodes.machine = 7 { pkgs, ... }: 8 { 9 imports = [ 10 ../common/user-account.nix 11 ]; 12 13 environment.systemPackages = [ 14 # To avoid clashing with xfce4-terminal 15 pkgs.alacritty 16 ]; 17 18 services.displayManager.autoLogin = { 19 enable = true; 20 user = "alice"; 21 }; 22 23 services.xserver = { 24 enable = true; 25 displayManager.lightdm.enable = true; 26 desktopManager.xfce.enable = true; 27 }; 28 29 i18n.inputMethod = { 30 enable = true; 31 type = "fcitx5"; 32 fcitx5.addons = [ 33 pkgs.fcitx5-chinese-addons 34 pkgs.fcitx5-hangul 35 pkgs.fcitx5-m17n 36 pkgs.fcitx5-mozc 37 ]; 38 fcitx5.settings = { 39 globalOptions = { 40 "Hotkey"."EnumerateSkipFirst" = "False"; 41 "Hotkey/TriggerKeys"."0" = "Control+space"; 42 "Hotkey/EnumerateForwardKeys"."0" = "Alt+Shift_L"; 43 "Hotkey/EnumerateBackwardKeys"."0" = "Alt+Shift_R"; 44 }; 45 inputMethod = { 46 "GroupOrder" = { 47 "0" = "NixOS_test"; 48 }; 49 "Groups/0" = { 50 "Default Layout" = "us"; 51 "DefaultIM" = "wbx"; 52 "Name" = "NixOS_test"; 53 }; 54 "Groups/0/Items/0" = { 55 "Name" = "keyboard-us"; 56 }; 57 "Groups/0/Items/1" = { 58 "Layout" = "us"; 59 "Name" = "wbx"; 60 }; 61 "Groups/0/Items/2" = { 62 "Layout" = "us"; 63 "Name" = "hangul"; 64 }; 65 "Groups/0/Items/3" = { 66 "Layout" = "us"; 67 "Name" = "m17n_sa_harvard-kyoto"; 68 }; 69 "Groups/0/Items/4" = { 70 "Layout" = "us"; 71 "Name" = "mozc"; 72 }; 73 }; 74 }; 75 }; 76 }; 77 78 testScript = 79 { nodes, ... }: 80 let 81 user = nodes.machine.users.users.alice; 82 xauth = "${user.home}/.Xauthority"; 83 in 84 '' 85 start_all() 86 87 machine.wait_for_x() 88 machine.wait_for_file("${xauth}") 89 machine.succeed("xauth merge ${xauth}") 90 machine.sleep(5) 91 92 machine.wait_until_succeeds("pgrep fcitx5") 93 machine.succeed("su - ${user.name} -c 'kill $(pgrep fcitx5)'") 94 machine.sleep(1) 95 96 machine.succeed("su - ${user.name} -c 'alacritty >&2 &'") 97 machine.wait_for_window("alice@machine") 98 99 machine.succeed("su - ${user.name} -c 'fcitx5 >&2 &'") 100 machine.sleep(10) 101 102 ### Type on terminal 103 machine.send_chars("echo ") 104 machine.sleep(1) 105 106 ### Start fcitx Unicode input 107 machine.send_key("ctrl-alt-shift-u") 108 machine.sleep(1) 109 110 ### Search for smiling face 111 machine.send_chars("smil") 112 machine.sleep(1) 113 114 ### Navigate to the second one 115 machine.send_key("tab") 116 machine.sleep(1) 117 118 ### Choose it 119 machine.send_key("\n") 120 machine.sleep(1) 121 122 ### Start fcitx language input 123 machine.send_key("ctrl-spc") 124 machine.sleep(1) 125 126 ### Default wubi, enter 127 machine.send_chars("gggh ") 128 machine.sleep(1) 129 130 ### Switch to Hangul 131 machine.send_key("alt-shift") 132 machine.sleep(1) 133 134 ### Enter 135 machine.send_chars("gks") 136 machine.sleep(1) 137 138 ### Switch to Harvard Kyoto 139 machine.send_key("alt-shift") 140 machine.sleep(1) 141 142 ### Enter 143 machine.send_chars("ka") 144 machine.sleep(1) 145 146 ### Switch to Mozc 147 machine.send_key("alt-shift") 148 machine.sleep(1) 149 150 ### Enter 151 machine.send_chars("ka\n") 152 machine.sleep(1) 153 154 ### Turn off Fcitx 155 machine.send_key("ctrl-spc") 156 machine.sleep(1) 157 158 ### Redirect typed characters to a file 159 machine.send_chars(" > fcitx_test.out\n") 160 machine.sleep(1) 161 machine.screenshot("terminal_chars") 162 163 ### Verify that file contents are as expected 164 file_content = machine.succeed("cat ${user.home}/fcitx_test.out") 165 assert file_content == "\n", f'output does not match input:\n{file_content}' 166 ''; 167}