Changeset c8bf88d in mainline for kernel/genarch/src/kbrd/kbrd.c


Ignore:
Timestamp:
2009-04-03T15:52:14Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a7b1071
Parents:
2398ee9
Message:

represent special keystrokes (cursor arrows, page up/down, delete, etc.) as appropriate Unicode characters
do not parse ANSI control sequences in kconsole, but in serial line driver

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/kbrd/kbrd.c

    r2398ee9 rc8bf88d  
    5353#include <macros.h>
    5454
    55 #ifdef CONFIG_SUN_KBD
    56         #define IGNORE_CODE  0x7f
    57 #endif
    58 
     55#define IGNORE_CODE  0x7f
    5956#define KEY_RELEASE  0x80
    6057
     
    7370static volatile int lockflags;  /**< Tracking of multiple keys lockings. */
    7471
    75 static void key_released(uint8_t);
    76 static void key_pressed(uint8_t);
    77 
    78 static void kkbrd(void *arg)
    79 {
    80         indev_t *in = (indev_t *) arg;
    81        
    82         while (true) {
    83                 uint8_t sc = _getc(in);
    84                
    85 #ifdef CONFIG_SUN_KBD
    86                 if (sc == IGNORE_CODE)
    87                         continue;
    88 #endif
    89                
    90                 if (sc & KEY_RELEASE)
    91                         key_released(sc ^ KEY_RELEASE);
    92                 else
    93                         key_pressed(sc);
    94         }
    95 }
    96 
    97 void kbrd_init(indev_t *devin)
    98 {
    99         indev_initialize("kbrd", &kbrdout, &kbrdout_ops);
    100         thread_t *thread
    101             = thread_create(kkbrd, devin, TASK, 0, "kkbrd", false);
    102        
    103         if (thread) {
    104                 stdin = &kbrdout;
    105                 thread_ready(thread);
    106         }
    107 }
    108 
    10972/** Process release of key.
    11073 *
    11174 * @param sc Scancode of the key being released.
    11275 */
    113 void key_released(uint8_t sc)
     76static void key_released(wchar_t sc)
    11477{
    11578        spinlock_lock(&keylock);
     
    13699 * @param sc Scancode of the key being pressed.
    137100 */
    138 void key_pressed(uint8_t sc)
     101static void key_pressed(wchar_t sc)
    139102{
    140         char *map = sc_primary_map;
    141         char ascii = sc_primary_map[sc];
    142         bool shift, capslock;
    143         bool letter = false;
     103        bool letter;
     104        bool shift;
     105        bool capslock;
    144106       
    145107        spinlock_lock(&keylock);
     
    152114                keyflags |= PRESSED_CAPSLOCK;
    153115                break;
    154         case SC_SPEC_ESCAPE:
    155                 break;
    156         case SC_LEFTARR:
    157                 indev_push_character(stdin, 0x1b);
    158                 indev_push_character(stdin, 0x5b);
    159                 indev_push_character(stdin, 0x44);
    160                 break;
    161         case SC_RIGHTARR:
    162                 indev_push_character(stdin, 0x1b);
    163                 indev_push_character(stdin, 0x5b);
    164                 indev_push_character(stdin, 0x43);
    165                 break;
    166         case SC_UPARR:
    167                 indev_push_character(stdin, 0x1b);
    168                 indev_push_character(stdin, 0x5b);
    169                 indev_push_character(stdin, 0x41);
    170                 break;
    171         case SC_DOWNARR:
    172                 indev_push_character(stdin, 0x1b);
    173                 indev_push_character(stdin, 0x5b);
    174                 indev_push_character(stdin, 0x42);
    175                 break;
    176         case SC_HOME:
    177                 indev_push_character(stdin, 0x1b);
    178                 indev_push_character(stdin, 0x4f);
    179                 indev_push_character(stdin, 0x48);
    180                 break;
    181         case SC_END:
    182                 indev_push_character(stdin, 0x1b);
    183                 indev_push_character(stdin, 0x4f);
    184                 indev_push_character(stdin, 0x46);
    185                 break;
    186         case SC_DELETE:
    187                 indev_push_character(stdin, 0x1b);
    188                 indev_push_character(stdin, 0x5b);
    189                 indev_push_character(stdin, 0x33);
    190                 indev_push_character(stdin, 0x7e);
     116        case SC_SCAN_ESCAPE:
    191117                break;
    192118        default:
    193                 letter = islower(ascii);
     119                letter = islower(sc_primary_map[sc]);
     120                shift = keyflags & PRESSED_SHIFT;
    194121                capslock = (keyflags & PRESSED_CAPSLOCK) ||
    195122                    (lockflags & LOCKED_CAPSLOCK);
    196                 shift = keyflags & PRESSED_SHIFT;
    197                 if (letter && capslock)
     123               
     124                if ((letter) && (capslock))
    198125                        shift = !shift;
     126               
    199127                if (shift)
    200                         map = sc_secondary_map;
    201                 indev_push_character(stdin, map[sc]);
     128                        indev_push_character(stdin, sc_secondary_map[sc]);
     129                else
     130                        indev_push_character(stdin, sc_primary_map[sc]);
    202131                break;
    203132        }
     
    205134}
    206135
     136static void kkbrd(void *arg)
     137{
     138        indev_t *in = (indev_t *) arg;
     139       
     140        while (true) {
     141                wchar_t sc = _getc(in);
     142               
     143                if ((sc == IGNORE_CODE) || (sc >= SCANCODES))
     144                        continue;
     145               
     146                if (sc & KEY_RELEASE)
     147                        key_released(sc ^ KEY_RELEASE);
     148                else
     149                        key_pressed(sc);
     150        }
     151}
     152
     153void kbrd_init(indev_t *devin)
     154{
     155        indev_initialize("kbrd", &kbrdout, &kbrdout_ops);
     156        thread_t *thread
     157            = thread_create(kkbrd, devin, TASK, 0, "kkbrd", false);
     158       
     159        if (thread) {
     160                stdin = &kbrdout;
     161                thread_ready(thread);
     162        }
     163}
     164
    207165/** @}
    208166 */
Note: See TracChangeset for help on using the changeset viewer.