Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/Keymapper/Keylayout.c

1/*
2 * Keymapper.c
3 * Chameleon
4 *
5 * Created by JrCs on 28/08/11.
6 * Copyright 2011. All rights reserved.
7 *
8 */
9
10#include "libsaio.h"
11#include "term.h"
12#include "modules.h"
13#include "Keylayout.h"
14#include "bootstruct.h"
15
16#ifndef DEBUG_KLAYOUT
17#define DEBUG_KLAYOUT 0
18#endif
19
20#if DEBUG_KLAYOUT
21#define DBG(x...)printf(x)
22#else
23#define DBG(x...)
24#endif
25
26#define kKeyboardLayout "KeyboardLayout"
27
28struct keyboard_layout *current_layout = NULL;
29int getchar_replacement(void);
30
31int getchar_replacement(void) {
32int code = bgetc();
33int status = readKeyboardShiftFlags();
34uint8_t scancode = code >> 8;
35
36// Special scancode sent when alt + some keys are pressed
37if (scancode >= 0x78 && scancode <= 0x83)
38scancode -= 0x76;
39
40if (scancode < KEYBOARD_MAP_SIZE && !(status & (STATUS_LCTRL| STATUS_RCTRL))) {
41int key;
42if ((status & (STATUS_LALT|STATUS_RALT)) &&
43(status & (STATUS_LSHIFT|STATUS_RSHIFT|STATUS_CAPS))) {
44key=current_layout->keyboard_map_shift_alt[scancode];
45}
46else if (status & (STATUS_LSHIFT|STATUS_RSHIFT|STATUS_CAPS))
47key=current_layout->keyboard_map_shift[scancode];
48else if (status & (STATUS_LALT|STATUS_RALT))
49key=current_layout->keyboard_map_alt[scancode];
50else
51key=current_layout->keyboard_map[scancode];
52
53if (key != 0) // do the mapping
54code = key;
55}
56
57if (ASCII_KEY(code) != 0) // if ascii not null return it
58code = ASCII_KEY(code);
59
60//printf("Code: %04x\n",code);
61return (code);
62}
63
64static uint32_t load_keyboard_layout_file(const char *filename) {
65int fd;
66char magic[KEYBOARD_LAYOUTS_MAGIC_SIZE];
67uint32_t version;
68
69#if UNUSED
70if ((fd = open_bvdev("bt(0,0)", filename, 0)) < 0) {
71#else
72if ((fd = open_bvdev("bt(0,0)", filename)) < 0) {
73#endif
74goto fail; // fail
75}
76
77if (read(fd, magic, sizeof(magic)) != sizeof(magic)) {
78printf("Can't find magic in keyboard layout file: %s\n", filename);
79goto fail;
80}
81
82if (memcmp (magic, KEYBOARD_LAYOUTS_MAGIC, KEYBOARD_LAYOUTS_MAGIC_SIZE) != 0) {
83printf("Invalid magic code in keyboard layout file: %s\n", filename);
84goto fail;
85 }
86
87if (read(fd, (char*) &version, sizeof(version)) != sizeof(version)) {
88printf("Can't get version of keyboard layout file: %s\n", filename);
89goto fail;
90}
91
92if (version != KEYBOARD_LAYOUTS_VERSION) {
93verbose("Bad version for keyboard layout file %s expected v%d found v%d\n",
94 filename, KEYBOARD_LAYOUTS_VERSION, version);
95goto fail;
96}
97
98if (current_layout)
99free(current_layout);
100
101current_layout = malloc(sizeof(*current_layout));
102if (!current_layout)
103goto fail;
104
105b_lseek(fd, KEYBOARD_LAYOUTS_MAP_OFFSET, 0);
106
107if (read(fd, (char*) current_layout, sizeof(*current_layout)) != sizeof(*current_layout)) {
108printf("Wrong keyboard layout file %s size\n", filename);
109goto fail;
110}
111
112close(fd);
113
114return 1;
115
116 fail:
117
118if (current_layout) {
119free(current_layout);
120current_layout = NULL;
121}
122return 0;
123}
124
125uint32_t Keylayout_real_start(void)
126{
127char layoutPath[512];
128const char*val;
129intlen;
130
131if (getValueForKey("KeyLayout", &val, &len, DEFAULT_BOOT_CONFIG))
132{
133sprintf(layoutPath, "/Extra/Keymaps/%s", val);
134// Add the extension if needed
135if (len <= 4 || strcmp(val+len-4,".lyt") != 0)
136strlcat(layoutPath, ".lyt", sizeof(layoutPath));
137
138if (!load_keyboard_layout_file(layoutPath))
139{
140DBG("Can't load %s keyboard layout file. Keylayout will not be used !\n",
141 layoutPath);
142return 0;
143}
144
145
146if (replace_system_function("_getc", &getchar_replacement) != EFI_SUCCESS )
147{
148printf("no function getc() to replace. Keylayout will not be used ! \n");
149return 0;
150}
151
152return 1;
153
154}
155return 0;
156}
157
158void Keylayout_start(void);
159void Keylayout_start(void)
160{
161Keylayout_real_start();
162}

Archive Download this file

Revision: 1913