… | |
… | |
11 | //////////////////////////////////////////////////////////////////////////////// |
11 | //////////////////////////////////////////////////////////////////////////////// |
12 | // default keycode translation map and keyevent handlers |
12 | // default keycode translation map and keyevent handlers |
13 | |
13 | |
14 | keysym_t keyboard_manager::stock_keymap[] = { |
14 | keysym_t keyboard_manager::stock_keymap[] = { |
15 | /* examples */ |
15 | /* examples */ |
16 | /* keysym, state, range, handler, str */ |
16 | /* keysym, state, range, handler, str */ |
17 | //{XK_ISO_Left_Tab, 0, 1, NORMAL, "\033[Z"}, |
17 | //{XK_ISO_Left_Tab, 0, 1, keysym_t::NORMAL, "\033[Z"}, |
18 | //{ 'a', 0, 26, RANGE_META8, "a" "%c"}, |
18 | //{ 'a', 0, 26, keysym_t::RANGE_META8, "a" "%c"}, |
19 | //{ 'a', ControlMask, 26, RANGE_META8, "" "%c"}, |
19 | //{ 'a', ControlMask, 26, keysym_t::RANGE_META8, "" "%c"}, |
20 | //{ XK_Left, 0, 4, LIST, "DACBZ" "\033[Z"}, |
20 | //{ XK_Left, 0, 4, keysym_t::LIST, ".\033[.DACB."}, |
21 | //{ XK_Left, ShiftMask, 4, LIST, "dacbZ" "\033[Z"}, |
21 | //{ XK_Left, ShiftMask, 4, keysym_t::LIST, ".\033[.dacb."}, |
22 | //{ XK_Left, ControlMask, 4, LIST, "dacbZ" "\033OZ"}, |
22 | //{ XK_Left, ControlMask, 4, keysym_t::LIST, ".\033O.dacb."}, |
23 | //{ XK_Tab, ControlMask, 1, NORMAL, "\033<C-Tab>"}, |
23 | //{ XK_Tab, ControlMask, 1, keysym_t::NORMAL, "\033<C-Tab>"}, |
24 | //{ XK_apostrophe, ControlMask, 1, NORMAL, "\033<C-'>"}, |
24 | //{ XK_apostrophe, ControlMask, 1, keysym_t::NORMAL, "\033<C-'>"}, |
25 | //{ XK_slash, ControlMask, 1, NORMAL, "\033<C-/>"}, |
25 | //{ XK_slash, ControlMask, 1, keysym_t::NORMAL, "\033<C-/>"}, |
26 | //{ XK_semicolon, ControlMask, 1, NORMAL, "\033<C-;>"}, |
26 | //{ XK_semicolon, ControlMask, 1, keysym_t::NORMAL, "\033<C-;>"}, |
27 | //{ XK_grave, ControlMask, 1, NORMAL, "\033<C-`>"}, |
27 | //{ XK_grave, ControlMask, 1, keysym_t::NORMAL, "\033<C-`>"}, |
28 | //{ XK_comma, ControlMask, 1, NORMAL, "\033<C-\054>"}, |
28 | //{ XK_comma, ControlMask, 1, keysym_t::NORMAL, "\033<C-\054>"}, |
29 | //{ XK_Return, ControlMask, 1, NORMAL, "\033<C-Return>"}, |
29 | //{ XK_Return, ControlMask, 1, keysym_t::NORMAL, "\033<C-Return>"}, |
30 | //{ XK_Return, ShiftMask, 1, NORMAL, "\033<S-Return>"}, |
30 | //{ XK_Return, ShiftMask, 1, keysym_t::NORMAL, "\033<S-Return>"}, |
31 | //{ ' ', ShiftMask, 1, NORMAL, "\033<S-Space>"}, |
31 | //{ ' ', ShiftMask, 1, keysym_t::NORMAL, "\033<S-Space>"}, |
32 | //{ '.', ControlMask, 1, NORMAL, "\033<C-.>"}, |
32 | //{ '.', ControlMask, 1, keysym_t::NORMAL, "\033<C-.>"}, |
33 | //{ '0', ControlMask, 10, RANGE, "0" "\033<C-%c>"}, |
33 | //{ '0', ControlMask, 10, keysym_t::RANGE, "0" "\033<C-%c>"}, |
34 | //{ '0', MetaMask|ControlMask, 10, RANGE, "0" "\033<M-C-%c>"}, |
34 | //{ '0', MetaMask|ControlMask, 10, keysym_t::RANGE, "0" "\033<M-C-%c>"}, |
35 | //{ 'a', MetaMask|ControlMask, 26, RANGE, "a" "\033<M-C-%c>"}, |
35 | //{ 'a', MetaMask|ControlMask, 26, keysym_t::RANGE, "a" "\033<M-C-%c>"}, |
36 | }; |
36 | }; |
37 | |
37 | |
38 | static void |
38 | static void |
39 | output_string (rxvt_term *rt, const char *str) |
39 | output_string (rxvt_term *rt, const char *str) |
40 | { |
40 | { |
41 | if (strncmp (str, "proto:", 6) == 0) |
41 | if (strncmp (str, "command:", 8) == 0) |
42 | rt->cmd_write ((unsigned char *)str + 6, strlen (str) - 6); |
42 | rt->cmd_write ((unsigned char *)str + 8, strlen (str) - 8); |
43 | else |
43 | else |
44 | rt->tt_write ((unsigned char *)str, strlen (str)); |
44 | rt->tt_write ((unsigned char *)str, strlen (str)); |
45 | } |
45 | } |
46 | |
46 | |
47 | static void |
47 | static void |
… | |
… | |
366 | index += hash_budget_size [i - 1]; |
366 | index += hash_budget_size [i - 1]; |
367 | hash[i] = (hash_budget_size [i] ? index : hash [i - 1]); |
367 | hash[i] = (hash_budget_size [i] ? index : hash [i - 1]); |
368 | } |
368 | } |
369 | |
369 | |
370 | // and allocate just enough space |
370 | // and allocate just enough space |
371 | //sorted_keymap.reserve (hash[i - 1] + hash_budget_size[i - 1]); |
|
|
372 | sorted_keymap.insert (sorted_keymap.begin (), index + hash_budget_size [i - 1], 0); |
371 | sorted_keymap.insert (sorted_keymap.begin (), index + hash_budget_size [i - 1], 0); |
373 | |
372 | |
374 | // fill in sorted_keymap |
373 | // fill in sorted_keymap |
375 | // it is sorted in each budget |
374 | // it is sorted in each budget |
376 | for (i = 0; i < keymap.size (); ++i) |
375 | for (i = 0; i < keymap.size (); ++i) |
… | |
… | |
423 | int index = find_keysym (a->keysym + j, a->state); |
422 | int index = find_keysym (a->keysym + j, a->state); |
424 | |
423 | |
425 | assert (index >= 0); |
424 | assert (index >= 0); |
426 | keysym_t *b = keymap [index]; |
425 | keysym_t *b = keymap [index]; |
427 | assert (i == (signed) index || // the normally expected result |
426 | assert (i == (signed) index || // the normally expected result |
428 | (a->keysym + j) >= b->keysym && (a->keysym + j) <= (b->keysym + b->range) && compare_priority (a, b) <= 0); // is effectively the same |
427 | (a->keysym + j) >= b->keysym && (a->keysym + j) <= (b->keysym + b->range) && compare_priority (a, b) <= 0); // is effectively the same or a closer match |
429 | } |
428 | } |
430 | } |
429 | } |
431 | #endif |
430 | #endif |
432 | } |
431 | } |
433 | |
432 | |
… | |
… | |
443 | |
442 | |
444 | if (key->keysym <= keysym && key->keysym + key->range > keysym |
443 | if (key->keysym <= keysym && key->keysym + key->range > keysym |
445 | // match only the specified bits in state and ignore others |
444 | // match only the specified bits in state and ignore others |
446 | && (key->state & state) == key->state) |
445 | && (key->state & state) == key->state) |
447 | return index; |
446 | return index; |
448 | else if (key->keysym > keysym && key->range == 1) |
447 | else if ((key->keysym & KEYSYM_HASH_MASK) > hashkey && key->range == 1) |
449 | return -1; |
448 | return -1; |
450 | } |
449 | } |
451 | |
450 | |
452 | return -1; |
451 | return -1; |
453 | } |
452 | } |