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

1.1       root        1: /*
                      2:  *     $Source: /u1/X/libis/RCS/events.c,v $
                      3:  *     $Header: events.c,v 1.1 86/11/17 14:33:56 swick Rel $
                      4:  */
                      5: 
                      6: #ifndef lint
                      7: static char *rcsid_events_c = "$Header: events.c,v 1.1 86/11/17 14:33:56 swick Rel $";
                      8: #endif lint
                      9: 
                     10: #include "is-copyright.h"
                     11: 
                     12: /*      events.c
                     13:  *
                     14:  *     ProcessInput    stub
                     15:  *      InputHandler   Read IS input; convert to X event
                     16:  *
                     17:  *      Copyright (c) 1986, Integrated Solutions, Inc.
                     18:  */
                     19: 
                     20: #include "Xis.h"
                     21: #include <fcntl.h>
                     22: #include "lk201.h"
                     23: #include <sys/time.h>
                     24: 
                     25: #define IBUFSIZE       512
                     26: #define KEY_MASKS      (ControlMask|MetaMask|ShiftMask|ShiftLockMask)
                     27: 
                     28: /*
                     29:  *     taken from ../X/input.c
                     30:  */
                     31: #define ShiftKeyCode   0256
                     32: #define ControlKeyCode 0257
                     33: #define LockKeyCode    0260
                     34: #define MetaKeyCode    0261
                     35: 
                     36: #define VSE_LEFT_BUTTON                0
                     37: #define VSE_MIDDLE_BUTTON      1
                     38: #define VSE_RIGHT_BUTTON       2
                     39: 
                     40: extern DEVICE  *CurrentDevice;
                     41: extern int     indev;
                     42: extern vsCursor        last_mouse;
                     43: 
                     44: int    mouse_acceleration = 1;
                     45: int    mouse_threshold;
                     46: int    invalid_mouse;
                     47: 
                     48: /*
                     49:  *     ProcessInput
                     50:  */
                     51: /*ARGSUSED*/
                     52: ProcessInput(ev)
                     53: register vsEvent *ev;
                     54: {
                     55:     /*NOTREACHED*/
                     56: }
                     57: 
                     58: /*
                     59:  *     InputHandler
                     60:  *
                     61:  *     It is assumed that read always returns complete sequences.
                     62:  *     Uses PF[1-4] to toggle ShiftKey, LockKey, ControlKey, and MetaKey.
                     63:  */
                     64: int InputHandler()
                     65: {
                     66:     unsigned char              inbuf[IBUFSIZE];
                     67:     register unsigned char     *p = inbuf;
                     68:     register int               nread;
                     69: 
                     70: #ifdef DEBUG
                     71:     fflush(stdout);
                     72: #endif
                     73: 
                     74:     fcntl(indev, F_SETFL, FNDELAY);
                     75:     if ((nread = read(indev, (char *)inbuf, IBUFSIZE)) <= 0) {
                     76:        /* no input now */
                     77:        fcntl(indev, F_SETFL, 0);
                     78:        if (invalid_mouse)
                     79:            --invalid_mouse;
                     80:        return;
                     81:     }
                     82: 
                     83:     while (p < &inbuf[nread]) {
                     84:        static unsigned mask = 0;
                     85:        vsEvent event;
                     86: 
                     87:        if (*p == VT_MOUSE) {
                     88:            /* a mouse input */
                     89:            int                 warp = 0;
                     90: 
                     91:            event.vse_device    = VSE_MOUSE;
                     92:            p++;
                     93: 
                     94:            /* which button */
                     95:            switch (*p & (VT_MOUSE_LEFT|VT_MOUSE_MIDDLE|VT_MOUSE_RIGHT)) {
                     96:            case VT_MOUSE_LEFT:
                     97:                event.vse_key = VSE_LEFT_BUTTON;
                     98:                break;
                     99:            case VT_MOUSE_MIDDLE:
                    100:                event.vse_key = VSE_MIDDLE_BUTTON;
                    101:                break;
                    102:            case VT_MOUSE_RIGHT:
                    103:                event.vse_key = VSE_RIGHT_BUTTON;
                    104:                break;
                    105:            }
                    106: 
                    107:            /* which direction */
                    108:            switch (*p++ & (VT_MOUSE_DOWN|VT_MOUSE_UP|VT_MOUSE_NOBUTTON)) {
                    109:            case VT_MOUSE_DOWN:
                    110:                event.vse_type          = VSE_BUTTON;
                    111:                event.vse_direction     = VSE_KBTDOWN;
                    112:                break;
                    113:            case VT_MOUSE_UP:
                    114:                event.vse_type          = VSE_BUTTON;
                    115:                event.vse_direction     = VSE_KBTUP;
                    116:                break;
                    117:            case VT_MOUSE_NOBUTTON:
                    118:                event.vse_type          = VSE_MMOTION;
                    119:                event.vse_direction     = VSE_KBTRAW;
                    120:                break;
                    121:            }
                    122: 
                    123:            p++; /* window */
                    124:            p++; /* pane */
                    125: 
                    126:            event.vse_x = *p++ << 8; event.vse_x |= *p++;  /* x location */
                    127:            event.vse_y = *p++ << 8; event.vse_y |= *p++;  /* y location */
                    128: 
                    129:            if (invalid_mouse && (event.vse_type == VSE_MMOTION)) {
                    130:                /* throw away buffered mouse motion events after warp */
                    131:                continue;
                    132:            }
                    133: 
                    134:            /* adjust for mouse acceleration if necessary */
                    135:            if ((mouse_acceleration > 1) && (event.vse_type == VSE_MMOTION)) {
                    136:                /* accelerated mouse */
                    137:                register int delta;
                    138:                delta = event.vse_x - last_mouse.x;
                    139:                if ((delta < -mouse_threshold) || (delta > mouse_threshold)) {
                    140:                    /* accelerate mouse in x direction */
                    141:                    register short new_x;
                    142:                    warp = 1;   /* will have to warp the mouse */
                    143:                    new_x = last_mouse.x +
                    144:                        ((delta<0?-1:1)*mouse_threshold)*(1-mouse_acceleration)
                    145:                        + (mouse_acceleration*delta);
                    146:                    /* keep warped mouse on the screen */
                    147:                    if (new_x >= ScreenPixmap.width)
                    148:                        event.vse_x = ScreenPixmap.width - 1;
                    149:                    else if (new_x < 0)
                    150:                        event.vse_x = 0;
                    151:                    else
                    152:                        event.vse_x = (unsigned short) new_x;
                    153:                }
                    154:                delta = event.vse_y - last_mouse.y;
                    155:                if ((delta < -mouse_threshold) || (delta > mouse_threshold)) {
                    156:                    /* accelerate mouse in y direction */
                    157:                    register short new_y;
                    158:                    warp = 1;   /* will have to warp the mouse */
                    159:                    new_y = last_mouse.y +
                    160:                        ((delta<0?-1:1)*mouse_threshold)*(1-mouse_acceleration)
                    161:                        + (mouse_acceleration*delta);
                    162:                    /* keep warped mouse on the screen */
                    163:                    if (new_y >= ScreenPixmap.height)
                    164:                        event.vse_y = ScreenPixmap.height - 1;
                    165:                    else if (new_y < 0)
                    166:                        event.vse_y = 0;
                    167:                    else
                    168:                        event.vse_y = (unsigned short) new_y;
                    169:                }
                    170:            }
                    171: 
                    172:            if (invalid_mouse && (event.vse_type != VSE_MMOTION)) {
                    173:                /* don't throw away buffered mouse button events after warp */
                    174:                /* but set them to warp location */
                    175:                event.vse_x = last_mouse.x;
                    176:                event.vse_y = last_mouse.y;
                    177:            }
                    178: 
                    179:            if (warp)
                    180:                SetCursorPosition((vsCursor *) &event);
                    181:            else
                    182:                UpdateCursorPosition((vsCursor *) &event);
                    183: 
                    184:            if (event.vse_type == VSE_MMOTION) {
                    185:                register vsBox *b = CurrentDevice->mbox;
                    186:                register vsCursor *m = CurrentDevice->mouse;
                    187:                /* Has it left the box? */
                    188:                if (m->y >= b->bottom || m->y < b->top ||
                    189:                    m->x >= b->right || m->x < b->left) {
                    190:                        b->bottom = 0;
                    191:                        Deal_with_movement();
                    192:                }
                    193:            } else {
                    194:                /* a mouse button press or release */
                    195:                struct timeval t;
                    196:                struct timezone tz;
                    197:                /* this is the best we can do for now */
                    198:                gettimeofday(&t, &tz);
                    199:                event.vse_time = t.tv_sec*100 + t.tv_usec/10000;
                    200:                Deal_with_input(&event);
                    201:            }
                    202:        } else {
                    203:            /* keyboard input */
                    204:            struct timeval      t;
                    205:            struct timezone     tz;
                    206:            /* this is the best we can do for now */
                    207:            gettimeofday(&t, &tz);
                    208:            event.vse_time = t.tv_sec*100 + t.tv_usec/10000;
                    209:            event.vse_type      = VSE_BUTTON;
                    210:            event.vse_device    = VSE_DKB;
                    211:            /* check for PF[1-4] (ESC O [PQRS]);  assumes that if a */
                    212:            /* complete PF escape sequence is in the buffer, it was */
                    213:            /* produced by a PF key */
                    214:            if ((&inbuf[nread] - p >= 3) &&
                    215:                (*p == '\033') && (*(p+1) == 'O') &&
                    216:                (*(p+2) >= 'P') && (*(p+2) <= 'S')) {
                    217:                /* one of Shift, Lock, Control, Meta (PF[1-4]) was pressed */
                    218:                switch (*(p+2)) {       /* toggle the appropriate key */
                    219:                case 'P':       /* PF1 -- ShiftKey */
                    220:                    mask ^= ShiftMask;
                    221:                    event.vse_key = ShiftKeyCode;
                    222:                    event.vse_direction =
                    223:                            (mask & ShiftMask) ? VSE_KBTDOWN : VSE_KBTUP;
                    224:                    break;
                    225:                case 'Q':       /* PF2 -- LockKey */
                    226:                    mask ^= ShiftLockMask;
                    227:                    event.vse_key = LockKeyCode;
                    228:                    event.vse_direction =
                    229:                            (mask & ShiftLockMask) ? VSE_KBTDOWN : VSE_KBTUP;
                    230:                    break;
                    231:                case 'R':       /* PF3 -- ControlKey */
                    232:                    mask ^= ControlMask;
                    233:                    event.vse_key = ControlKeyCode;
                    234:                    event.vse_direction =
                    235:                            (mask & ControlMask) ? VSE_KBTDOWN : VSE_KBTUP;
                    236:                    break;
                    237:                case 'S':       /* PF4 -- MetaKey */
                    238:                    mask ^= MetaMask;
                    239:                    event.vse_key = MetaKeyCode;
                    240:                    event.vse_direction =
                    241:                            (mask & MetaMask) ? VSE_KBTDOWN : VSE_KBTUP;
                    242:                    break;
                    243:                }
                    244:                p += 3;
                    245:                Deal_with_input(&event);
                    246:            } else {
                    247:                /* "normal" key */
                    248:                register unsigned short key = LK201[*p++];
                    249:                static vsEvent upkey = {0,0,0,VSE_BUTTON,0,VSE_KBTUP,VSE_DKB};
                    250:                static vsEvent dnkey = {0,0,0,VSE_BUTTON,0,VSE_KBTDOWN,VSE_DKB};
                    251:                upkey.vse_time = dnkey.vse_time = event.vse_time;
                    252: 
                    253:                /* send UP for any Shift, Lock, Control, or Meta keys down */
                    254:                /* but not if this is a Shift or Control key */
                    255:                if ((mask & ShiftMask) && !(key & ShiftMask)) {
                    256:                    upkey.vse_key = ShiftKeyCode;
                    257:                    Deal_with_input(&upkey);
                    258:                }
                    259:                if (mask & ShiftLockMask) {
                    260:                    upkey.vse_key = LockKeyCode;
                    261:                    Deal_with_input(&upkey);
                    262:                }
                    263:                if ((mask & ControlMask) && !(key & ControlMask)) {
                    264:                    upkey.vse_key = ControlKeyCode;
                    265:                    Deal_with_input(&upkey);
                    266:                }
                    267:                if (mask & MetaMask) {
                    268:                    upkey.vse_key = MetaKeyCode;
                    269:                    Deal_with_input(&upkey);
                    270:                }
                    271: 
                    272:                /* set up keyboard event */
                    273:                event.vse_key           = key & 0377;
                    274:                event.vse_direction     = VSE_KBTRAW;
                    275: 
                    276:                switch (key & KEY_MASKS) {
                    277:                case ShiftMask:
                    278:                    /* send Shift down if not down already */
                    279:                    if (!(mask & ShiftMask)) {
                    280:                        dnkey.vse_key   = ShiftKeyCode;
                    281:                        Deal_with_input(&dnkey);
                    282:                    }
                    283:                    /* send the key */
                    284:                    Deal_with_input(&event);
                    285:                    /* send Shift up */
                    286:                    upkey.vse_key = ShiftKeyCode;
                    287:                    Deal_with_input(&upkey);
                    288:                    break;
                    289:                case ControlMask:
                    290:                    /* send Control down if not down already */
                    291:                    if (!(mask & ControlMask)) {
                    292:                        dnkey.vse_key   = ControlKeyCode;
                    293:                        Deal_with_input(&dnkey);
                    294:                    }
                    295:                    /* send the key */
                    296:                    Deal_with_input(&event);
                    297:                    /* send Control up */
                    298:                    upkey.vse_key = ControlKeyCode;
                    299:                    Deal_with_input(&upkey);
                    300:                    break;
                    301:                case ShiftLockMask:
                    302:                case MetaMask:
                    303:                default:
                    304:                    /* send the key */
                    305:                    Deal_with_input(&event);
                    306:                    break;
                    307:                }
                    308: 
                    309:                mask = 0;       /* nothing should be down now */
                    310:            }
                    311:        }
                    312:        fflush(stdout);
                    313:     }
                    314:     if (invalid_mouse)
                    315:        --invalid_mouse;
                    316: }

unix.superglobalmegacorp.com

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