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