|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T e ┃
Length: 8368 (0x20b0) Types: TextFile Names: »events.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/libis/events.c«
/* * $Source: /u1/X/libis/RCS/events.c,v $ * $Header: events.c,v 1.1 86/11/17 14:33:56 swick Rel $ */ #ifndef lint static char *rcsid_events_c = "$Header: events.c,v 1.1 86/11/17 14:33:56 swick Rel $"; #endif lint #include "is-copyright.h" /* events.c * * ProcessInput stub * InputHandler Read IS input; convert to X event * * Copyright (c) 1986, Integrated Solutions, Inc. */ #include "Xis.h" #include <fcntl.h> #include "lk201.h" #include <sys/time.h> #define IBUFSIZE 512 #define KEY_MASKS (ControlMask|MetaMask|ShiftMask|ShiftLockMask) /* * taken from ../X/input.c */ #define ShiftKeyCode 0256 #define ControlKeyCode 0257 #define LockKeyCode 0260 #define MetaKeyCode 0261 #define VSE_LEFT_BUTTON 0 #define VSE_MIDDLE_BUTTON 1 #define VSE_RIGHT_BUTTON 2 extern DEVICE *CurrentDevice; extern int indev; extern vsCursor last_mouse; int mouse_acceleration = 1; int mouse_threshold; int invalid_mouse; /* * ProcessInput */ /*ARGSUSED*/ ProcessInput(ev) register vsEvent *ev; { /*NOTREACHED*/ } /* * InputHandler * * It is assumed that read always returns complete sequences. * Uses PF[1-4] to toggle ShiftKey, LockKey, ControlKey, and MetaKey. */ int InputHandler() { unsigned char inbuf[IBUFSIZE]; register unsigned char *p = inbuf; register int nread; #ifdef DEBUG fflush(stdout); #endif fcntl(indev, F_SETFL, FNDELAY); if ((nread = read(indev, (char *)inbuf, IBUFSIZE)) <= 0) { /* no input now */ fcntl(indev, F_SETFL, 0); if (invalid_mouse) --invalid_mouse; return; } while (p < &inbuf[nread]) { static unsigned mask = 0; vsEvent event; if (*p == VT_MOUSE) { /* a mouse input */ int warp = 0; event.vse_device = VSE_MOUSE; p++; /* which button */ switch (*p & (VT_MOUSE_LEFT|VT_MOUSE_MIDDLE|VT_MOUSE_RIGHT)) { case VT_MOUSE_LEFT: event.vse_key = VSE_LEFT_BUTTON; break; case VT_MOUSE_MIDDLE: event.vse_key = VSE_MIDDLE_BUTTON; break; case VT_MOUSE_RIGHT: event.vse_key = VSE_RIGHT_BUTTON; break; } /* which direction */ switch (*p++ & (VT_MOUSE_DOWN|VT_MOUSE_UP|VT_MOUSE_NOBUTTON)) { case VT_MOUSE_DOWN: event.vse_type = VSE_BUTTON; event.vse_direction = VSE_KBTDOWN; break; case VT_MOUSE_UP: event.vse_type = VSE_BUTTON; event.vse_direction = VSE_KBTUP; break; case VT_MOUSE_NOBUTTON: event.vse_type = VSE_MMOTION; event.vse_direction = VSE_KBTRAW; break; } p++; /* window */ p++; /* pane */ event.vse_x = *p++ << 8; event.vse_x |= *p++; /* x location */ event.vse_y = *p++ << 8; event.vse_y |= *p++; /* y location */ if (invalid_mouse && (event.vse_type == VSE_MMOTION)) { /* throw away buffered mouse motion events after warp */ continue; } /* adjust for mouse acceleration if necessary */ if ((mouse_acceleration > 1) && (event.vse_type == VSE_MMOTION)) { /* accelerated mouse */ register int delta; delta = event.vse_x - last_mouse.x; if ((delta < -mouse_threshold) || (delta > mouse_threshold)) { /* accelerate mouse in x direction */ register short new_x; warp = 1; /* will have to warp the mouse */ new_x = last_mouse.x + ((delta<0?-1:1)*mouse_threshold)*(1-mouse_acceleration) + (mouse_acceleration*delta); /* keep warped mouse on the screen */ if (new_x >= ScreenPixmap.width) event.vse_x = ScreenPixmap.width - 1; else if (new_x < 0) event.vse_x = 0; else event.vse_x = (unsigned short) new_x; } delta = event.vse_y - last_mouse.y; if ((delta < -mouse_threshold) || (delta > mouse_threshold)) { /* accelerate mouse in y direction */ register short new_y; warp = 1; /* will have to warp the mouse */ new_y = last_mouse.y + ((delta<0?-1:1)*mouse_threshold)*(1-mouse_acceleration) + (mouse_acceleration*delta); /* keep warped mouse on the screen */ if (new_y >= ScreenPixmap.height) event.vse_y = ScreenPixmap.height - 1; else if (new_y < 0) event.vse_y = 0; else event.vse_y = (unsigned short) new_y; } } if (invalid_mouse && (event.vse_type != VSE_MMOTION)) { /* don't throw away buffered mouse button events after warp */ /* but set them to warp location */ event.vse_x = last_mouse.x; event.vse_y = last_mouse.y; } if (warp) SetCursorPosition((vsCursor *) &event); else UpdateCursorPosition((vsCursor *) &event); if (event.vse_type == VSE_MMOTION) { register vsBox *b = CurrentDevice->mbox; register vsCursor *m = CurrentDevice->mouse; /* Has it left the box? */ if (m->y >= b->bottom || m->y < b->top || m->x >= b->right || m->x < b->left) { b->bottom = 0; Deal_with_movement(); } } else { /* a mouse button press or release */ struct timeval t; struct timezone tz; /* this is the best we can do for now */ gettimeofday(&t, &tz); event.vse_time = t.tv_sec*100 + t.tv_usec/10000; Deal_with_input(&event); } } else { /* keyboard input */ struct timeval t; struct timezone tz; /* this is the best we can do for now */ gettimeofday(&t, &tz); event.vse_time = t.tv_sec*100 + t.tv_usec/10000; event.vse_type = VSE_BUTTON; event.vse_device = VSE_DKB; /* check for PF[1-4] (ESC O [PQRS]); assumes that if a */ /* complete PF escape sequence is in the buffer, it was */ /* produced by a PF key */ if ((&inbuf[nread] - p >= 3) && (*p == '\033') && (*(p+1) == 'O') && (*(p+2) >= 'P') && (*(p+2) <= 'S')) { /* one of Shift, Lock, Control, Meta (PF[1-4]) was pressed */ switch (*(p+2)) { /* toggle the appropriate key */ case 'P': /* PF1 -- ShiftKey */ mask ^= ShiftMask; event.vse_key = ShiftKeyCode; event.vse_direction = (mask & ShiftMask) ? VSE_KBTDOWN : VSE_KBTUP; break; case 'Q': /* PF2 -- LockKey */ mask ^= ShiftLockMask; event.vse_key = LockKeyCode; event.vse_direction = (mask & ShiftLockMask) ? VSE_KBTDOWN : VSE_KBTUP; break; case 'R': /* PF3 -- ControlKey */ mask ^= ControlMask; event.vse_key = ControlKeyCode; event.vse_direction = (mask & ControlMask) ? VSE_KBTDOWN : VSE_KBTUP; break; case 'S': /* PF4 -- MetaKey */ mask ^= MetaMask; event.vse_key = MetaKeyCode; event.vse_direction = (mask & MetaMask) ? VSE_KBTDOWN : VSE_KBTUP; break; } p += 3; Deal_with_input(&event); } else { /* "normal" key */ register unsigned short key = LK201[*p++]; static vsEvent upkey = {0,0,0,VSE_BUTTON,0,VSE_KBTUP,VSE_DKB}; static vsEvent dnkey = {0,0,0,VSE_BUTTON,0,VSE_KBTDOWN,VSE_DKB}; upkey.vse_time = dnkey.vse_time = event.vse_time; /* send UP for any Shift, Lock, Control, or Meta keys down */ /* but not if this is a Shift or Control key */ if ((mask & ShiftMask) && !(key & ShiftMask)) { upkey.vse_key = ShiftKeyCode; Deal_with_input(&upkey); } if (mask & ShiftLockMask) { upkey.vse_key = LockKeyCode; Deal_with_input(&upkey); } if ((mask & ControlMask) && !(key & ControlMask)) { upkey.vse_key = ControlKeyCode; Deal_with_input(&upkey); } if (mask & MetaMask) { upkey.vse_key = MetaKeyCode; Deal_with_input(&upkey); } /* set up keyboard event */ event.vse_key = key & 0377; event.vse_direction = VSE_KBTRAW; switch (key & KEY_MASKS) { case ShiftMask: /* send Shift down if not down already */ if (!(mask & ShiftMask)) { dnkey.vse_key = ShiftKeyCode; Deal_with_input(&dnkey); } /* send the key */ Deal_with_input(&event); /* send Shift up */ upkey.vse_key = ShiftKeyCode; Deal_with_input(&upkey); break; case ControlMask: /* send Control down if not down already */ if (!(mask & ControlMask)) { dnkey.vse_key = ControlKeyCode; Deal_with_input(&dnkey); } /* send the key */ Deal_with_input(&event); /* send Control up */ upkey.vse_key = ControlKeyCode; Deal_with_input(&upkey); break; case ShiftLockMask: case MetaMask: default: /* send the key */ Deal_with_input(&event); break; } mask = 0; /* nothing should be down now */ } } fflush(stdout); } if (invalid_mouse) --invalid_mouse; }