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