Subversion Repositories HelenOS

Rev

Rev 3939 | Rev 4061 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3939 Rev 3944
Line 45... Line 45...
45
static void parse_ds_e1(int scancode);
45
static void parse_ds_e1(int scancode);
46
static void parse_ds_e1a(int scancode);
46
static void parse_ds_e1a(int scancode);
47
static void parse_ds_e1b(int scancode);
47
static void parse_ds_e1b(int scancode);
48
static void parse_ds_e1c(int scancode);
48
static void parse_ds_e1c(int scancode);
49
 
49
 
50
static void parse_leaf(int scancode, int *map, size_t map_length);
50
static void parse_leaf(int scancode, int (*map)[2], size_t map_length);
51
 
51
 
52
enum dec_state {
52
enum dec_state {
53
    ds_start,
53
    ds_start,
54
    ds_e,
54
    ds_e,
55
    ds_e1,
55
    ds_e1,
56
    ds_e1a,
56
    ds_e1a,
57
    ds_e1b,
57
    ds_e1b,
58
    ds_e1c
58
    ds_e1c
59
};
59
};
60
 
60
 
61
static int map_start[] = {
61
static int map_start[][2] = {
62
 
62
 
63
    [0x60] = KC_BACKTICK,
63
    [0x60] = { 0, KC_BACKTICK },
64
 
64
 
65
    [0x31] = KC_1,
65
    [0x31] = { 0, KC_1 },
66
    [0x32] = KC_2,
66
    [0x32] = { 0, KC_2 },
67
    [0x33] = KC_3,
67
    [0x33] = { 0, KC_3 },
68
    [0x34] = KC_4,
68
    [0x34] = { 0, KC_4 },
69
    [0x35] = KC_5,
69
    [0x35] = { 0, KC_5 },
70
    [0x36] = KC_6,
70
    [0x36] = { 0, KC_6 },
71
    [0x37] = KC_7,
71
    [0x37] = { 0, KC_7 },
72
    [0x38] = KC_8,
72
    [0x38] = { 0, KC_8 },
73
    [0x39] = KC_9,
73
    [0x39] = { 0, KC_9 },
74
    [0x30] = KC_0,
74
    [0x30] = { 0, KC_0 },
75
 
75
 
76
    [0x2d] = KC_MINUS,
76
    [0x2d] = { 0, KC_MINUS },
77
    [0x3d] = KC_EQUALS,
77
    [0x3d] = { 0, KC_EQUALS },
78
    [0x08] = KC_BACKSPACE,
78
    [0x08] = { 0, KC_BACKSPACE },
79
 
79
 
80
    [0x0f] = KC_TAB,
80
    [0x0f] = { 0, KC_TAB },
81
 
81
 
82
    [0x71] = KC_Q,
82
    [0x71] = { 0, KC_Q },
83
    [0x77] = KC_W,
83
    [0x77] = { 0, KC_W },
84
    [0x65] = KC_E,
84
    [0x65] = { 0, KC_E },
85
    [0x72] = KC_R,
85
    [0x72] = { 0, KC_R },
86
    [0x74] = KC_T,
86
    [0x74] = { 0, KC_T },
87
    [0x79] = KC_Y,
87
    [0x79] = { 0, KC_Y },
88
    [0x75] = KC_U,
88
    [0x75] = { 0, KC_U },
89
    [0x69] = KC_I,
89
    [0x69] = { 0, KC_I },
90
    [0x6f] = KC_O,
90
    [0x6f] = { 0, KC_O },
91
    [0x70] = KC_P,
91
    [0x70] = { 0, KC_P },
92
 
92
 
93
    [0x5b] = KC_LBRACKET,
93
    [0x5b] = { 0, KC_LBRACKET },
94
    [0x5d] = KC_RBRACKET,
94
    [0x5d] = { 0, KC_RBRACKET },
95
 
-
 
96
//  [0x3a] = KC_CAPS_LOCK,
-
 
97
 
95
 
98
    [0x61] = KC_A,
96
    [0x61] = { 0, KC_A },
99
    [0x73] = KC_S,
97
    [0x73] = { 0, KC_S },
100
    [0x64] = KC_D,
98
    [0x64] = { 0, KC_D },
101
    [0x66] = KC_F,
99
    [0x66] = { 0, KC_F },
102
    [0x67] = KC_G,
100
    [0x67] = { 0, KC_G },
103
    [0x68] = KC_H,
101
    [0x68] = { 0, KC_H },
104
    [0x6a] = KC_J,
102
    [0x6a] = { 0, KC_J },
105
    [0x6b] = KC_K,
103
    [0x6b] = { 0, KC_K },
106
    [0x6c] = KC_L,
104
    [0x6c] = { 0, KC_L },
107
 
105
 
108
    [0x3b] = KC_SEMICOLON,
106
    [0x3b] = { 0, KC_SEMICOLON },
109
    [0x27] = KC_QUOTE,
107
    [0x27] = { 0, KC_QUOTE },
110
    [0x5c] = KC_BACKSLASH,
108
    [0x5c] = { 0, KC_BACKSLASH },
111
 
-
 
112
//  [0x2a] = KC_LSHIFT,
-
 
113
 
109
 
114
    [0x7a] = KC_Z,
110
    [0x7a] = { 0, KC_Z },
115
    [0x78] = KC_X,
111
    [0x78] = { 0, KC_X },
116
    [0x63] = KC_C,
112
    [0x63] = { 0, KC_C },
117
    [0x76] = KC_V,
113
    [0x76] = { 0, KC_V },
118
    [0x62] = KC_B,
114
    [0x62] = { 0, KC_B },
119
    [0x6e] = KC_N,
115
    [0x6e] = { 0, KC_N },
120
    [0x6d] = KC_M,
116
    [0x6d] = { 0, KC_M },
121
 
117
 
122
    [0x2c] = KC_COMMA,
118
    [0x2c] = { 0, KC_COMMA },
123
    [0x2e] = KC_PERIOD,
119
    [0x2e] = { 0, KC_PERIOD },
124
    [0x2f] = KC_SLASH,
120
    [0x2f] = { 0, KC_SLASH },
125
 
121
 
126
//  [0x36] = KC_RSHIFT,
122
    [0x20] = { 0, KC_SPACE },
127
 
123
 
128
//  [0x1d] = KC_LCTRL,
124
    [0x1b] = { 0, KC_ESCAPE },
-
 
125
 
129
//  [0x38] = KC_LALT,
126
    [0x0a] = { 0, KC_ENTER },
130
    [0x20] = KC_SPACE,
127
    [0x0d] = { 0, KC_ENTER },
-
 
128
 
-
 
129
    /* with Shift pressed */
-
 
130
 
-
 
131
    [0x7e] = { KM_LSHIFT, KC_BACKTICK },
131
 
132
 
-
 
133
    [0x21] = { KM_LSHIFT, KC_1 },
-
 
134
    [0x40] = { KM_LSHIFT, KC_2 },
-
 
135
    [0x23] = { KM_LSHIFT, KC_3 },
-
 
136
    [0x24] = { KM_LSHIFT, KC_4 },
-
 
137
    [0x25] = { KM_LSHIFT, KC_5 },
-
 
138
    [0x5e] = { KM_LSHIFT, KC_6 },
-
 
139
    [0x26] = { KM_LSHIFT, KC_7 },
-
 
140
    [0x2a] = { KM_LSHIFT, KC_8 },
-
 
141
    [0x28] = { KM_LSHIFT, KC_9 },
132
    [0x1b] = KC_ESCAPE,
142
    [0x29] = { KM_LSHIFT, KC_0 },
-
 
143
 
-
 
144
    [0x5f] = { KM_LSHIFT, KC_MINUS },
-
 
145
    [0x2b] = { KM_LSHIFT, KC_EQUALS },
133
 
146
 
-
 
147
    [0x51] = { KM_LSHIFT, KC_Q },
-
 
148
    [0x57] = { KM_LSHIFT, KC_W },
134
    [0x0a] = KC_ENTER,
149
    [0x45] = { KM_LSHIFT, KC_E },
135
    [0x0d] = KC_ENTER
150
    [0x52] = { KM_LSHIFT, KC_R },
-
 
151
    [0x54] = { KM_LSHIFT, KC_T },
-
 
152
    [0x59] = { KM_LSHIFT, KC_Y },
-
 
153
    [0x55] = { KM_LSHIFT, KC_U },
-
 
154
    [0x49] = { KM_LSHIFT, KC_I },
-
 
155
    [0x4f] = { KM_LSHIFT, KC_O },
-
 
156
    [0x50] = { KM_LSHIFT, KC_P },
136
 
157
 
-
 
158
    [0x7b] = { KM_LSHIFT, KC_LBRACKET },
-
 
159
    [0x7d] = { KM_LSHIFT, KC_RBRACKET },
137
/*
160
 
138
    [0x1] = KC_PRNSCR,
161
    [0x41] = { KM_LSHIFT, KC_A },
-
 
162
    [0x53] = { KM_LSHIFT, KC_S },
-
 
163
    [0x44] = { KM_LSHIFT, KC_D },
-
 
164
    [0x46] = { KM_LSHIFT, KC_F },
-
 
165
    [0x47] = { KM_LSHIFT, KC_G },
-
 
166
    [0x48] = { KM_LSHIFT, KC_H },
-
 
167
    [0x4a] = { KM_LSHIFT, KC_J },
-
 
168
    [0x4b] = { KM_LSHIFT, KC_K },
-
 
169
    [0x4c] = { KM_LSHIFT, KC_L },
-
 
170
 
-
 
171
    [0x3a] = { KM_LSHIFT, KC_SEMICOLON },
-
 
172
    [0x22] = { KM_LSHIFT, KC_QUOTE },
-
 
173
    [0x7c] = { KM_LSHIFT, KC_BACKSLASH },
-
 
174
 
-
 
175
    [0x5a] = { KM_LSHIFT, KC_Z },
-
 
176
    [0x58] = { KM_LSHIFT, KC_X },
139
    [0x1] = KC_SCROLL_LOCK,
177
    [0x43] = { KM_LSHIFT, KC_C },
-
 
178
    [0x56] = { KM_LSHIFT, KC_V },
-
 
179
    [0x42] = { KM_LSHIFT, KC_B },
-
 
180
    [0x4e] = { KM_LSHIFT, KC_N },
140
    [0x1] = KC_PAUSE,
181
    [0x4d] = { KM_LSHIFT, KC_M },
141
*/
182
 
-
 
183
    [0x3c] = { KM_LSHIFT, KC_COMMA },
-
 
184
    [0x3e] = { KM_LSHIFT, KC_PERIOD },
-
 
185
    [0x3f] = { KM_LSHIFT, KC_SLASH }
142
};
186
};
143
 
