Annotation of 43BSDTahoe/new/X/libis/events.c, revision 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.