Annotation of 43BSDTahoe/new/X/libsun/events.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid_events_c = "$Header: events.c,v 10.4 86/12/17 20:36:45 swick Exp $";
                      3: #endif lint
                      4: #ifdef sun
                      5: /*
                      6:  * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
                      7:  * for unrestricted use provided that this legend is included on all tape
                      8:  * media and as a part of the software program in whole or part.  Users
                      9:  * may copy or modify these drivers without charge, but are not authorized
                     10:  * to license or distribute them to anyone else except as part of a product or
                     11:  * program developed by the user.
                     12:  * 
                     13:  * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
                     14:  * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
                     15:  * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
                     16:  * PRACTICE.
                     17:  *
                     18:  * The Sun X Drivers are provided with no support and without any obligation
                     19:  * on the part of Sun Microsystems, Inc. to assist in their use, correction,
                     20:  * modification or enhancement.
                     21:  * 
                     22:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
                     23:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
                     24:  * DRIVERS OR ANY PART THEREOF.
                     25:  * 
                     26:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
                     27:  * or profits or other special, indirect and consequential damages, even if
                     28:  * Sun has been advised of the possibility of such damages.
                     29:  * 
                     30:  * Sun Microsystems, Inc.
                     31:  * 2550 Garcia Avenue
                     32:  * Mountain View, California  94043
                     33:  */
                     34: 
                     35: #ifndef        lint
                     36: static char sccsid[] = "@(#)events.c 2.1 86/01/28 Copyright 1986 Sun Micro";
                     37: #endif
                     38: 
                     39: /*-
                     40:  * Copyright (c) 1986 by Sun Microsystems,  Inc.
                     41:  */
                     42: 
                     43: /*
                     44:  *     ToDo:
                     45:  *             Up events on regular keys
                     46:  */
                     47: 
                     48: #include       <stdio.h>
                     49: #include       <sys/types.h>
                     50: #include       <sys/time.h>
                     51: #include       <sys/errno.h>
                     52: #include       "../X/X.h"
                     53: #include       "../X/vsinput.h"
                     54: #include       "../X/Xdev.h"
                     55: #include       <sundev/kbd.h>
                     56: #ifdef RAW_KBD
                     57: #include       <sundev/kbio.h>
                     58: #endif
                     59: #include       <sunwindow/win_input.h>
                     60: 
                     61: #ifndef        event_is_ascii
                     62: #define        event_is_ascii(e) (e->ie_code >= ASCII_FIRST && e->ie_code <= ASCII_LAST)
                     63: #endif
                     64: #ifndef        event_is_meta
                     65: #define        event_is_meta(e) (e->ie_code >= META_FIRST && e->ie_code <= META_LAST)
                     66: #endif
                     67: /* Should be qevent.h */
                     68: #define        VSE_LEFT_BUTTON 0
                     69: #define        VSE_MIDDLE_BUTTON       1
                     70: #define        VSE_RIGHT_BUTTON        2
                     71: #define        NOT_A_KEY       9
                     72: 
                     73: extern int errno;
                     74: extern int vsdev;
                     75: extern DEVICE *CurrentDevice;
                     76: 
                     77: int sunthreshold = 0;
                     78: int sunaccel = 0;
                     79: 
                     80: #ifdef RAW_KBD
                     81: extern unsigned state_mask;
                     82: #endif
                     83: 
                     84: /*ARGSUSED*/
                     85: ProcessInput(ev)
                     86:        register vsEvent *ev;
                     87: {
                     88:        /*NOTREACHED*/
                     89: }
                     90: 
                     91: #include "lk201.h"
                     92: 
                     93: #ifdef RAW_KBD
                     94: extern struct kiockey sunkeymap[];
                     95: 
                     96: /*
                     97:  * Convert from a Sun event to an X event
                     98:  */
                     99: unsigned
                    100: ConvertEvent(se, xe)
                    101: struct inputevent *se;
                    102: vsEvent *xe;
                    103: {
                    104:     int key;
                    105:     unsigned kludgekey;
                    106:     /* Map the coordinates */
                    107:     xe->vse_x = se->ie_locx;
                    108:     xe->vse_y = se->ie_locy;
                    109:     /* Map the time stamps */
                    110:     xe->vse_time = (se->ie_time.tv_usec/10000 + se->ie_time.tv_sec);
                    111:     /* Set direction */
                    112:     xe->vse_direction = (win_inputposevent(se) ? VSE_KBTDOWN : VSE_KBTUP);
                    113:     /* Sort out the event codes */
                    114: 
                    115:     if (se->ie_code >= VKEY_FIRSTSHIFT && se->ie_code <= VKEY_LASTSHIFT) {
                    116:        /*
                    117:         * this makes ie_code between 0 and 0200 inclusive.
                    118:         */
                    119:        se->ie_code -= VKEY_FIRSTSHIFT;
                    120:        key = SHIFTKEYS + se->ie_code;
                    121:     } else if (se->ie_code >= 0 && se->ie_code < 0200)
                    122:        key = sunkeymap[se->ie_code].kio_entry;
                    123:     else
                    124:        key = -1;
                    125: 
                    126:     kludgekey = 0;
                    127:     if (key >= 0) {
                    128:        xe->vse_device = VSE_DKB;
                    129:        xe->vse_type = VSE_BUTTON;
                    130: 
                    131:        /*
                    132:         * First deal with special keycodes
                    133:         */
                    134:        if (key & 0x80) {
                    135:                switch(key & 0xf0) {
                    136:                case SHIFTKEYS:
                    137:                        /*
                    138:                         * The static count is keeping track of how many
                    139:                         * keys I have down for the given function.
                    140:                         * Only need to do this for shift and meta.
                    141:                         * On an up event I decrease the count.  If it is
                    142:                         * not the last one up then I convert to a down event
                    143:                         * which really won't do anything.  I should ignore
                    144:                         * the event, but this works.
                    145:                         * At odd times the sun keyboard gets confused and I
                    146:                         * miss an UP event.  This may get you stuck in
                    147:                         * shift mode.  I assume there is only 2 shift keys
                    148:                         * and only two meta keys.  If count ever goes above
                    149:                         * 2 I make it 2 again, assuming I have missed an up
                    150:                         * event.  If you get stuck in shifted mode, just his
                    151:                         * both shift keys and you should be fixed.
                    152:                         */
                    153:                        switch(key & 0x0f) {
                    154:                        case 11:
                    155:                        case 14:
                    156:                        case LEFTSHIFT:
                    157:                        case RIGHTSHIFT: {
                    158:                                static count;
                    159: 
                    160:                                kludgekey = 0256;
                    161: 
                    162:                                if (win_inputposevent(se)) {
                    163:                                        if (++count > 2)
                    164:                                                count = 2;
                    165:                                } else if (--count > 0)
                    166:                                        xe->vse_direction = VSE_KBTDOWN;
                    167:                                else if (count < 0)
                    168:                                        count = 0;
                    169:                                break;
                    170:                            }
                    171:                        /* LEFT/RIGHT key */
                    172:                        case 9:
                    173:                        default: {
                    174:                                static count;
                    175: 
                    176:                                kludgekey = 0261;
                    177: 
                    178:                                if (win_inputposevent(se)) {
                    179:                                        if (++count > 2)
                    180:                                                count = 2;
                    181:                                } else if (--count > 0)
                    182:                                        xe->vse_direction = VSE_KBTDOWN;
                    183:                                else if (count < 0)
                    184:                                        count = 0;
                    185:                                break;
                    186:                            }
                    187:                        case 10:
                    188:                        case 13:
                    189:                        case CAPSLOCK:
                    190:                        case SHIFTLOCK:
                    191:                                kludgekey = 0260;
                    192:                                break;
                    193:                        case 12:
                    194:                        case 15:
                    195:                        case LEFTCTRL:
                    196:                        case RIGHTCTRL:
                    197:                                kludgekey = 0257;
                    198:                                break;
                    199:                        }
                    200:                        break;
                    201:                case STRING:
                    202:                        switch(key & 0xf) {
                    203:                        default:
                    204:                        case HOMEARROW:
                    205:                                kludgekey = 0206;
                    206:                                break;
                    207:                        case UPARROW:
                    208:                                kludgekey = 0252;
                    209:                                break;
                    210:                        case DOWNARROW:
                    211:                                kludgekey = 0251;
                    212:                                break;
                    213:                        case LEFTARROW:
                    214:                                kludgekey = 0247;
                    215:                                break;
                    216:                        case RIGHTARROW:
                    217:                                kludgekey = 0250;
                    218:                                break;
                    219:                        }
                    220:                        break;
                    221:                case RIGHTFUNC:
                    222:                        kludgekey = RightKeys[key&0xf];
                    223:                        break;
                    224:                case LEFTFUNC:
                    225:                        kludgekey = LeftKeys[key&0xf];
                    226:                        break;
                    227:                case TOPFUNC:
                    228:                        kludgekey = TopKeys[key&0xf];
                    229:                        break;
                    230:                case BOTTOMFUNC:
                    231:                        kludgekey = BotKeys[key&0xf];
                    232:                        break;
                    233:                case BUCKYBITS:
                    234:                case FUNNY:
                    235:                default:
                    236:                        kludgekey = 0;
                    237:                }
                    238:        } else {
                    239:        /*
                    240:         * Now deal with regular keys.
                    241:         * Note, I look up the key in the shift/ctrl/caps tables
                    242:         * in case the keys are not quite like a lk201.
                    243:         * I assume that a regular key shifted/ctrled/caped is also a
                    244:         * regular key.  This may be naive.
                    245:         */
                    246:                if (key == '\033' /*ESC*/ )
                    247:                        kludgekey = 0161;
                    248:                else if (key == '\b')
                    249:                        kludgekey = 0162;
                    250:                else if (key == '\n')
                    251:                        kludgekey = 0163;
                    252:                else if (key == '\r')
                    253:                        kludgekey = 0275;
                    254:                else if (key == '\t')
                    255:                        kludgekey = 0276;
                    256:                else if (key == '\006' /*ALT*/)
                    257:                        kludgekey = 0245;
                    258:                else if (key == '\177' /*DEL*/)
                    259:                        kludgekey = 0274;
                    260:                else if(state_mask & ControlMask)
                    261:                        kludgekey = LK201[sunkeymap[se->ie_code+00200].kio_entry];
                    262:                else if(state_mask & ShiftMask)
                    263:                        kludgekey = LK201[sunkeymap[se->ie_code+00600].kio_entry];
                    264:                else if(state_mask & ShiftLockMask)
                    265:                        kludgekey = LK201[sunkeymap[se->ie_code+00400].kio_entry];
                    266:                else
                    267:                        kludgekey = LK201[key];
                    268:        }
                    269:        xe->vse_key = kludgekey & 0377;
                    270:        kludgekey &= (~state_mask)&(ControlMask|ShiftMask);
                    271:     } else switch (se->ie_code) {
                    272:        case LOC_MOVE:
                    273:            xe->vse_device = VSE_MOUSE;  /* XXX - should query shift state here but ... */
                    274:            xe->vse_type = VSE_MMOTION;
                    275:            break;
                    276:        case MS_LEFT:
                    277:            xe->vse_key = VSE_LEFT_BUTTON;
                    278:            xe->vse_device = VSE_MOUSE;
                    279:            xe->vse_type = VSE_BUTTON;
                    280:            break;
                    281:        case MS_MIDDLE:
                    282:            xe->vse_device = VSE_MOUSE;
                    283:            xe->vse_type = VSE_BUTTON;
                    284:            xe->vse_key = VSE_MIDDLE_BUTTON;
                    285:            break;
                    286:        case MS_RIGHT:
                    287:            xe->vse_key = VSE_RIGHT_BUTTON;
                    288:            xe->vse_device = VSE_MOUSE;
                    289:            xe->vse_type = VSE_BUTTON;
                    290:            break;
                    291:        default:
                    292:            xe->vse_key = NOT_A_KEY;
                    293:            xe->vse_device = VSE_MOUSE;
                    294:            xe->vse_type = VSE_BUTTON;
                    295:            break;
                    296:     }
                    297:     return(kludgekey);
                    298: }
                    299: 
                    300: #define        INPBUFSIZE      128
                    301: 
                    302: /*
                    303:  * Read pending input events
                    304:  */
                    305: InputReader()
                    306: {
                    307:     struct inputevent sunevents[INPBUFSIZE];
                    308:     int         n, m;
                    309: 
                    310:     if ((n = read(vsdev, sunevents, INPBUFSIZE * sizeof sunevents[0])) < 0
                    311:        && errno != EWOULDBLOCK) {
                    312:        /*
                    313:         * Error reading events 
                    314:         */
                    315:        /* XXX_DO_SOMETHING(); */
                    316:        return;
                    317:     }
                    318:     for (n /= sizeof sunevents[0], m = 0; m < n; m++) {
                    319:        vsEvent Xevent;
                    320: 
                    321:        unsigned kludgekey = ConvertEvent(&(sunevents[m]), &Xevent);
                    322: 
                    323:        if (Xevent.vse_type == VSE_MMOTION) {
                    324:            if (sunthreshold) {
                    325:                int dx = Xevent.vse_x - CurrentDevice->mouse->x;
                    326:                int dy = Xevent.vse_y - CurrentDevice->mouse->y;
                    327: 
                    328:                if (sunthreshold <= (dx > 0 ? dx : -dx) + (dy > 0 ? dy : -dy)) {
                    329:                        Xevent.vse_x = CurrentDevice->mouse->x + dx * sunaccel;
                    330:                        Xevent.vse_y = CurrentDevice->mouse->y + dy * sunaccel;
                    331:                }
                    332:        
                    333:            }
                    334:            SetCursorPosition((vsCursor *) &Xevent);    /* XXX - tacky */
                    335:        }
                    336: 
                    337:        Xevent.vse_key;
                    338: 
                    339:        if (Xevent.vse_type == VSE_MMOTION) {
                    340:            register vsBox *b = CurrentDevice->mbox;
                    341:            register vsCursor *m = CurrentDevice->mouse;
                    342:            /*
                    343:             * Has it left the box? 
                    344:             */
                    345:            if (m->y >= b->bottom || m->y < b->top ||
                    346:                m->x >= b->right || m->x < b->left) {
                    347:                    b->bottom = 0;
                    348:                    Deal_with_movement();
                    349:            }
                    350:        } else if (Xevent.vse_key != NOT_A_KEY ||
                    351:                        Xevent.vse_device != VSE_MOUSE) {
                    352:            state_mask |= kludgekey;
                    353:            Deal_with_input(&Xevent);
                    354:            state_mask &= ~kludgekey;
                    355:        }
                    356:     }
                    357: }
                    358: #else
                    359: static int
                    360: SunToXKeyCode(s)
                    361: int s;
                    362: {
                    363:     register int ret = LK201[s&0177];
                    364:     char *c = "^.";
                    365:     char *f = ".";
                    366: 
                    367:     c[1] = (s&0177)|0100;
                    368:     f[0] = (s&0177);
                    369: 
                    370:     return(ret);
                    371: }
                    372: 
                    373: /*
                    374:  * Convert from a Sun event to an X event
                    375:  */
                    376: int
                    377: ConvertEvent(se, xe)
                    378: struct inputevent *se;
                    379: vsEvent *xe;
                    380: {
                    381:     static unsigned lstate_mask;
                    382: 
                    383:     /* Map the coordinates */
                    384:     xe->vse_x = se->ie_locx;
                    385:     xe->vse_y = se->ie_locy;
                    386:     /* Map the time stamps */
                    387:     xe->vse_time = (se->ie_time.tv_usec/10000 + se->ie_time.tv_sec);
                    388:     /* Set direction */
                    389:     xe->vse_direction = (win_inputposevent(se) ? VSE_KBTDOWN : VSE_KBTUP);
                    390:     /* Sort out the event codes */
                    391:     if (event_is_ascii(se)) {
                    392:        /* ASCII keystroke */
                    393:        int key = SunToXKeyCode(se->ie_code);
                    394:        xe->vse_key = (key & 0377);
                    395:        xe->vse_device = VSE_DKB;
                    396:        xe->vse_type = VSE_BUTTON;
                    397:        lstate_mask = (lstate_mask & ~(ControlMask|MetaMask|ShiftMask))
                    398:            | (key & (ControlMask|MetaMask|ShiftMask));
                    399:     } else if (event_is_meta(se)) {
                    400:        /* META keystroke - map to ASCII for now */
                    401:        int key = SunToXKeyCode(se->ie_code - META_FIRST + ASCII_FIRST) | MetaMask;
                    402:        xe->vse_key = (key & 0377);
                    403:        xe->vse_device = VSE_DKB;
                    404:        xe->vse_type = VSE_BUTTON;
                    405:        lstate_mask = (lstate_mask & ~(ControlMask|MetaMask|ShiftMask))
                    406:            | (key & (ControlMask|MetaMask|ShiftMask));
                    407:     } else switch (se->ie_code) {
                    408:        case LOC_MOVE:
                    409:            xe->vse_device = VSE_MOUSE;         /* XXX - should query shift state here but ... */
                    410:            xe->vse_type = VSE_MMOTION;
                    411:            break;
                    412:        case MS_LEFT:
                    413:            xe->vse_key = VSE_LEFT_BUTTON;
                    414:            xe->vse_device = VSE_MOUSE;
                    415:            xe->vse_type = VSE_BUTTON;
                    416:            if (xe->vse_direction == VSE_KBTUP)
                    417:                lstate_mask &= ~LeftMask;
                    418:            else
                    419:                lstate_mask |= LeftMask;
                    420:            goto ShiftKeys;
                    421:        case MS_MIDDLE:
                    422:            xe->vse_device = VSE_MOUSE;
                    423:            xe->vse_type = VSE_BUTTON;
                    424:            xe->vse_key = VSE_MIDDLE_BUTTON;
                    425:            if (xe->vse_direction == VSE_KBTUP)
                    426:                lstate_mask &= ~MiddleMask;
                    427:            else
                    428:                lstate_mask |= MiddleMask;
                    429:            goto ShiftKeys;
                    430:        case MS_RIGHT:
                    431:            xe->vse_key = VSE_RIGHT_BUTTON;
                    432:            xe->vse_device = VSE_MOUSE;
                    433:            xe->vse_type = VSE_BUTTON;
                    434:            if (xe->vse_direction == VSE_KBTUP)
                    435:                lstate_mask &= ~RightMask;
                    436:            else
                    437:                lstate_mask |= RightMask;
                    438:            goto ShiftKeys;
                    439:        default:
                    440:            xe->vse_key = NOT_A_KEY;
                    441:            xe->vse_device = VSE_MOUSE;
                    442:            xe->vse_type = VSE_BUTTON;
                    443:            if (xe->vse_direction == VSE_KBTUP)
                    444:                lstate_mask &= ~ShiftLockMask;
                    445:            else
                    446:                lstate_mask |= ShiftLockMask;
                    447: ShiftKeys:
                    448:            if (se->ie_shiftmask & SHIFTMASK)
                    449:                lstate_mask |= ShiftMask;
                    450:            else
                    451:                lstate_mask &= ~ShiftMask;
                    452:            if (se->ie_shiftmask & CTRLMASK)
                    453:                lstate_mask |= ControlMask;
                    454:            else
                    455:                lstate_mask &= ~ControlMask;
                    456: #ifdef META_SHIFT_MASK
                    457:            if (se->ie_shiftmask & META_SHIFT_MASK)
                    458:                lstate_mask |= MetaMask;
                    459:            else
                    460:                lstate_mask &= ~MetaMask;
                    461: #endif
                    462:            break;
                    463:     }
                    464:     return (lstate_mask);
                    465: }
                    466: 
                    467: #define        INPBUFSIZE      128
                    468: 
                    469: /*
                    470:  * Read pending input events
                    471:  */
                    472: InputReader()
                    473: {
                    474:     struct inputevent sunevents[INPBUFSIZE];
                    475:     int         n, m;
                    476:     static int last_mask;
                    477: 
                    478:     if ((n = read(vsdev, sunevents, INPBUFSIZE * sizeof sunevents[0])) < 0
                    479:        && errno != EWOULDBLOCK) {
                    480:        /*
                    481:         * Error reading events 
                    482:         */
                    483:        /* XXX_DO_SOMETHING(); */
                    484:        return;
                    485:     }
                    486:     for (n /= sizeof sunevents[0], m = 0; m < n; m++) {
                    487:        vsEvent Xevent, Sevent;
                    488:        int mask;
                    489: 
                    490:        mask = ConvertEvent(&(sunevents[m]), &Xevent);
                    491:        if (Xevent.vse_type == VSE_MMOTION) {
                    492:            if (sunthreshold) {
                    493:                int dx = Xevent.vse_x - CurrentDevice->mouse->x;
                    494:                int dy = Xevent.vse_y - CurrentDevice->mouse->y;
                    495: 
                    496:                if (sunthreshold <= (dx > 0 ? dx : -dx) + (dy > 0 ? dy : -dy)) {
                    497:                        Xevent.vse_x = CurrentDevice->mouse->x + dx * sunaccel;
                    498:                        Xevent.vse_y = CurrentDevice->mouse->y + dy * sunaccel;
                    499:                }
                    500:        
                    501:            }
                    502:            SetCursorPosition((vsCursor *) &Xevent);    /* XXX - tacky */
                    503:        }
                    504: 
                    505:        if (mask != last_mask) {
                    506:            last_mask ^= mask;
                    507:            Sevent.vse_device = VSE_DKB;
                    508:            Sevent.vse_x = Xevent.vse_x;
                    509:            Sevent.vse_y = Xevent.vse_y;
                    510:            Sevent.vse_time = Xevent.vse_time;
                    511:            if (last_mask & ShiftMask) {
                    512:                if (mask & ShiftMask)
                    513:                    Sevent.vse_direction = VSE_KBTDOWN;
                    514:                else
                    515:                    Sevent.vse_direction = VSE_KBTUP;
                    516:                Sevent.vse_key = 0256;
                    517:                Deal_with_input(&Sevent);
                    518:            }
                    519:            if (last_mask & ControlMask) {
                    520:                if (mask & ControlMask)
                    521:                    Sevent.vse_direction = VSE_KBTDOWN;
                    522:                else
                    523:                    Sevent.vse_direction = VSE_KBTUP;
                    524:                Sevent.vse_key = 0257;
                    525:                Deal_with_input(&Sevent);
                    526:            }
                    527:            if (last_mask & ShiftLockMask) {
                    528:                if (mask & ShiftLockMask)
                    529:                    Sevent.vse_direction = VSE_KBTDOWN;
                    530:                else
                    531:                    Sevent.vse_direction = VSE_KBTUP;
                    532:                Sevent.vse_key = 0260;
                    533:                Deal_with_input(&Sevent);
                    534:            }
                    535:            if (last_mask & MetaMask) {
                    536:                if (mask & MetaMask)
                    537:                    Sevent.vse_direction = VSE_KBTDOWN;
                    538:                else
                    539:                    Sevent.vse_direction = VSE_KBTUP;
                    540:                Sevent.vse_key = 0261;
                    541:                Deal_with_input(&Sevent);
                    542:            }
                    543:            last_mask = mask;
                    544:        }
                    545:        if (Xevent.vse_type == VSE_MMOTION) {
                    546:            register vsBox *b = CurrentDevice->mbox;
                    547:            register vsCursor *m = CurrentDevice->mouse;
                    548:            /*
                    549:             * Has it left the box? 
                    550:             */
                    551:            if (m->y >= b->bottom || m->y < b->top ||
                    552:                m->x >= b->right || m->x < b->left) {
                    553:                    b->bottom = 0;
                    554:                    Deal_with_movement();
                    555:            }
                    556:        } else if (Xevent.vse_key != NOT_A_KEY ||
                    557:                        Xevent.vse_device != VSE_MOUSE)
                    558:            Deal_with_input(&Xevent);
                    559:     }
                    560: }
                    561: #endif
                    562: #endif sun

unix.superglobalmegacorp.com

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