187
 
144
static int map_e1[] =
188
static int map_e1[][2] =
145
{
189
{
146
};
190
};
147
 
191
 
148
static int map_e1a[] =
192
static int map_e1a[][2] =
149
{
193
{
150
    [0x50] = KC_F1,
194
    [0x50] = { 0, KC_F1 },
151
    [0x51] = KC_F2,
195
    [0x51] = { 0, KC_F2 },
152
    [0x52] = KC_F3,
196
    [0x52] = { 0, KC_F3 },
153
    [0x53] = KC_F4,
197
    [0x53] = { 0, KC_F4 },
154
};
198
};
155
 
199
 
156
static int map_e1b[] =
200
static int map_e1b[][2] =
157
{
201
{
158
    [0x33] = KC_F5,
202
    [0x33] = { 0, KC_F5 },
159
    [0x37] = KC_F6,
203
    [0x37] = { 0, KC_F6 },
160
    [0x38] = KC_F7,
204
    [0x38] = { 0, KC_F7 },
161
    [0x39] = KC_F8,
205
    [0x39] = { 0, KC_F8 },
162
};
206
};
163
 
207
 
164
static int map_e1c[] =
208
static int map_e1c[][2] =
165
{
209
{
166
    [0x38] = KC_F9,
210
    [0x38] = { 0, KC_F9 },
167
    [0x39] = KC_F10,
211
    [0x39] = { 0, KC_F10 },
168
    [0x33] = KC_F11,
212
    [0x33] = { 0, KC_F11 },
169
    [0x34] = KC_F12,
213
    [0x34] = { 0, KC_F12 },
170
};
214
};
171
 
