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