Changeset 5ad8661 in mainline for uspace/srv/kbd/ctl/stty.c


Ignore:
Timestamp:
2009-02-21T11:32:28Z (16 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9646159
Parents:
12b6796
Message:

Support Shift modifier in stty and gxe_fb drivers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/kbd/ctl/stty.c

    r12b6796 r5ad8661  
    4848static void parse_ds_e2b(int scancode);
    4949
    50 static void parse_leaf(int scancode, int *map, size_t map_length);
     50static void parse_leaf(int scancode, int (*map)[2], size_t map_length);
    5151
    5252enum dec_state {
     
    5959};
    6060
    61 static int map_start[] = {
    62 
    63         [0x60] = KC_BACKTICK,
    64 
    65         [0x31] = KC_1,
    66         [0x32] = KC_2,
    67         [0x33] = KC_3,
    68         [0x34] = KC_4,
    69         [0x35] = KC_5,
    70         [0x36] = KC_6,
    71         [0x37] = KC_7,
    72         [0x38] = KC_8,
    73         [0x39] = KC_9,
    74         [0x30] = KC_0,
    75 
    76         [0x2d] = KC_MINUS,
    77         [0x3d] = KC_EQUALS,
    78         [0x08] = KC_BACKSPACE,
    79 
    80         [0x0f] = KC_TAB,
    81 
    82         [0x71] = KC_Q,
    83         [0x77] = KC_W,
    84         [0x65] = KC_E,
    85         [0x72] = KC_R,
    86         [0x74] = KC_T,
    87         [0x79] = KC_Y,
    88         [0x75] = KC_U,
    89         [0x69] = KC_I,
    90         [0x6f] = KC_O,
    91         [0x70] = KC_P,
    92 
    93         [0x5b] = KC_LBRACKET,
    94         [0x5d] = KC_RBRACKET,
    95 
    96 //      [0x3a] = KC_CAPS_LOCK,
    97 
    98         [0x61] = KC_A,
    99         [0x73] = KC_S,
    100         [0x64] = KC_D,
    101         [0x66] = KC_F,
    102         [0x67] = KC_G,
    103         [0x68] = KC_H,
    104         [0x6a] = KC_J,
    105         [0x6b] = KC_K,
    106         [0x6c] = KC_L,
    107 
    108         [0x3b] = KC_SEMICOLON,
    109         [0x27] = KC_QUOTE,
    110         [0x5c] = KC_BACKSLASH,
    111 
    112 //      [0x2a] = KC_LSHIFT,
    113 
    114         [0x7a] = KC_Z,
    115         [0x78] = KC_X,
    116         [0x63] = KC_C,
    117         [0x76] = KC_V,
    118         [0x62] = KC_B,
    119         [0x6e] = KC_N,
    120         [0x6d] = KC_M,
    121 
    122         [0x2c] = KC_COMMA,
    123         [0x2e] = KC_PERIOD,
    124         [0x2f] = KC_SLASH,
    125 
    126 //      [0x36] = KC_RSHIFT,
    127 
    128 //      [0x1d] = KC_LCTRL,
    129 //      [0x38] = KC_LALT,
    130         [0x20] = KC_SPACE,
    131 
    132         [0x1b] = KC_ESCAPE,
    133 
    134         [0x0a] = KC_ENTER,
    135         [0x0d] = KC_ENTER
    136 
    137 /*
    138         [0x1] = KC_PRNSCR,
    139         [0x1] = KC_SCROLL_LOCK,
    140         [0x1] = KC_PAUSE,
    141 */
    142 };
    143 
    144 static int map_e1[] =
    145 {
    146         [0x50] = KC_F1,
    147         [0x51] = KC_F2,
    148         [0x52] = KC_F3,
    149         [0x53] = KC_F4,
    150 };
    151 
    152 static int map_e2[] =
    153 {
    154         [0x41] = KC_UP,
    155         [0x42] = KC_DOWN,
    156         [0x44] = KC_LEFT,
    157         [0x43] = KC_RIGHT,
    158 };
    159 
    160 static int map_e2a[] =
    161 {
    162         [0x35] = KC_F5,
    163         [0x37] = KC_F6,
    164         [0x38] = KC_F7,
    165         [0x39] = KC_F8,
    166 };
    167 
    168 static int map_e2b[] =
    169 {
    170         [0x30] = KC_F9,
    171         [0x31] = KC_F10,
    172         [0x32] = KC_F11,
    173         [0x33] = KC_F12,
    174 };
    175 
     61static int map_start[][2] = {
     62
     63        [0x60] = { 0, KC_BACKTICK },
     64
     65        [0x31] = { 0, KC_1 },
     66        [0x32] = { 0, KC_2 },
     67        [0x33] = { 0, KC_3 },
     68        [0x34] = { 0, KC_4 },
     69        [0x35] = { 0, KC_5 },
     70        [0x36] = { 0, KC_6 },
     71        [0x37] = { 0, KC_7 },
     72        [0x38] = { 0, KC_8 },
     73        [0x39] = { 0, KC_9 },
     74        [0x30] = { 0, KC_0 },
     75
     76        [0x2d] = { 0, KC_MINUS },
     77        [0x3d] = { 0, KC_EQUALS },
     78        [0x08] = { 0, KC_BACKSPACE },
     79
     80        [0x0f] = { 0, KC_TAB },
     81
     82        [0x71] = { 0, KC_Q },
     83        [0x77] = { 0, KC_W },
     84        [0x65] = { 0, KC_E },
     85        [0x72] = { 0, KC_R },
     86        [0x74] = { 0, KC_T },
     87        [0x79] = { 0, KC_Y },
     88        [0x75] = { 0, KC_U },
     89        [0x69] = { 0, KC_I },
     90        [0x6f] = { 0, KC_O },
     91        [0x70] = { 0, KC_P },
     92
     93        [0x5b] = { 0, KC_LBRACKET },
     94        [0x5d] = { 0, KC_RBRACKET },
     95
     96        [0x61] = { 0, KC_A },
     97        [0x73] = { 0, KC_S },
     98        [0x64] = { 0, KC_D },
     99        [0x66] = { 0, KC_F },
     100        [0x67] = { 0, KC_G },
     101        [0x68] = { 0, KC_H },
     102        [0x6a] = { 0, KC_J },
     103        [0x6b] = { 0, KC_K },
     104        [0x6c] = { 0, KC_L },
     105
     106        [0x3b] = { 0, KC_SEMICOLON },
     107        [0x27] = { 0, KC_QUOTE },
     108        [0x5c] = { 0, KC_BACKSLASH },
     109
     110        [0x7a] = { 0, KC_Z },
     111        [0x78] = { 0, KC_X },
     112        [0x63] = { 0, KC_C },
     113        [0x76] = { 0, KC_V },
     114        [0x62] = { 0, KC_B },
     115        [0x6e] = { 0, KC_N },
     116        [0x6d] = { 0, KC_M },
     117
     118        [0x2c] = { 0, KC_COMMA },
     119        [0x2e] = { 0, KC_PERIOD },
     120        [0x2f] = { 0, KC_SLASH },
     121
     122        [0x20] = { 0, KC_SPACE },
     123
     124        [0x1b] = { 0, KC_ESCAPE },
     125
     126        [0x0a] = { 0, KC_ENTER },
     127        [0x0d] = { 0, KC_ENTER },
     128
     129        /* with Shift pressed */
     130
     131        [0x7e] = { KM_LSHIFT, KC_BACKTICK },
     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 },
     142        [0x29] = { KM_LSHIFT, KC_0 },
     143
     144        [0x5f] = { KM_LSHIFT, KC_MINUS },
     145        [0x2b] = { KM_LSHIFT, KC_EQUALS },
     146
     147        [0x51] = { KM_LSHIFT, KC_Q },
     148        [0x57] = { KM_LSHIFT, KC_W },
     149        [0x45] = { KM_LSHIFT, KC_E },
     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 },
     157
     158        [0x7b] = { KM_LSHIFT, KC_LBRACKET },
     159        [0x7d] = { KM_LSHIFT, KC_RBRACKET },
     160
     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 },
     177        [0x43] = { KM_LSHIFT, KC_C },
     178        [0x56] = { KM_LSHIFT, KC_V },
     179        [0x42] = { KM_LSHIFT, KC_B },
     180        [0x4e] = { KM_LSHIFT, KC_N },
     181        [0x4d] = { KM_LSHIFT, KC_M },
     182
     183        [0x3c] = { KM_LSHIFT, KC_COMMA },
     184        [0x3e] = { KM_LSHIFT, KC_PERIOD },
     185        [0x3f] = { KM_LSHIFT, KC_SLASH }
     186};
     187
     188static int map_e1[][2] =
     189{
     190        [0x50] = { 0, KC_F1 },
     191        [0x51] = { 0, KC_F2 },
     192        [0x52] = { 0, KC_F3 },
     193        [0x53] = { 0, KC_F4 },
     194};
     195
     196static int map_e2[][2] =
     197{
     198        [0x41] = { 0, KC_UP },
     199        [0x42] = { 0, KC_DOWN },
     200        [0x44] = { 0, KC_LEFT },
     201        [0x43] = { 0, KC_RIGHT },
     202};
     203
     204static int map_e2a[][2] =
     205{
     206        [0x35] = { 0, KC_F5 },
     207        [0x37] = { 0, KC_F6 },
     208        [0x38] = { 0, KC_F7 },
     209        [0x39] = { 0, KC_F8 },
     210};
     211
     212static int map_e2b[][2] =
     213{
     214        [0x30] = { 0, KC_F9 },
     215        [0x31] = { 0, KC_F10 },
     216        [0x32] = { 0, KC_F11 },
     217        [0x33] = { 0, KC_F12 },
     218};
     219
     220static unsigned int mods_keys[][2] = {
     221        { KM_LSHIFT, KC_LSHIFT },
     222        { 0, 0 }
     223};
    176224
    177225static enum dec_state ds;
     
    191239static void parse_ds_start(int scancode)
    192240{
    193         if (scancode < 0 || scancode >= sizeof(map_start) / sizeof(int))
    194                 return;
    195 
    196241        if (scancode == 0x1b) {
    197242                ds = ds_e;
     
    199244        }
    200245
    201         parse_leaf(scancode, map_start, sizeof(map_start) / sizeof(int));
     246        parse_leaf(scancode, map_start, sizeof(map_start) / (2 * sizeof(int)));
    202247}
    203248
     
    218263static void parse_ds_e1(int scancode)
    219264{
    220         parse_leaf(scancode, map_e1, sizeof(map_e1) / sizeof(int));
     265        parse_leaf(scancode, map_e1, sizeof(map_e1) / (2 * sizeof(int)));
    221266}
    222267
     
    229274        }
    230275
    231         parse_leaf(scancode, map_e2, sizeof(map_e2) / sizeof(int));
     276        parse_leaf(scancode, map_e2, sizeof(map_e2) / (2 * sizeof(int)));
    232277}
    233278
    234279static void parse_ds_e2a(int scancode)
    235280{
    236         parse_leaf(scancode, map_e2a, sizeof(map_e2a) / sizeof(int));
     281        parse_leaf(scancode, map_e2a, sizeof(map_e2a) / (2 * sizeof(int)));
    237282}
    238283
    239284static void parse_ds_e2b(int scancode)
    240285{
    241         parse_leaf(scancode, map_e2b, sizeof(map_e2b) / sizeof(int));
    242 }
    243 
    244 static void parse_leaf(int scancode, int *map, size_t map_length)
    245 {
    246         unsigned int key;
     286        parse_leaf(scancode, map_e2b, sizeof(map_e2b) / (2 * sizeof(int)));
     287}
     288
     289static void parse_leaf(int scancode, int (*map)[2], size_t map_length)
     290{
     291        unsigned int key, mod;
     292        int i;
    247293
    248294        ds = ds_start;
     
    251297                return;
    252298
    253         key = map[scancode];
    254         if (key != 0)
     299        mod = map[scancode][0];
     300        key = map[scancode][1];
     301
     302        /* Simulate modifier pressing. */
     303        i = 0;
     304        while (mods_keys[i][0] != 0) {
     305                if (mod & mods_keys[i][0]) {
     306                        kbd_push_ev(KE_PRESS, mods_keys[i][1]);
     307                }
     308                ++i;
     309        }
     310
     311        if (key != 0) {
    255312                kbd_push_ev(KE_PRESS, key);
     313                kbd_push_ev(KE_RELEASE, key);
     314        }
     315
     316        /* Simulate modifier releasing. */
     317        i = 0;
     318        while (mods_keys[i][0] != 0) {
     319                if (mod & mods_keys[i][0]) {
     320                        kbd_push_ev(KE_RELEASE, mods_keys[i][1]);
     321                }
     322                ++i;
     323        }
    256324}
    257325
Note: See TracChangeset for help on using the changeset viewer.