215
 
-
 
216
static unsigned int mods_keys[][2] = {
-
 
217
    { KM_LSHIFT, KC_LSHIFT },
-
 
218
    { 0, 0 }
-
 
219
};
172
 
220
 
173
static enum dec_state ds = ds_start;
221
static enum dec_state ds = ds_start;
174
 
222
 
175
void kbd_ctl_parse_scancode(int scancode)
223
void kbd_ctl_parse_scancode(int scancode)
176
{
224
{
Line 189... Line 237...
189
    if (scancode == 0x1b) {
237
    if (scancode == 0x1b) {
190
        ds = ds_e;
238
        ds = ds_e;
191
        return;
239
        return;
192
    }
240
    }
193
 
241
 
194
    parse_leaf(scancode, map_start, sizeof(map_start) / sizeof(int));
242
    parse_leaf(scancode, map_start, sizeof(map_start) / (2 * sizeof(int)));
195
}
243
}
196
 
244
 
197
static void parse_ds_e(int scancode)
245
static void parse_ds_e(int scancode)
198
{
246
{
199
    switch (scancode) {
247
    switch (scancode) {
Line 212... Line 260...
212
    case 0x31: ds = ds_e1b; return;
260
    case 0x31: ds = ds_e1b; return;
213
    case 0x32: ds = ds_e1c; return;
261
    case 0x32: ds = ds_e1c; return;
214
    default: ds = ds_start; break;
262
    default: ds = ds_start; break;
215
    }
263
    }
216
 
264
 
217
    parse_leaf(scancode, map_e1, sizeof(map_e1) / sizeof(int));
265
    parse_leaf(scancode, map_e1, sizeof(map_e1) / (2 * sizeof(int)));
218
}
266
}
219
 
