Changeset d1eece6 in mainline for uspace/srv/kbd/layout/us_qwerty.c


Ignore:
Timestamp:
2009-02-19T22:54:32Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
013c4d6
Parents:
91825d90
Message:

Basic support for key modifiers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/kbd/layout/us_qwerty.c

    r91825d90 rd1eece6  
    3737#include <layout.h>
    3838
    39 static int map_normal[] = {
     39static char map_lcase[] = {
     40        [KC_Q] = 'q',
     41        [KC_W] = 'w',
     42        [KC_E] = 'e',
     43        [KC_R] = 'r',
     44        [KC_T] = 't',
     45        [KC_Y] = 'y',
     46        [KC_U] = 'u',
     47        [KC_I] = 'i',
     48        [KC_O] = 'o',
     49        [KC_P] = 'p',
     50
     51        [KC_A] = 'a',
     52        [KC_S] = 's',
     53        [KC_D] = 'd',
     54        [KC_F] = 'f',
     55        [KC_G] = 'g',
     56        [KC_H] = 'h',
     57        [KC_J] = 'j',
     58        [KC_K] = 'k',
     59        [KC_L] = 'l',
     60
     61        [KC_Z] = 'z',
     62        [KC_X] = 'x',
     63        [KC_C] = 'c',
     64        [KC_V] = 'v',
     65        [KC_B] = 'b',
     66        [KC_N] = 'n',
     67        [KC_M] = 'm',
     68};
     69
     70static char map_ucase[] = {
     71        [KC_Q] = 'Q',
     72        [KC_W] = 'W',
     73        [KC_E] = 'E',
     74        [KC_R] = 'R',
     75        [KC_T] = 'T',
     76        [KC_Y] = 'Y',
     77        [KC_U] = 'U',
     78        [KC_I] = 'I',
     79        [KC_O] = 'O',
     80        [KC_P] = 'P',
     81
     82        [KC_A] = 'A',
     83        [KC_S] = 'S',
     84        [KC_D] = 'D',
     85        [KC_F] = 'F',
     86        [KC_G] = 'G',
     87        [KC_H] = 'H',
     88        [KC_J] = 'J',
     89        [KC_K] = 'K',
     90        [KC_L] = 'L',
     91
     92        [KC_Z] = 'Z',
     93        [KC_X] = 'X',
     94        [KC_C] = 'C',
     95        [KC_V] = 'V',
     96        [KC_B] = 'B',
     97        [KC_N] = 'N',
     98        [KC_M] = 'M',
     99};
     100
     101static char map_not_shifted[] = {
    40102        [KC_BACKTICK] = '`',
    41103
     
    53115        [KC_MINUS] = '-',
    54116        [KC_EQUALS] = '=',
    55         [KC_BACKSPACE] = '\b',
    56 
    57         [KC_TAB] = '\t',
    58 
    59         [KC_Q] = 'q',
    60         [KC_W] = 'w',
    61         [KC_E] = 'e',
    62         [KC_R] = 'r',
    63         [KC_T] = 't',
    64         [KC_Y] = 'y',
    65         [KC_U] = 'u',
    66         [KC_I] = 'i',
    67         [KC_O] = 'o',
    68         [KC_P] = 'p',
    69117
    70118        [KC_LBRACKET] = '[',
    71119        [KC_RBRACKET] = ']',
    72 
    73         [KC_A] = 'a',
    74         [KC_S] = 's',
    75         [KC_D] = 'd',
    76         [KC_F] = 'f',
    77         [KC_G] = 'g',
    78         [KC_H] = 'h',
    79         [KC_J] = 'j',
    80         [KC_K] = 'k',
    81         [KC_L] = 'l',
    82120
    83121        [KC_SEMICOLON] = ';',
    84122        [KC_QUOTE] = '\'',
    85123        [KC_BACKSLASH] = '\\',
    86         [KC_ENTER] = '\n',
    87 
    88         [KC_Z] = 'z',
    89         [KC_X] = 'x',
    90         [KC_C] = 'c',
    91         [KC_V] = 'v',
    92         [KC_B] = 'b',
    93         [KC_N] = 'n',
    94         [KC_M] = 'm',
    95124
    96125        [KC_COMMA] = ',',
    97126        [KC_PERIOD] = '.',
    98127        [KC_SLASH] = '/',
    99 
     128};
     129
     130static char map_shifted[] = {
     131        [KC_BACKTICK] = '~',
     132
     133        [KC_1] = '!',
     134        [KC_2] = '@',
     135        [KC_3] = '#',
     136        [KC_4] = '$',
     137        [KC_5] = '%',
     138        [KC_6] = '^',
     139        [KC_7] = '&',
     140        [KC_8] = '*',
     141        [KC_9] = '(',
     142        [KC_0] = ')',
     143
     144        [KC_MINUS] = '_',
     145        [KC_EQUALS] = '+',
     146
     147        [KC_LBRACKET] = '{',
     148        [KC_RBRACKET] = '}',
     149
     150        [KC_SEMICOLON] = ':',
     151        [KC_QUOTE] = '"',
     152        [KC_BACKSLASH] = '|',
     153
     154        [KC_COMMA] = '<',
     155        [KC_PERIOD] = '>',
     156        [KC_SLASH] = '?',
     157};
     158
     159static char map_neutral[] = {
     160        [KC_BACKSPACE] = '\b',
     161        [KC_TAB] = '\t',
     162        [KC_ENTER] = '\n',
    100163        [KC_SPACE] = ' '
    101164};
     165
     166static int translate(unsigned int key, char *map, size_t map_length)
     167{
     168        if (key >= map_length) return 0;
     169        return map[key];       
     170}
    102171
    103172char layout_parse_ev(kbd_event_t *ev)
    104173{
    105         if (ev->key >= sizeof(map_normal) / sizeof(int))
     174        char c;
     175
     176        /* Produce no characters when Ctrl or Alt is pressed. */
     177        if ((ev->mods & (KM_CTRL | KM_ALT)) != 0)
    106178                return 0;
    107179
    108         return map_normal[ev->key];
     180        c = translate(ev->key, map_neutral, sizeof(map_neutral) / sizeof(char));
     181        if (c != 0) return c;
     182
     183        if (((ev->mods & KM_SHIFT) != 0) ^ ((ev->mods & KM_CAPS_LOCK) != 0))
     184                c = translate(ev->key, map_ucase, sizeof(map_ucase) / sizeof(char));
     185        else
     186                c = translate(ev->key, map_lcase, sizeof(map_lcase) / sizeof(char));
     187
     188        if (c != 0) return c;
     189
     190        if ((ev->mods & KM_SHIFT) != 0)
     191                c = translate(ev->key, map_shifted, sizeof(map_shifted) / sizeof(char));
     192        else
     193                c = translate(ev->key, map_not_shifted, sizeof(map_not_shifted) / sizeof(char));
     194
     195        if (c != 0 ) return c;
     196
    109197}
    110198
Note: See TracChangeset for help on using the changeset viewer.