Revision a528b80c keymaps.c
b/keymaps.c | ||
---|---|---|
32 | 32 |
return 0; |
33 | 33 |
} |
34 | 34 |
|
35 |
struct key_range { |
|
36 |
int start; |
|
37 |
int end; |
|
38 |
struct key_range *next; |
|
39 |
}; |
|
40 |
|
|
35 | 41 |
#define MAX_NORMAL_KEYCODE 512 |
36 | 42 |
#define MAX_EXTRA_COUNT 256 |
37 | 43 |
typedef struct { |
... | ... | |
41 | 47 |
uint16_t keycode; |
42 | 48 |
} keysym2keycode_extra[MAX_EXTRA_COUNT]; |
43 | 49 |
int extra_count; |
50 |
struct key_range *keypad_range; |
|
51 |
struct key_range *numlock_range; |
|
44 | 52 |
} kbd_layout_t; |
45 | 53 |
|
54 |
static void add_to_key_range(struct key_range **krp, int code) { |
|
55 |
struct key_range *kr; |
|
56 |
for (kr = *krp; kr; kr = kr->next) { |
|
57 |
if (code >= kr->start && code <= kr->end) |
|
58 |
break; |
|
59 |
if (code == kr->start - 1) { |
|
60 |
kr->start--; |
|
61 |
break; |
|
62 |
} |
|
63 |
if (code == kr->end + 1) { |
|
64 |
kr->end++; |
|
65 |
break; |
|
66 |
} |
|
67 |
} |
|
68 |
if (kr == NULL) { |
|
69 |
kr = qemu_mallocz(sizeof(*kr)); |
|
70 |
if (kr) { |
|
71 |
kr->start = kr->end = code; |
|
72 |
kr->next = *krp; |
|
73 |
*krp = kr; |
|
74 |
} |
|
75 |
} |
|
76 |
} |
|
77 |
|
|
46 | 78 |
static kbd_layout_t *parse_keyboard_layout(const char *language, |
47 | 79 |
kbd_layout_t * k) |
48 | 80 |
{ |
... | ... | |
87 | 119 |
// fprintf(stderr, "Warning: unknown keysym %s\n", line); |
88 | 120 |
} else { |
89 | 121 |
const char *rest = end_of_keysym + 1; |
90 |
int keycode = strtol(rest, NULL, 0); |
|
122 |
char *rest2; |
|
123 |
int keycode = strtol(rest, &rest2, 0); |
|
124 |
|
|
125 |
if (rest && strstr(rest, "numlock")) { |
|
126 |
add_to_key_range(&k->keypad_range, keycode); |
|
127 |
add_to_key_range(&k->numlock_range, keysym); |
|
128 |
//fprintf(stderr, "keypad keysym %04x keycode %d\n", keysym, keycode); |
|
129 |
} |
|
130 |
|
|
91 | 131 |
/* if(keycode&0x80) |
92 | 132 |
keycode=(keycode<<8)^0x80e0; */ |
93 | 133 |
if (keysym < MAX_NORMAL_KEYCODE) { |
... | ... | |
143 | 183 |
} |
144 | 184 |
return 0; |
145 | 185 |
} |
186 |
|
|
187 |
static inline int keycode_is_keypad(void *kbd_layout, int keycode) |
|
188 |
{ |
|
189 |
kbd_layout_t *k = kbd_layout; |
|
190 |
struct key_range *kr; |
|
191 |
|
|
192 |
for (kr = k->keypad_range; kr; kr = kr->next) |
|
193 |
if (keycode >= kr->start && keycode <= kr->end) |
|
194 |
return 1; |
|
195 |
return 0; |
|
196 |
} |
|
197 |
|
|
198 |
static inline int keysym_is_numlock(void *kbd_layout, int keysym) |
|
199 |
{ |
|
200 |
kbd_layout_t *k = kbd_layout; |
|
201 |
struct key_range *kr; |
|
202 |
|
|
203 |
for (kr = k->numlock_range; kr; kr = kr->next) |
|
204 |
if (keysym >= kr->start && keysym <= kr->end) |
|
205 |
return 1; |
|
206 |
return 0; |
|
207 |
} |
Also available in: Unified diff