267
 
220
static void parse_ds_e1a(int scancode)
268
static void parse_ds_e1a(int scancode)
221
{
269
{
222
    parse_leaf(scancode, map_e1a, sizeof(map_e1a) / sizeof(int));
270
    parse_leaf(scancode, map_e1a, sizeof(map_e1a) / (2 * sizeof(int)));
223
}
271
}
224
 
272
 
225
static void parse_ds_e1b(int scancode)
273
static void parse_ds_e1b(int scancode)
226
{
274
{
227
    parse_leaf(scancode, map_e1b, sizeof(map_e1b) / sizeof(int));
275
    parse_leaf(scancode, map_e1b, sizeof(map_e1b) / (2 * sizeof(int)));
228
}
276
}
229
 
277
 
230
static void parse_ds_e1c(int scancode)
278
static void parse_ds_e1c(int scancode)
231
{
279
{
232
    parse_leaf(scancode, map_e1c, sizeof(map_e1c) / sizeof(int));
280
    parse_leaf(scancode, map_e1c, sizeof(map_e1c) / (2 * sizeof(int)));
233
}
281
}
234
 
282
 
235
static void parse_leaf(int scancode, int *map, size_t map_length)
283
static void parse_leaf(int scancode, int (*map)[2], size_t map_length)
236
{
284
{
237
    unsigned int key;
285
    unsigned int key, mod;
-
 
286
    int i;
238
 
287
 
239
    ds = ds_start;
288
    ds = ds_start;
240
 
289
 
241
    if (scancode < 0 || scancode >= map_length)
290
    if (scancode < 0 || scancode >= map_length)
242
        return;
291
        return;
243
 
292
 
-
 
293
    mod = map[scancode][0];
244
    key = map[scancode];
294
    key = map[scancode][1];
-
 
295
 
-
 
296
    /* Simulate modifier pressing. */
-
 
297
    i = 0;
-
 
298
    while (mods_keys[i][0] != 0) {
-
 
299
        if (mod & mods_keys[i][0]) {
-
 
300
            kbd_push_ev(KE_PRESS, mods_keys[i][1]);
-
 
301
        }
-
 
302
        ++i;
-
 
303
    }
-
 
304
 
245
    if (key != 0)
305
    if (key != 0) {
246
        kbd_push_ev(KE_PRESS, key);
306
        kbd_push_ev(KE_PRESS, key);
-
 
307
        kbd_push_ev(KE_RELEASE, key);
247
}
308
    }
248
 
309
 
-
 
310
    /* Simulate modifier releasing. */
-
 
311
    i = 0;
-
 
312
    while (mods_keys[i][0] != 0) {
-
 
313
        if (mod & mods_keys[i][0]) {
-
 
314
            kbd_push_ev(KE_RELEASE, mods_keys[i][1]);
-
 
315
        }
-
 
316
        ++i;
-
 
317
    }
-
 
318
}
249
 
319
 
250
/**
320
/**
251
 * @}
321
 * @}
252
 */
322
 */