1 | /*␊ |
2 | * Keymapper.c␊ |
3 | * Chameleon␊ |
4 | *␊ |
5 | * Created by Cadet-petit Armel on 05/12/10. <armelcadetpetit@gmail.com>␊ |
6 | * Copyright 2010. All rights reserved.␊ |
7 | *␊ |
8 | */␊ |
9 | ␊ |
10 | #include "libsaio.h"␊ |
11 | #include "bootstruct.h"␊ |
12 | #include "xml.h"␊ |
13 | #include "modules.h"␊ |
14 | ␊ |
15 | #define kEnableKeyMap "EnableKeyMapper"␊ |
16 | static int AZERTY_switch(int c);␊ |
17 | void Keymapper_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
18 | int Keymapper_getc();␊ |
19 | ␊ |
20 | int Keymapper_getc()␊ |
21 | {␉␊ |
22 | int c = bgetc();␉␉␊ |
23 | ␉␊ |
24 | ␉//execute_hook("Keymapper", &c, NULL, NULL, NULL, NULL, NULL);␉␊ |
25 | ␉Keymapper_hook(&c, NULL, NULL, NULL, NULL, NULL);␊ |
26 | ␉␊ |
27 | if ((c & 0xff) == 0) ␉␉␊ |
28 | return c;␊ |
29 | else ␉␊ |
30 | ␉␉return (c & 0xff); ␊ |
31 | }␊ |
32 | ␊ |
33 | // CPARM's AZERTY_switch : A Basic QWERTY to AZERTY switcher␊ |
34 | static int AZERTY_switch(int c)␊ |
35 | {␉␉␊ |
36 | ␉switch (c) {␊ |
37 | ␉␉case 4209: //q to a␊ |
38 | ␉␉␉c = 7777;␊ |
39 | ␉␉␉break;␊ |
40 | ␉␉case 7777: // a to q␊ |
41 | ␉␉␉c = 4209;␊ |
42 | ␉␉␉break;␊ |
43 | ␉␉case 4177: // Q to A␊ |
44 | ␉␉␉c = 7745;␊ |
45 | ␉␉␉break;␊ |
46 | ␉␉case 7745: // A to Q␊ |
47 | ␉␉␉c = 4177;␊ |
48 | ␉␉␉break;␊ |
49 | ␉␉case 4471: // w to z␊ |
50 | ␉␉␉c = 11386;␊ |
51 | ␉␉␉break;␊ |
52 | ␉␉case 11386: // z to w␊ |
53 | ␉␉␉c = 4471;␊ |
54 | ␉␉␉break;␊ |
55 | ␉␉case 4439: // W to Z␊ |
56 | ␉␉␉c = 11354;␊ |
57 | ␉␉␉break;␊ |
58 | ␉␉case 11354: // Z to W␊ |
59 | ␉␉␉c = 4439;␊ |
60 | ␉␉␉break;␉␉␉␊ |
61 | ␉␉case 10043: // ; to m␊ |
62 | ␉␉␉c = 12909;␊ |
63 | ␉␉␉break;␊ |
64 | ␉␉case 10042: // : to M␊ |
65 | ␉␉␉c = 12877;␊ |
66 | ␉␉␉break;␊ |
67 | ␉␉case 12909: // m to ,␊ |
68 | ␉␉␉c = 13100;␊ |
69 | ␉␉␉break;␉␉␊ |
70 | ␉␉case 12877: // M to ? ␊ |
71 | ␉␉␉c = 13631;␊ |
72 | ␉␉␉break;␉␉␉␊ |
73 | ␉␉case 13100: // , to ;␊ |
74 | ␉␉␉c = 10043;␊ |
75 | ␉␉␉break;␉␉␉␊ |
76 | ␉␉case 13116: // < to .␊ |
77 | ␉␉␉c = 13358;␊ |
78 | ␉␉␉break;␊ |
79 | ␉␉case 13374: // > to /␊ |
80 | ␉␉␉c = 13615;␊ |
81 | ␉␉␉break;␊ |
82 | ␉␉case 13358: // . to :␊ |
83 | ␉␉␉c = 10042;␊ |
84 | ␉␉␉break;␊ |
85 | ␉␉case 22108: // \ to <␊ |
86 | ␉␉␉c = 13116;␊ |
87 | ␉␉␉break;␉␉␉␊ |
88 | ␉␉case 22140: // | to >␊ |
89 | ␉␉␉c = 13374;␊ |
90 | ␉␉␉break;␉␉␉␊ |
91 | ␉␉case 13615: // / to !␊ |
92 | ␉␉␉c = 545;␊ |
93 | ␉␉␉break;␊ |
94 | ␉␉case 10279: // ' to % ␊ |
95 | ␉␉␉c = 1573;␊ |
96 | ␉␉␉break;␊ |
97 | ␉␉case 10274: // " to $ ␊ |
98 | ␉␉␉c = 1316;␊ |
99 | ␉␉␉break;␊ |
100 | ␉␉␉␊ |
101 | ␉␉␉/* switch for main keyboard (num) */␊ |
102 | ␉␉case 10592: // to #␊ |
103 | ␉␉␉c = 1059;␊ |
104 | ␉␉␉break;␉␉␉␊ |
105 | ␉␉case 10622: // to @␊ |
106 | ␉␉␉c = 832;␊ |
107 | ␉␉␉break;␉␉␉␊ |
108 | ␉␉case 545: // ! to &␊ |
109 | ␉␉␉c = 2086;␊ |
110 | ␉␉␉break;␉␉␉␊ |
111 | ␉␉case 832: // @ to ~␊ |
112 | ␉␉␉c = 10622;␊ |
113 | ␉␉␉break;␊ |
114 | ␉␉case 1059: // # to "␊ |
115 | ␉␉␉c = 10274;␊ |
116 | ␉␉␉break;␉␉␉␊ |
117 | ␉␉case 1316: // $ to '␊ |
118 | ␉␉␉c = 10279;␊ |
119 | ␉␉␉break;␉␉␉␊ |
120 | ␉␉case 1573: // % to (␊ |
121 | ␉␉␉c = 2600;␊ |
122 | ␉␉␉break;␊ |
123 | ␉␉case 1886: // ^ to -␊ |
124 | ␉␉␉c = 3117;␊ |
125 | ␉␉␉break;␉␉␉␊ |
126 | ␉␉case 2086: // & to ยด␊ |
127 | ␉␉␉c = 10592;␊ |
128 | ␉␉␉break;␉␉␉␊ |
129 | ␉␉case 2346: // * to _␊ |
130 | ␉␉␉c = 3167;␊ |
131 | ␉␉␉break;␊ |
132 | ␉␉case 2600: // ( to ^␊ |
133 | ␉␉␉c = 1886;␊ |
134 | ␉␉␉break;␊ |
135 | ␉␉case 2857: // ) to @␊ |
136 | ␉␉␉c = 832;␊ |
137 | ␉␉␉break;␉␉␉␊ |
138 | ␉␉case 3117: // - to )␊ |
139 | ␉␉␉c = 2857;␊ |
140 | ␉␉␉break;␊ |
141 | ␉␉case 3167: // _ to ]␊ |
142 | ␉␉␉c = 7005;␊ |
143 | ␉␉␉break;␉␉␉␊ |
144 | ␉␉case 3389: // = to +␊ |
145 | ␉␉␉c = 3371;␊ |
146 | ␉␉␉break;␉␉␉␊ |
147 | ␉␉case 3371: // + to =␊ |
148 | ␉␉␉c = 3389;␊ |
149 | ␉␉␉break;␊ |
150 | ␉␉␉␊ |
151 | ␉␉␉/* switch for main keyboard (num) with alt pressed */␊ |
152 | ␉␉case 30720: // to & ␊ |
153 | ␉␉␉c = 2086;␊ |
154 | ␉␉␉break;␊ |
155 | ␉␉case 30976: // to ~ ␊ |
156 | ␉␉␉c = 10622;␊ |
157 | ␉␉␉break;␊ |
158 | ␉␉case 31232: // to #␊ |
159 | ␉␉␉c = 1059;␊ |
160 | ␉␉␉break;␉␉␉␊ |
161 | ␉␉case 31488: ␊ |
162 | ␉␉␉c = 6779;␊ |
163 | ␉␉␉break;␊ |
164 | ␉␉case 31744: ␊ |
165 | ␉␉␉c = 6747;␊ |
166 | ␉␉␉break;␊ |
167 | ␉␉case 32000: // to |␊ |
168 | ␉␉␉c = 11132;␊ |
169 | ␉␉␉break;␊ |
170 | ␉␉case 32256: ␊ |
171 | ␉␉␉c = 10592;␊ |
172 | ␉␉␉break;␉␉␉␊ |
173 | ␉␉case 32512: ␊ |
174 | ␉␉␉c = 11100;␊ |
175 | ␉␉␉break;␊ |
176 | ␉␉case 32768: ␊ |
177 | ␉␉␉c = 1886;␊ |
178 | ␉␉␉break;␊ |
179 | ␉␉case 33024:␊ |
180 | ␉␉␉c = 832;␊ |
181 | ␉␉␉break;␊ |
182 | ␉␉case 33280: // to {␊ |
183 | ␉␉␉c = 7005;␊ |
184 | ␉␉␉break;␉␉␉␊ |
185 | ␉␉case 33536: // to }␊ |
186 | ␉␉␉c = 7037;␊ |
187 | ␉␉␉break;␉␉␊ |
188 | ␉␉␉␊ |
189 | ␉␉default:␉␉␉␊ |
190 | ␉␉␉break;␊ |
191 | ␉}␊ |
192 | ␉return c;␊ |
193 | }␊ |
194 | ␊ |
195 | static char *map_kb_type = NULL;␉␊ |
196 | static TagPtr match_map = NULL;␊ |
197 | ␊ |
198 | void Keymapper_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
199 | {␊ |
200 | ␉int *ret = (int *)arg1;␊ |
201 | ␉int c = *(int *)ret;␊ |
202 | ␉␊ |
203 | ␉␊ |
204 | ␉if (match_map == NULL)␉␉␉␉␊ |
205 | ␉␉match_map = XMLGetProperty(bootInfo->bootConfig.dictionary, (const char*)"KeyboardMap");␊ |
206 | ␉␊ |
207 | ␉if (match_map)␊ |
208 | ␉{␊ |
209 | ␉␉char *kMatchkey = 0; ␊ |
210 | ␉␉sprintf(kMatchkey, "%d",c);␊ |
211 | ␉␉TagPtr match_key;␊ |
212 | ␉␉if ((match_key = XMLGetProperty(match_map, (const char*)kMatchkey)))␊ |
213 | ␉␉{␊ |
214 | ␉␉␉kMatchkey = XMLCastString(match_key);␊ |
215 | ␉␉␉c = strtoul((const char *)kMatchkey, NULL,10);␉␉␊ |
216 | ␉␉␉if (c) goto out;␊ |
217 | ␉␉}␊ |
218 | ␉}␊ |
219 | ␉␊ |
220 | ␉if (map_kb_type == NULL)␊ |
221 | ␉{␉␉␊ |
222 | ␉␉TagPtr match_type;␊ |
223 | ␉␉if ((match_type = XMLGetProperty(bootInfo->bootConfig.dictionary, (const char*)"KeyboardType")))␊ |
224 | ␉␉␉map_kb_type = XMLCastString(match_type);␊ |
225 | ␉␉else ␊ |
226 | ␉␉␉map_kb_type = "NONE"; // Default to QWERTY␊ |
227 | ␉}␊ |
228 | ␉␊ |
229 | ␉if (strcmp(map_kb_type, "AZERTY") == 0)␉␉␊ |
230 | c = AZERTY_switch(c);␊ |
231 | ␉␊ |
232 | out:␊ |
233 | ␉␊ |
234 | ␉*ret = c;␊ |
235 | ␉␊ |
236 | }␊ |
237 | ␊ |
238 | void Keymapper_start()␊ |
239 | {␊ |
240 | ␉bool enable = true;␊ |
241 | ␉getBoolForKey(kEnableKeyMap, &enable, &bootInfo->bootConfig) ;␊ |
242 | ␉␊ |
243 | ␉if (enable)␊ |
244 | ␉{␊ |
245 | ␉␉//register_hook_callback("Keymapper", &Keymapper_hook);␊ |
246 | ␉␉replace_function("_getc", &Keymapper_getc);␊ |
247 | ␉}␊ |
248 | } |