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}