| 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 | #include "Keylayout.h"␊ |
| 15 | ␊ |
| 16 | #define kEnableKeyMap "EnableKeyMapper"␊ |
| 17 | static int AZERTY_switch(int c);␊ |
| 18 | void Keymapper_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
| 19 | int Keymapper_getc();␊ |
| 20 | ␊ |
| 21 | int Keymapper_getc()␊ |
| 22 | {␉␊ |
| 23 | int c = bgetc();␉␉␊ |
| 24 | ␉␊ |
| 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 | // Faster method and no need to (re-)compile the map, everything is done with xml (i have a keymap maker made in cocoa and with a gui that i have don't released yet)␊ |
| 199 | void Keymapper_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
| 200 | {␊ |
| 201 | ␉int *ret = (int *)arg1;␊ |
| 202 | ␉int c = *(int *)ret;␊ |
| 203 | ␉␊ |
| 204 | ␉// Check for xml map in the config file␊ |
| 205 | ␉if (match_map == NULL)␉␉␉␉␊ |
| 206 | ␉␉match_map = XMLGetProperty(bootInfo->bootConfig.dictionary, (const char*)"KeyboardMap");␊ |
| 207 | ␉␊ |
| 208 | ␉if (match_map)␊ |
| 209 | ␉{␊ |
| 210 | ␉␉char *kMatchkey = 0; ␊ |
| 211 | ␉␉sprintf(kMatchkey, "%d",c);␊ |
| 212 | ␉␉TagPtr match_key;␊ |
| 213 | ␉␉if ((match_key = XMLGetProperty(match_map, (const char*)kMatchkey)))␊ |
| 214 | ␉␉{␊ |
| 215 | ␉␉␉kMatchkey = XMLCastString(match_key);␊ |
| 216 | ␉␉␉c = strtoul((const char *)kMatchkey, NULL,10);␉␉␊ |
| 217 | ␉␉␉if (c) goto out;␊ |
| 218 | ␉␉}␊ |
| 219 | ␉}␊ |
| 220 | ␉␊ |
| 221 | ␉// Check for built-in map␊ |
| 222 | ␉if (map_kb_type == NULL)␊ |
| 223 | ␉{␉␉␊ |
| 224 | ␉␉TagPtr match_type;␊ |
| 225 | ␉␉if ((match_type = XMLGetProperty(bootInfo->bootConfig.dictionary, (const char*)"KeyboardType")))␊ |
| 226 | ␉␉␉map_kb_type = XMLCastString(match_type);␊ |
| 227 | ␉␉else ␊ |
| 228 | ␉␉␉map_kb_type = "NONE"; // Default to QWERTY␊ |
| 229 | ␉}␊ |
| 230 | ␉␊ |
| 231 | ␉if (strcmp(map_kb_type, "AZERTY") == 0)␉␉␊ |
| 232 | c = AZERTY_switch(c);␊ |
| 233 | ␉␊ |
| 234 | out:␊ |
| 235 | ␉␊ |
| 236 | ␉*ret = c;␊ |
| 237 | ␉␊ |
| 238 | }␊ |
| 239 | ␊ |
| 240 | void Keymapper_start()␊ |
| 241 | {␊ |
| 242 | #ifdef TRUNK␊ |
| 243 | #define Config chameleonConfig␊ |
| 244 | #else␊ |
| 245 | #define Config bootConfig␊ |
| 246 | #endif␊ |
| 247 | ␉␊ |
| 248 | ␉bool enable = true;␊ |
| 249 | ␉getBoolForKey(kEnableKeyMap, &enable, &bootInfo->Config) ;␊ |
| 250 | ␉␊ |
| 251 | ␉if (enable)␊ |
| 252 | ␉{␊ |
| 253 | ␉␉if (Keylayout_real_start()) ␊ |
| 254 | ␉␉{␊ |
| 255 | ␉␉␉return;␊ |
| 256 | ␉␉} ␊ |
| 257 | ␊ |
| 258 | #ifdef TRUNK␉␊ |
| 259 | ␉␉if (!replace_function("_getchar", &Keymapper_getc)) ␊ |
| 260 | ␉␉{␊ |
| 261 | ␉␉␉printf("no function getchar() to replace. Keymapper will not be used ! \n");␊ |
| 262 | ␉␉␉␉␉␉␊ |
| 263 | ␉␉}␉␉␊ |
| 264 | #else␊ |
| 265 | ␉␉if (replace_function("_getc", &Keymapper_getc) != EFI_SUCCESS) ␊ |
| 266 | ␉␉{␊ |
| 267 | ␉␉␉printf("no function getc() to replace. Keymapper will not be used ! \n");␊ |
| 268 | ␉␉}␊ |
| 269 | #endif␊ |
| 270 | ␉␉␊ |
| 271 | ␉}␊ |
| 272 | } |