1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright (c) 1999 by Sun Microsystems, Inc.
  24  * All rights reserved.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 /*
  30  * This file contains generic keytable information across all
  31  * keyboard hardware.
  32  */
  33 
  34 #include <sys/param.h>
  35 #include <sys/kbd.h>
  36 
  37 /*
  38  * Keyboard String Table
  39  *
  40  * This defines the strings sent by various keys (as selected in the
  41  * tables above).
  42  * The first byte of each string is its length, the rest is data.
  43  */
  44 
  45 #ifdef  __STDC__
  46 #define kstescinit(c)   "\033[" #c
  47 #else   /* __STDC__ */
  48 #define kstescinit(c)   {'\033', '[', 'c', '\0'}
  49 #endif  /* __STDC__ */
  50 char keystringtab[16][KTAB_STRLEN] = {
  51         kstescinit(H) /* home */,
  52         kstescinit(A) /* up */,
  53         kstescinit(B) /* down */,
  54         kstescinit(D) /* left */,
  55         kstescinit(C) /* right */,
  56 };
  57 
  58 
  59 /*
  60  * Compose Key Sequence Table
  61  *
  62  * Taken from Suncompose.h of openwindows.
  63  *
  64  * The idea here is to create a simple index into a table of
  65  * compose key sequences.  The purpose is to provide a fast
  66  * lookup mechanism using as little space as possible (while
  67  * still using a table of triplets).
  68  *
  69  * For reference, here is the set of all composable characters:
  70  * SP !\"\'*+,-./01234:<>?ACDEHILNOPRSTUXY\\^_`acdehilnoprstuxy|~
  71  *
  72  * if ascii_char[i] is not composable,
  73  *      kb_compose_map[i] is -1
  74  * else
  75  *      if ascii_char[i] appears as a first char in compose_table,
  76  *              kb_compose_map[i] is the index of it's first appearance
  77  *      else
  78  *              kb_compose_map[i] is 112        (end of table)
  79  */
  80 
  81 signed char kb_compose_map[ASCII_SET_SIZE] = {
  82         -1,     /* 000 (^@) */
  83         -1,     /* 001 (^A) */
  84         -1,     /* 002 (^B) */
  85         -1,     /* 003 (^C) */
  86         -1,     /* 004 (^D) */
  87         -1,     /* 005 (^E) */
  88         -1,     /* 006 (^F) */
  89         -1,     /* 007 (^G) */
  90         -1,     /* 008 (^H) */
  91         -1,     /* 009 (^I) */
  92         -1,     /* 010 (^J) */
  93         -1,     /* 011 (^K) */
  94         -1,     /* 012 (^L) */
  95         -1,     /* 013 (^M) */
  96         -1,     /* 014 (^N) */
  97         -1,     /* 015 (^O) */
  98         -1,     /* 016 (^P) */
  99         -1,     /* 017 (^Q) */
 100         -1,     /* 018 (^R) */
 101         -1,     /* 019 (^S) */
 102         -1,     /* 020 (^T) */
 103         -1,     /* 021 (^U) */
 104         -1,     /* 022 (^V) */
 105         -1,     /* 023 (^W) */
 106         -1,     /* 024 (^X) */
 107         -1,     /* 025 (^Y) */
 108         -1,     /* 026 (^Z) */
 109         -1,     /* 027 (^[) */
 110         -1,     /* 028 (^\) */
 111         -1,     /* 029 (^]) */
 112         -1,     /* 030 (^^) */
 113         -1,     /* 031 (^_) */
 114         0,      /* 032 (SP) */
 115         1,      /* 033 (!) */
 116         4,      /* 034 (") */
 117         -1,     /* 035 (#) */
 118         -1,     /* 036 ($) */
 119         -1,     /* 037 (%) */
 120         -1,     /* 038 (&) */
 121         16,     /* 039 (') */
 122         -1,     /* 040 (() */
 123         -1,     /* 041 ()) */
 124         28,     /* 042 (*) */
 125         31,     /* 043 (+) */
 126         32,     /* 044 (,) */
 127         36,     /* 045 (-) */
 128         48,     /* 046 (.) */
 129         49,     /* 047 (/) */
 130         54,     /* 048 (0) */
 131         57,     /* 049 (1) */
 132         60,     /* 050 (2) */
 133         61,     /* 051 (3) */
 134         112,    /* 052 (4) */
 135         -1,     /* 053 (5) */
 136         -1,     /* 054 (6) */
 137         -1,     /* 055 (7) */
 138         -1,     /* 056 (8) */
 139         -1,     /* 057 (9) */
 140         112,    /* 058 (:) */
 141         -1,     /* 059 (;) */
 142         63,     /* 060 (<) */
 143         -1,     /* 061 (=) */
 144         64,     /* 062 (>) */
 145         65,     /* 063 (?) */
 146         -1,     /* 064 (@) */
 147         66,     /* 065 (A) */
 148         -1,     /* 066 (B) */
 149         70,     /* 067 (C) */
 150         112,    /* 068 (D) */
 151         71,     /* 069 (E) */
 152         -1,     /* 070 (F) */
 153         -1,     /* 071 (G) */
 154         73,     /* 072 (H) */
 155         74,     /* 073 (I) */
 156         -1,     /* 074 (J) */
 157         -1,     /* 075 (K) */
 158         112,    /* 076 (L) */
 159         -1,     /* 077 (M) */
 160         76,     /* 078 (N) */
 161         77,     /* 079 (O) */
 162         84,     /* 080 (P) */
 163         -1,     /* 081 (Q) */
 164         112,    /* 082 (R) */
 165         112,    /* 083 (S) */
 166         112,    /* 084 (T) */
 167         85,     /* 085 (U) */
 168         -1,     /* 086 (V) */
 169         -1,     /* 087 (W) */
 170         112,    /* 088 (X) */
 171         112,    /* 089 (Y) */
 172         -1,     /* 090 (Z) */
 173         -1,     /* 091 ([) */
 174         87,     /* 092 (\) */
 175         -1,     /* 093 (]) */
 176         88,     /* 094 (^) */
 177         93,     /* 095 (_) */
 178         94,     /* 096 (`) */
 179         99,     /* 097 (a) */
 180         -1,     /* 098 (b) */
 181         101,    /* 099 (c) */
 182         112,    /* 100 (d) */
 183         112,    /* 101 (e) */
 184         -1,     /* 102 (f) */
 185         -1,     /* 103 (g) */
 186         102,    /* 104 (h) */
 187         112,    /* 105 (i) */
 188         -1,     /* 106 (j) */
 189         -1,     /* 107 (k) */
 190         112,    /* 108 (l) */
 191         -1,     /* 109 (m) */
 192         103,    /* 110 (n) */
 193         104,    /* 111 (o) */
 194         108,    /* 112 (p) */
 195         -1,     /* 113 (q) */
 196         112,    /* 114 (r) */
 197         109,    /* 115 (s) */
 198         112,    /* 116 (t) */
 199         112,    /* 117 (u) */
 200         -1,     /* 118 (v) */
 201         -1,     /* 119 (w) */
 202         110,    /* 120 (x) */
 203         112,    /* 121 (y) */
 204         -1,     /* 122 (z) */
 205         -1,     /* 123 ({) */
 206         111,    /* 124 (|) */
 207         -1,     /* 125 (}) */
 208         112,    /* 126 (~) */
 209         -1,     /* 127 (DEL) */
 210 };
 211 
 212 /*
 213  * IMPORTANT NOTE:  This table MUST be kept in proper sorted order:
 214  *      The first and second characters in each entry must be in ASCII
 215  *          collating sequence (left to right).
 216  *      The table must be in ASCII collating sequence by first character
 217  *          (top to bottom).
 218  */
 219 
 220 /* COMPOSE + first character + second character => ISO character */
 221 
 222 struct compose_sequence_t kb_compose_table[] = {
 223 
 224         {' ', ' ', 0xA0},       /* 000 */       /* NBSP (non-breaking space) */
 225         {'!', '!', 0xA1},       /* 001 */       /* inverted ! */
 226         {'!', 'P', 0xB6},       /* 002 */       /* paragraph mark */
 227         {'!', 'p', 0xB6},       /* 003 */       /* paragraph mark */
 228         {'"', '"', 0xA8},       /* 004 */       /* diaresis */
 229         {'"', 'A', 0xC4},       /* 005 */       /* A with diaresis */
 230         {'"', 'E', 0xCB},       /* 006 */       /* E with diaresis */
 231         {'"', 'I', 0xCF},       /* 007 */       /* I with diaresis */
 232         {'"', 'O', 0xD6},       /* 008 */       /* O with diaresis */
 233         {'"', 'U', 0xDC},       /* 009 */       /* U with diaresis */
 234         {'"', 'a', 0xE4},       /* 010 */       /* a with diaresis */
 235         {'"', 'e', 0xEB},       /* 011 */       /* e with diaresis */
 236         {'"', 'i', 0xEF},       /* 012 */       /* i with diaresis */
 237         {'"', 'o', 0xF6},       /* 013 */       /* o with diaresis */
 238         {'"', 'u', 0xFC},       /* 014 */       /* u with diaresis */
 239         {'"', 'y', 0xFF},       /* 015 */       /* y with diaresis */
 240         {'\'', 'A', 0xC1},      /* 016 */       /* A with acute accent */
 241         {'\'', 'E', 0xC9},      /* 017 */       /* E with acute accent */
 242         {'\'', 'I', 0xCD},      /* 018 */       /* I with acute accent */
 243         {'\'', 'O', 0xD3},      /* 019 */       /* O with acute accent */
 244         {'\'', 'U', 0xDA},      /* 020 */       /* U with acute accent */
 245         {'\'', 'Y', 0xDD},      /* 021 */       /* Y with acute accent */
 246         {'\'', 'a', 0xE1},      /* 022 */       /* a with acute accent */
 247         {'\'', 'e', 0xE9},      /* 023 */       /* e with acute accent */
 248         {'\'', 'i', 0xED},      /* 024 */       /* i with acute accent */
 249         {'\'', 'o', 0xF3},      /* 025 */       /* o with acute accent */
 250         {'\'', 'u', 0xFA},      /* 026 */       /* u with acute accent */
 251         {'\'', 'y', 0xFD},      /* 027 */       /* y with acute accent */
 252         {'*', 'A', 0xC5},       /* 028 */       /* A with ring */
 253         {'*', '^', 0xB0},       /* 029 */       /* degree */
 254         {'*', 'a', 0xE5},       /* 030 */       /* a with ring */
 255         {'+', '-', 0xB1},       /* 031 */       /* plus/minus */
 256         {',', ',', 0xB8},       /* 032 */       /* cedilla */
 257         {',', '-', 0xAC},       /* 033 */       /* not sign */
 258         {',', 'C', 0xC7},       /* 034 */       /* C with cedilla */
 259         {',', 'c', 0xE7},       /* 035 */       /* c with cedilla */
 260         {'-', '-', 0xAD},       /* 036 */       /* soft hyphen */
 261         {'-', ':', 0xF7},       /* 037 */       /* division sign */
 262         {'-', 'A', 0xAA},       /* 038 */       /* feminine superior numeral */
 263         {'-', 'D', 0xD0},       /* 039 */       /* Upper-case eth */
 264         {'-', 'L', 0xA3},       /* 040 */       /* pounds sterling */
 265         {'-', 'Y', 0xA5},       /* 041 */       /* yen */
 266         {'-', '^', 0xAF},       /* 042 */       /* macron */
 267         {'-', 'a', 0xAA},       /* 043 */       /* feminine superior numeral */
 268         {'-', 'd', 0xF0},       /* 044 */       /* Lower-case eth */
 269         {'-', 'l', 0xA3},       /* 045 */       /* pounds sterling */
 270         {'-', 'y', 0xA5},       /* 046 */       /* yen */
 271         {'-', '|', 0xAC},       /* 047 */       /* not sign */
 272         {'.', '^', 0xB7},       /* 048 */       /* centered dot */
 273         {'/', 'C', 0xA2},       /* 049 */       /* cent sign */
 274         {'/', 'O', 0xD8},       /* 050 */       /* O with slash */
 275         {'/', 'c', 0xA2},       /* 051 */       /* cent sign */
 276         {'/', 'o', 0xF8},       /* 052 */       /* o with slash */
 277         {'/', 'u', 0xB5},       /* 053 */       /* mu */
 278         {'0', 'X', 0xA4},       /* 054 */       /* currency symbol */
 279         {'0', '^', 0xB0},       /* 055 */       /* degree */
 280         {'0', 'x', 0xA4},       /* 056 */       /* currency symbol */
 281         {'1', '2', 0xBD},       /* 057 */       /* 1/2 */
 282         {'1', '4', 0xBC},       /* 058 */       /* 1/4 */
 283         {'1', '^', 0xB9},       /* 059 */       /* superior '1' */
 284         {'2', '^', 0xB2},       /* 060 */       /* superior '2' */
 285         {'3', '4', 0xBE},       /* 061 */       /* 3/4 */
 286         {'3', '^', 0xB3},       /* 062 */       /* superior '3' */
 287         {'<', '<', 0xAB}, /* 063 */       /* left guillemot */
 288         {'>', '>', 0xBB}, /* 064 */       /* right guillemot */
 289         {'?', '?', 0xBF},       /* 065 */       /* inverted ? */
 290         {'A', 'E', 0xC6},       /* 066 */       /* AE dipthong */
 291         {'A', '^', 0xC2},       /* 067 */       /* A with circumflex accent */
 292         {'A', '`', 0xC0},       /* 068 */       /* A with grave accent */
 293         {'A', '~', 0xC3},       /* 069 */       /* A with tilde */
 294         {'C', 'O', 0xA9},       /* 060 */       /* copyright */
 295         {'E', '^', 0xCA},       /* 071 */       /* E with circumflex accent */
 296         {'E', '`', 0xC8},       /* 072 */       /* E with grave accent */
 297         {'H', 'T', 0xDE},       /* 073 */       /* Upper-case thorn */
 298         {'I', '^', 0xCE},       /* 074 */       /* I with circumflex accent */
 299         {'I', '`', 0xCC},       /* 075 */       /* I with grave accent */
 300         {'N', '~', 0xD1},       /* 076 */       /* N with tilde */
 301         {'O', 'R', 0xAE},       /* 077 */       /* registered */
 302         {'O', 'S', 0xA7},       /* 078 */       /* section mark */
 303         {'O', 'X', 0xA4},       /* 079 */       /* currency symbol */
 304         {'O', '^', 0xD4},       /* 080 */       /* O with circumflex accent */
 305         {'O', '_', 0xBA},       /* 081 */       /* masculine superior numeral */
 306         {'O', '`', 0xD2},       /* 082 */       /* O with grave accent */
 307         {'O', '~', 0xD5},       /* 083 */       /* O with tilde */
 308         {'P', '|', 0xDE},       /* 084 */       /* Upper-case thorn */
 309         {'U', '^', 0xDB},       /* 085 */       /* U with circumflex accent */
 310         {'U', '`', 0xD9},       /* 086 */       /* U with grave accent */
 311         {'\\', '\\', 0xB4},     /* 087 */       /* acute accent */
 312         {'^', 'a', 0xE2},       /* 088 */       /* a with circumflex accent */
 313         {'^', 'e', 0xEA},       /* 089 */       /* e with circumflex accent */
 314         {'^', 'i', 0xEE},       /* 090 */       /* i with circumflex accent */
 315         {'^', 'o', 0xF4},       /* 091 */       /* o with circumflex accent */
 316         {'^', 'u', 0xFB},       /* 092 */       /* u with circumflex accent */
 317         {'_', 'o', 0xBA},       /* 093 */       /* masculine superior numeral */
 318         {'`', 'a', 0xE0},       /* 094 */       /* a with grave accent */
 319         {'`', 'e', 0xE8},       /* 095 */       /* e with grave accent */
 320         {'`', 'i', 0xEC},       /* 096 */       /* i with grave accent */
 321         {'`', 'o', 0xF2},       /* 097 */       /* o with grave accent */
 322         {'`', 'u', 0xF9},       /* 098 */       /* u with grave accent */
 323         {'a', 'e', 0xE6},       /* 099 */       /* ae dipthong */
 324         {'a', '~', 0xE3},       /* 100 */       /* a with tilde */
 325         {'c', 'o', 0xA9},       /* 101 */       /* copyright */
 326         {'h', 't', 0xFE},       /* 102 */       /* Lower-case thorn */
 327         {'n', '~', 0xF1},       /* 103 */       /* n with tilde */
 328         {'o', 'r', 0xAE},       /* 104 */       /* registered */
 329         {'o', 's', 0xA7},       /* 105 */       /* section mark */
 330         {'o', 'x', 0xA4},       /* 106 */       /* currency symbol */
 331         {'o', '~', 0xF5},       /* 107 */       /* o with tilde */
 332         {'p', '|', 0xFE},       /* 108 */       /* Lower-case thorn */
 333         {'s', 's', 0xDF},       /* 109 */       /* German double-s */
 334         {'x', 'x', 0xD7},       /* 110 */       /* multiplication sign */
 335         {'|', '|', 0xA6},       /* 111 */       /* broken bar */
 336 
 337         {0, 0, 0},                      /* end of table */
 338 };
 339 
 340 /*
 341  * Floating Accent Sequence Table
 342  */
 343 
 344 /* FA + ASCII character => ISO character */
 345 struct fltaccent_sequence_t kb_fltaccent_table[] = {
 346 
 347         {FA_UMLAUT, 'A', 0xC4},         /* A with umlaut */
 348         {FA_UMLAUT, 'E', 0xCB},         /* E with umlaut */
 349         {FA_UMLAUT, 'I', 0xCF},         /* I with umlaut */
 350         {FA_UMLAUT, 'O', 0xD6},         /* O with umlaut */
 351         {FA_UMLAUT, 'U', 0xDC},         /* U with umlaut */
 352         {FA_UMLAUT, 'a', 0xE4},         /* a with umlaut */
 353         {FA_UMLAUT, 'e', 0xEB},         /* e with umlaut */
 354         {FA_UMLAUT, 'i', 0xEF},         /* i with umlaut */
 355         {FA_UMLAUT, 'o', 0xF6},         /* o with umlaut */
 356         {FA_UMLAUT, 'u', 0xFC},         /* u with umlaut */
 357         {FA_UMLAUT, 'y', 0xFF},         /* y with umlaut */
 358 
 359         {FA_CFLEX, 'A', 0xC2},          /* A with circumflex */
 360         {FA_CFLEX, 'E', 0xCA},          /* E with circumflex */
 361         {FA_CFLEX, 'I', 0xCE},          /* I with circumflex */
 362         {FA_CFLEX, 'O', 0xD4},          /* O with circumflex */
 363         {FA_CFLEX, 'U', 0xDB},          /* U with circumflex */
 364         {FA_CFLEX, 'a', 0xE2},          /* a with circumflex */
 365         {FA_CFLEX, 'e', 0xEA},          /* e with circumflex */
 366         {FA_CFLEX, 'i', 0xEE},          /* i with circumflex */
 367         {FA_CFLEX, 'o', 0xF4},          /* o with circumflex */
 368         {FA_CFLEX, 'u', 0xFB},          /* u with circumflex */
 369 
 370         {FA_TILDE, 'A', 0xC3},          /* A with tilde */
 371         {FA_TILDE, 'N', 0xD1},          /* N with tilde */
 372         {FA_TILDE, 'O', 0xD5},          /* O with tilde */
 373         {FA_TILDE, 'a', 0xE3},          /* a with tilde */
 374         {FA_TILDE, 'n', 0xF1},          /* n with tilde */
 375         {FA_TILDE, 'o', 0xF5},          /* o with tilde */
 376 
 377         {FA_CEDILLA, 'C', 0xC7},        /* C with cedilla */
 378         {FA_CEDILLA, 'c', 0xE7},        /* c with cedilla */
 379 
 380         {FA_ACUTE, 'A', 0xC1},          /* A with acute accent */
 381         {FA_ACUTE, 'E', 0xC9},          /* E with acute accent */
 382         {FA_ACUTE, 'I', 0xCD},          /* I with acute accent */
 383         {FA_ACUTE, 'O', 0xD3},          /* O with acute accent */
 384         {FA_ACUTE, 'U', 0xDA},          /* U with acute accent */
 385         {FA_ACUTE, 'a', 0xE1},          /* a with acute accent */
 386         {FA_ACUTE, 'e', 0xE9},          /* e with acute accent */
 387         {FA_ACUTE, 'i', 0xED},          /* i with acute accent */
 388         {FA_ACUTE, 'o', 0xF3},          /* o with acute accent */
 389         {FA_ACUTE, 'u', 0xFA},          /* u with acute accent */
 390         {FA_ACUTE, 'y', 0xFD},          /* y with acute accent */
 391 
 392         {FA_GRAVE, 'A', 0xC0},          /* A with grave accent */
 393         {FA_GRAVE, 'E', 0xC8},          /* E with grave accent */
 394         {FA_GRAVE, 'I', 0xCC},          /* I with grave accent */
 395         {FA_GRAVE, 'O', 0xD2},          /* O with grave accent */
 396         {FA_GRAVE, 'U', 0xD9},          /* U with grave accent */
 397         {FA_GRAVE, 'a', 0xE0},          /* a with grave accent */
 398         {FA_GRAVE, 'e', 0xE8},          /* e with grave accent */
 399         {FA_GRAVE, 'i', 0xEC},          /* i with grave accent */
 400         {FA_GRAVE, 'o', 0xF2},          /* o with grave accent */
 401         {FA_GRAVE, 'u', 0xF9},          /* u with grave accent */
 402 
 403         {0, 0, 0},                      /* end of table */
 404 };
 405 
 406 /*
 407  * Num Lock Table
 408  */
 409 
 410 /* Num Lock:  pad key entry & 0x1F => ASCII character */
 411 uchar_t kb_numlock_table[] = {
 412         '=',
 413         '/',
 414         '*',
 415         '-',
 416         ',',
 417 
 418         '7',
 419         '8',
 420         '9',
 421         '+',
 422 
 423         '4',
 424         '5',
 425         '6',
 426 
 427         '1',
 428         '2',
 429         '3',
 430 
 431         '0',
 432         '.',
 433         '\n',   /* Enter */
 434 };