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


Ignore:
Timestamp:
2009-02-19T22:54:32Z (16 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_dvorak.c

    r91825d90 rd1eece6  
    3737#include <layout.h>
    3838
    39 static int map_normal[] = {
     39static char map_lcase[] = {
     40        [KC_R] = 'p',
     41        [KC_T] = 'y',
     42        [KC_Y] = 'f',
     43        [KC_U] = 'g',
     44        [KC_I] = 'c',
     45        [KC_O] = 'r',
     46        [KC_P] = 'l',
     47
     48        [KC_A] = 'a',
     49        [KC_S] = 'o',
     50        [KC_D] = 'e',
     51        [KC_F] = 'u',
     52        [KC_G] = 'i',
     53        [KC_H] = 'd',
     54        [KC_J] = 'h',
     55        [KC_K] = 't',
     56        [KC_L] = 'n',
     57
     58        [KC_SEMICOLON] = 's',
     59
     60        [KC_X] = 'q',
     61        [KC_C] = 'j',
     62        [KC_V] = 'k',
     63        [KC_B] = 'x',
     64        [KC_N] = 'b',
     65        [KC_M] = 'm',
     66
     67        [KC_COMMA] = 'w',
     68        [KC_PERIOD] = 'v',
     69        [KC_SLASH] = 'z',
     70};
     71
     72static char map_ucase[] = {
     73        [KC_R] = 'P',
     74        [KC_T] = 'Y',
     75        [KC_Y] = 'F',
     76        [KC_U] = 'G',
     77        [KC_I] = 'C',
     78        [KC_O] = 'R',
     79        [KC_P] = 'L',
     80
     81        [KC_A] = 'A',
     82        [KC_S] = 'O',
     83        [KC_D] = 'E',
     84        [KC_F] = 'U',
     85        [KC_G] = 'I',
     86        [KC_H] = 'D',
     87        [KC_J] = 'H',
     88        [KC_K] = 'T',
     89        [KC_L] = 'N',
     90
     91        [KC_SEMICOLON] = 'S',
     92
     93        [KC_X] = 'Q',
     94        [KC_C] = 'J',
     95        [KC_V] = 'K',
     96        [KC_B] = 'X',
     97        [KC_N] = 'B',
     98        [KC_M] = 'M',
     99
     100        [KC_COMMA] = 'W',
     101        [KC_PERIOD] = 'V',
     102        [KC_SLASH] = 'Z',
     103};
     104
     105static char map_not_shifted[] = {
    40106        [KC_BACKTICK] = '`',
    41107
     
    53119        [KC_MINUS] = '[',
    54120        [KC_EQUALS] = ']',
    55         [KC_BACKSPACE] = '\b',
    56 
    57         [KC_TAB] = '\t',
    58121
    59122        [KC_Q] = '\'',
    60123        [KC_W] = ',',
    61124        [KC_E] = '.',
    62         [KC_R] = 'p',
    63         [KC_T] = 'y',
    64         [KC_Y] = 'f',
    65         [KC_U] = 'g',
    66         [KC_I] = 'c',
    67         [KC_O] = 'r',
    68         [KC_P] = 'l',
    69125
    70126        [KC_LBRACKET] = '/',
    71127        [KC_RBRACKET] = '=',
    72128
    73         [KC_A] = 'a',
    74         [KC_S] = 'o',
    75         [KC_D] = 'e',
    76         [KC_F] = 'u',
    77         [KC_G] = 'i',
    78         [KC_H] = 'd',
    79         [KC_J] = 'h',
    80         [KC_K] = 't',
    81         [KC_L] = 'n',
    82 
    83         [KC_SEMICOLON] = 's',
    84129        [KC_QUOTE] = '-',
    85130        [KC_BACKSLASH] = '\\',
    86131
    87132        [KC_Z] = ';',
    88         [KC_X] = 'q',
    89         [KC_C] = 'j',
    90         [KC_V] = 'k',
    91         [KC_B] = 'x',
    92         [KC_N] = 'b',
    93         [KC_M] = 'm',
    94 
    95         [KC_COMMA] = 'w',
    96         [KC_PERIOD] = 'v',
    97         [KC_SLASH] = 'z',
    98 
     133};
     134
     135static char map_shifted[] = {
     136        [KC_BACKTICK] = '~',
     137
     138        [KC_1] = '!',
     139        [KC_2] = '@',
     140        [KC_3] = '#',
     141        [KC_4] = '$',
     142        [KC_5] = '%',
     143        [KC_6] = '^',
     144        [KC_7] = '&',
     145        [KC_8] = '*',
     146        [KC_9] = '(',
     147        [KC_0] = ')',
     148
     149        [KC_MINUS] = '{',
     150        [KC_EQUALS] = '}',
     151
     152        [KC_Q] = '"',
     153        [KC_W] = '<',
     154        [KC_E] = '>',
     155
     156        [KC_LBRACKET] = '?',
     157        [KC_RBRACKET] = '+',
     158
     159        [KC_QUOTE] = '_',
     160        [KC_BACKSLASH] = '|',
     161
     162        [KC_Z] = ':',
     163};
     164
     165static char map_neutral[] = {
     166        [KC_BACKSPACE] = '\b',
     167        [KC_TAB] = '\t',
    99168        [KC_ENTER] = '\n'
    100169};
     170
     171static int translate(unsigned int key, char *map, size_t map_length)
     172{
     173        if (key >= map_length) return 0;
     174        return map[key];       
     175}
    101176
    102177char layout_parse_ev(kbd_event_t *ev)
    103178{
    104         if (ev->key >= sizeof(map_normal) / sizeof(int))
     179        char c;
     180
     181        /* Produce no characters when Ctrl or Alt is pressed. */
     182        if ((ev->mods & (KM_CTRL | KM_ALT)) != 0)
    105183                return 0;
    106184
    107         return map_normal[ev->key];
     185        c = translate(ev->key, map_neutral, sizeof(map_neutral) / sizeof(char));
     186        if (c != 0) return c;
     187
     188        if (((ev->mods & KM_SHIFT) != 0) ^ ((ev->mods & KM_CAPS_LOCK) != 0))
     189                c = translate(ev->key, map_ucase, sizeof(map_ucase) / sizeof(char));
     190        else
     191                c = translate(ev->key, map_lcase, sizeof(map_lcase) / sizeof(char));
     192
     193        if (c != 0) return c;
     194
     195        if ((ev->mods & KM_SHIFT) != 0)
     196                c = translate(ev->key, map_shifted, sizeof(map_shifted) / sizeof(char));
     197        else
     198                c = translate(ev->key, map_not_shifted, sizeof(map_not_shifted) / sizeof(char));
     199
     200        if (c != 0 ) return c;
     201
    108202}
     203
    109204
    110205/**
Note: See TracChangeset for help on using the changeset viewer.