Annotation of researchv9/X11/src/X.V11R1/server/ddx/lk201/lk201.c, revision 1.1.1.1

1.1       root        1: /************************************************************
                      2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      4: 
                      5:                         All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the names of Digital or MIT not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ********************************************************/
                     24: /* $Header: lk201.c,v 1.25 87/09/13 00:51:54 toddb Exp $ */
                     25: 
                     26: #include "X.h"
                     27: #define NEED_EVENTS
                     28: #include "Xproto.h"
                     29: #include "keynames.h"
                     30: #include "keysym.h"
                     31: 
                     32: /* This file is device dependent, but is common to several devices */
                     33: 
                     34: #include <sys/types.h>
                     35: #include "input.h"
                     36: 
                     37: #define KEYDOWN_ERROR  0x3d
                     38: #define POWERUP_ERROR  0x3e
                     39: #define BASEKEY                0x41
                     40: #define MINSPECIAL     0xb3
                     41: #define ALLUPS         0xb3
                     42: #define METRONOME      0xb4
                     43: #define OUTPUT_ERROR   0xb5
                     44: #define INPUT_ERROR    0xb6
                     45: #define MAXSPECIAL     0xba
                     46: 
                     47: static u_char lastkey;
                     48: 
                     49: #define NUMDIVS 14
                     50: static u_char divbeg[NUMDIVS] = {0xbf, 0x91, 0xbc, 0xbd, 0xb0, 0xad, 0xa6,
                     51:                                 0xa9, 0x88, 0x56, 0x63, 0x6f, 0x7b, 0x7e};
                     52: static u_char divend[NUMDIVS] = {0xff, 0xa5, 0xbc, 0xbe, 0xb2, 0xaf, 0xa8,
                     53:                                 0xac, 0x90, 0x62, 0x6e, 0x7a, 0x7d, 0x87};
                     54: /* initially set for keyboard defaults */
                     55: static unsigned int keymodes[8] = {0, 0, 0, 0, 0, 0x0001c000, 0, 0};
                     56:        /* down/up keys */
                     57: static unsigned int keys[8]; /* down/up keys that are currently down */
                     58: 
                     59: /* Handle keyboard input from LK201 */
                     60: 
                     61: void
                     62: ProcessLK201Input (e, dev)
                     63:        register xEvent *e;
                     64:        DevicePtr dev;
                     65: {
                     66:     register unsigned int    key, bits;
                     67:     register         int    idx;
                     68: 
                     69:     key = e->u.u.detail;
                     70:     if (key > MAXSPECIAL || (key >= BASEKEY && key < MINSPECIAL))
                     71:     {
                     72:        lastkey = key;
                     73:        idx = key >> 5;
                     74:        key &= 0x1f;
                     75:        key = 1 << key;
                     76:        if (keymodes[idx] & key)        /* an up down type */
                     77:        {
                     78:            if ((keys[idx] ^= key) & key)
                     79:                e->u.u.type = KeyPress;
                     80:            else
                     81:                e->u.u.type = KeyRelease;
                     82:            (*dev->processInputProc)(e, dev);
                     83:        }
                     84:        else
                     85:        {
                     86:            e->u.u.type = KeyPress;
                     87:            (*dev->processInputProc)(e, dev);
                     88:            e->u.u.type = KeyRelease;
                     89:            (*dev->processInputProc)(e, dev);
                     90:        }
                     91:     }
                     92:     else
                     93:     {
                     94:        switch (key)
                     95:        {
                     96:            case METRONOME: 
                     97:                e->u.u.type = KeyPress;
                     98:                e->u.u.detail = lastkey;
                     99:                (*dev->processInputProc)(e, dev);
                    100:                e->u.u.type = KeyRelease;
                    101:                (*dev->processInputProc)(e, dev);
                    102:                break;
                    103:            case ALLUPS: 
                    104:                idx = 7;
                    105:                e->u.u.type = KeyRelease;
                    106:                do
                    107:                {
                    108:                    if (bits = keys[idx])
                    109:                    {
                    110:                        keys[idx] = 0;
                    111:                        key = 0;
                    112:                        do
                    113:                        {
                    114:                            if (bits & 1)
                    115:                            {
                    116:                                e->u.u.detail = (idx << 5) | key;
                    117:                                (*dev->processInputProc)(e, dev);
                    118:                            }
                    119:                            key++;
                    120:                        } while (bits >>= 1);
                    121:                    }
                    122:                } while (--idx >= 0);
                    123:                break;
                    124:            case POWERUP_ERROR: 
                    125:            case KEYDOWN_ERROR: 
                    126:            case OUTPUT_ERROR: 
                    127:            case INPUT_ERROR: 
                    128:            /*      Warning ("keyboard error");    XXX */
                    129:                break;
                    130:        }
                    131:     }
                    132: }
                    133: 
                    134: /* Put keyboard in autorepeat mode and return control command string.
                    135:  * autorepeat/down: main keyboard, numeric keypad, delete, cursors
                    136:  * up/down: all others
                    137:  */
                    138: 
                    139: static void
                    140: ResetLKModes (modes)
                    141:        register int modes;
                    142: {
                    143:        register int i = 0;
                    144:        register int key, last;
                    145: 
                    146:        bzero ((caddr_t) keymodes, sizeof (keymodes));
                    147:        do {
                    148:            if (modes & 1) {
                    149:                for (key = divbeg[i], last = divend[i]; key <= last; key++)
                    150:                    keymodes[key >> 5] |= 1 << (key & 0x1f);
                    151:            }
                    152:            modes >>= 1;
                    153:        } while (++i < NUMDIVS);
                    154: }
                    155: 
                    156: char *
                    157: AutoRepeatLKMode ()
                    158: {
                    159:        ResetLKModes (0x3f38);
                    160:        return ("\212\222\232\246\256\266\272\302\316\326\336\346\356\366");
                    161: }
                    162: 
                    163: /* Put all of keyboard in down/up mode and return control command string */
                    164: 
                    165: char *
                    166: UpDownLKMode ()
                    167: {
                    168:        ResetLKModes (0x3fff);
                    169:        return ("\216\226\236\246\256\266\276\306\316\326\336\346\356\366");
                    170: }
                    171: 
                    172: Bool
                    173: LegalModifier(key)
                    174:     BYTE key;
                    175: {
                    176:     if ((key == KEY_LOCK)
                    177:      || (key == KEY_SHIFT)
                    178:      || (key == KEY_COMPOSE)
                    179:      || (key == KEY_CTRL))
                    180:         return TRUE;
                    181:     return FALSE;
                    182: }
                    183: 
                    184: void
                    185: GetLK201Mappings(pKeySyms, pModMap)
                    186:     KeySymsPtr pKeySyms;
                    187:     CARD8 *pModMap;
                    188: {
                    189: #define INDEX(in) ((in - MIN_LK201_KEY) * LK201_GLYPHS_PER_KEY)
                    190:     int i;
                    191:     KeySym *map;
                    192: 
                    193:     for (i = 0; i < MAP_LENGTH; i++)
                    194:        pModMap[i] = NoSymbol;  /* make sure it is restored */
                    195:     pModMap[ KEY_LOCK ] = LockMask;
                    196:     pModMap[ KEY_SHIFT ] = ShiftMask;
                    197:     pModMap[ KEY_CTRL ] = ControlMask;
                    198:     pModMap[ KEY_COMPOSE ] = Mod1Mask;
                    199: 
                    200:     map = (KeySym *)Xalloc(sizeof(KeySym) * 
                    201:                                    (MAP_LENGTH * LK201_GLYPHS_PER_KEY));
                    202:     pKeySyms->minKeyCode = MIN_LK201_KEY;
                    203:     pKeySyms->maxKeyCode = MAX_LK201_KEY;
                    204:     pKeySyms->mapWidth = LK201_GLYPHS_PER_KEY;
                    205:     pKeySyms->map = map;
                    206: 
                    207:     for (i = 0; i < (MAP_LENGTH * LK201_GLYPHS_PER_KEY); i++)
                    208:        map[i] = NoSymbol;      /* make sure it is restored */
                    209: 
                    210:     map[INDEX(KEY_F1)] = XK_F1;
                    211:     map[INDEX(KEY_F2)] = XK_F2;
                    212:     map[INDEX(KEY_F3)] = XK_F3;
                    213:     map[INDEX(KEY_F4)] = XK_F4;
                    214:     map[INDEX(KEY_F5)] = XK_F5;
                    215:     map[INDEX(KEY_F6)] = XK_F6;
                    216:     map[INDEX(KEY_F7)] = XK_F7;
                    217:     map[INDEX(KEY_F8)] = XK_F8;
                    218:     map[INDEX(KEY_F9)] = XK_F9;
                    219:     map[INDEX(KEY_F10)] = XK_F10;
                    220:     map[INDEX(KEY_ESC)] = XK_Escape;
                    221:     map[INDEX(KEY_F12)] = XK_BackSpace;
                    222:     map[INDEX(KEY_LF)] = XK_Linefeed;
                    223:     map[INDEX(KEY_F14)] = XK_F14;
                    224: 
                    225:     map[INDEX(KEY_HELP)] = XK_Help;
                    226:     map[INDEX(KEY_MENU)] = XK_Menu;
                    227: 
                    228:     map[INDEX(KEY_F17)] = XK_F17;
                    229:     map[INDEX(KEY_F18)] = XK_F18;
                    230:     map[INDEX(KEY_F19)] = XK_F19;
                    231:     map[INDEX(KEY_F20)] = XK_F20;
                    232: 
                    233:     map[INDEX(KEY_FIND)] = XK_Find;
                    234:     map[INDEX(KEY_INSERT_HERE)] = XK_Insert;
                    235:     map[INDEX(KEY_REMOVE)] = XK_Delete;
                    236:     map[INDEX(KEY_SELECT)] = XK_Select;
                    237:     map[INDEX(KEY_PREV_SCREEN)] = XK_Prior;
                    238:     map[INDEX(KEY_NEXT_SCREEN)] = XK_Next;
                    239: 
                    240:     map[INDEX(KEY_KP_0)] = XK_KP_0;
                    241:     map[INDEX(KEY_KP_PERIOD)] = XK_KP_Decimal;
                    242:     map[INDEX(KEY_KP_ENTER)] = XK_KP_Enter;
                    243:     map[INDEX(KEY_KP_1)] = XK_KP_1;
                    244:     map[INDEX(KEY_KP_2)] = XK_KP_2;
                    245:     map[INDEX(KEY_KP_3)] = XK_KP_3;
                    246:     map[INDEX(KEY_KP_4)] = XK_KP_4;
                    247:     map[INDEX(KEY_KP_5)] = XK_KP_5;
                    248:     map[INDEX(KEY_KP_6)] = XK_KP_6;
                    249:     map[INDEX(KEY_KP_COMMA)] = XK_KP_Separator;
                    250:     map[INDEX(KEY_KP_7)] = XK_KP_7;
                    251:     map[INDEX(KEY_KP_8)] = XK_KP_8;
                    252:     map[INDEX(KEY_KP_9)] = XK_KP_9;
                    253:     map[INDEX(KEY_KP_HYPHEN)] = XK_KP_Subtract;
                    254:     map[INDEX(KEY_KP_PF1)] = XK_KP_F1;
                    255:     map[INDEX(KEY_KP_PF2)] = XK_KP_F2;
                    256:     map[INDEX(KEY_KP_PF3)] = XK_KP_F3;
                    257:     map[INDEX(KEY_KP_PF4)] = XK_KP_F4;
                    258: 
                    259:     map[INDEX(KEY_LEFT)] = XK_Left;
                    260:     map[INDEX(KEY_RIGHT)] = XK_Right;
                    261:     map[INDEX(KEY_DOWN)] = XK_Down;
                    262:     map[INDEX(KEY_UP)] = XK_Up;
                    263: 
                    264:     map[INDEX(KEY_SHIFT)] = XK_Shift_L;
                    265:     map[INDEX(KEY_CTRL)] = XK_Control_L;
                    266:     map[INDEX(KEY_LOCK)] = XK_Caps_Lock;
                    267:     map[INDEX(KEY_COMPOSE)] = XK_Multi_key;
                    268:     map[INDEX(KEY_DELETE)] = XK_Delete;
                    269:     map[INDEX(KEY_RETURN)] = XK_Return;
                    270:     map[INDEX(KEY_TAB)] = XK_Tab;
                    271: 
                    272:     map[INDEX(KEY_TILDE)] = XK_quoteleft;
                    273:     map[INDEX(KEY_TILDE)+1] = XK_asciitilde;
                    274: 
                    275:     map[INDEX(KEY_TR_1)] = XK_1;                 
                    276:     map[INDEX(KEY_TR_1)+1] = XK_exclam;
                    277:     map[INDEX(KEY_Q)] = XK_Q;
                    278:     map[INDEX(KEY_A)] = XK_A;
                    279:     map[INDEX(KEY_Z)] = XK_Z;
                    280: 
                    281:     map[INDEX(KEY_TR_2)] = XK_2;
                    282:     map[INDEX(KEY_TR_2)+1] = XK_at;
                    283: 
                    284:     map[INDEX(KEY_W)] = XK_W;
                    285:     map[INDEX(KEY_S)] = XK_S;
                    286:     map[INDEX(KEY_X)] = XK_X;
                    287: 
                    288:     map[INDEX(KEY_LANGLE_RANGLE)] = XK_less;
                    289:     map[INDEX(KEY_LANGLE_RANGLE)+1] = XK_greater;
                    290: 
                    291:     map[INDEX(KEY_TR_3)] = XK_3;
                    292:     map[INDEX(KEY_TR_3)+1] = XK_numbersign;
                    293: 
                    294:     map[INDEX(KEY_E)] = XK_E;
                    295:     map[INDEX(KEY_D)] = XK_D;
                    296:     map[INDEX(KEY_C)] = XK_C;
                    297: 
                    298:     map[INDEX(KEY_TR_4)] = XK_4;
                    299:     map[INDEX(KEY_TR_4)+1] = XK_dollar;
                    300: 
                    301:     map[INDEX(KEY_R)] = XK_R;
                    302:     map[INDEX(KEY_F)] = XK_F;
                    303:     map[INDEX(KEY_V)] = XK_V;
                    304:     map[INDEX(KEY_SPACE)] = XK_space;
                    305: 
                    306:     map[INDEX(KEY_TR_5)] = XK_5;
                    307:     map[INDEX(KEY_TR_5)+1] = XK_percent;
                    308: 
                    309:     map[INDEX(KEY_T)] = XK_T;
                    310:     map[INDEX(KEY_G)] = XK_G;
                    311:     map[INDEX(KEY_B)] = XK_B;
                    312: 
                    313:     map[INDEX(KEY_TR_6)] = XK_6;
                    314:     map[INDEX(KEY_TR_6)+1] = XK_asciicircum;
                    315: 
                    316:     map[INDEX(KEY_Y)] = XK_Y;
                    317:     map[INDEX(KEY_H)] = XK_H;
                    318:     map[INDEX(KEY_N)] = XK_N;
                    319: 
                    320:     map[INDEX(KEY_TR_7)] = XK_7;
                    321:     map[INDEX(KEY_TR_7)+1] = XK_ampersand;
                    322: 
                    323:     map[INDEX(KEY_U)] = XK_U;
                    324:     map[INDEX(KEY_J)] = XK_J;
                    325:     map[INDEX(KEY_M)] = XK_M;
                    326: 
                    327:     map[INDEX(KEY_TR_8)] = XK_8;
                    328:     map[INDEX(KEY_TR_8)+1] = XK_asterisk;
                    329: 
                    330:     map[INDEX(KEY_I)] = XK_I;
                    331:     map[INDEX(KEY_K)] = XK_K;
                    332: 
                    333:     map[INDEX(KEY_COMMA)] = XK_comma;
                    334:     map[INDEX(KEY_COMMA)+1] = XK_less;
                    335: 
                    336:     map[INDEX(KEY_TR_9)] = XK_9;
                    337:     map[INDEX(KEY_TR_9)+1] = XK_parenleft;
                    338: 
                    339:     map[INDEX(KEY_O)] = XK_O;
                    340:     map[INDEX(KEY_L)] = XK_L;
                    341: 
                    342:     map[INDEX(KEY_PERIOD)] = XK_period;
                    343:     map[INDEX(KEY_PERIOD)+1] = XK_greater;
                    344: 
                    345:     map[INDEX(KEY_TR_0)] = XK_0;
                    346:     map[INDEX(KEY_TR_0)+1] = XK_parenright;
                    347: 
                    348:     map[INDEX(KEY_P)] = XK_P;
                    349: 
                    350:     map[INDEX(KEY_SEMICOLON)] = XK_semicolon;
                    351:     map[INDEX(KEY_SEMICOLON)+1] = XK_colon;
                    352: 
                    353:     map[INDEX(KEY_QMARK)] = XK_slash;   
                    354:     map[INDEX(KEY_QMARK)+1] = XK_question;
                    355: 
                    356:     map[INDEX(KEY_PLUS)] = XK_equal;
                    357:     map[INDEX(KEY_PLUS)+1] = XK_plus;
                    358: 
                    359:     map[INDEX(KEY_RBRACE)] = XK_bracketright;
                    360:     map[INDEX(KEY_RBRACE)+1] = XK_braceright;
                    361: 
                    362:     map[INDEX(KEY_VBAR)] = XK_backslash;
                    363:     map[INDEX(KEY_VBAR)+1] = XK_bar;
                    364: 
                    365:     map[INDEX(KEY_UBAR)] = XK_minus;
                    366:     map[INDEX(KEY_UBAR)+1] = XK_underscore;
                    367: 
                    368:     map[INDEX(KEY_LBRACE)] = XK_bracketleft;
                    369:     map[INDEX(KEY_LBRACE)+1] = XK_braceleft;
                    370: 
                    371:     map[INDEX(KEY_QUOTE)] = XK_quoteright;
                    372:     map[INDEX(KEY_QUOTE)+1] = XK_quotedbl;
                    373: #undef INDEX
                    374: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.