|
|
1.1 ! root 1: #define NEED_EVENTS ! 2: #include "sun.h" ! 3: #include <sys/ioctl.h> ! 4: ! 5: extern int lastEventTime; ! 6: static void sunMouseCtrl(); ! 7: static int sunMouseGetMotionEvents(); ! 8: ! 9: static PtrPrivRec sysMousePriv = { ! 10: 0, /* Current X coordinate of pointer */ ! 11: 0, /* Current Y coordinate */ ! 12: NULL, /* Screen pointer is on */ ! 13: }; ! 14: int sunMousefd = -1; ! 15: ! 16: int ! 17: sunMouseProc (pMouse, what) ! 18: DevicePtr pMouse; /* Mouse to play with */ ! 19: int what; /* What to do with it */ ! 20: { ! 21: register int fd; ! 22: int format; ! 23: static int oformat; ! 24: BYTE map[4]; ! 25: struct ttydevb tspeed; ! 26: ! 27: switch (what) { ! 28: case DEVICE_INIT: ! 29: if (pMouse != LookupPointerDevice()) { ! 30: ErrorF ("Cannot open non-system mouse"); ! 31: return (!Success); ! 32: } ! 33: ! 34: if (sunMousefd >= 0) { ! 35: fd = sunMousefd; ! 36: } else { ! 37: fd = open ("/dev/mouse", 0); ! 38: if (fd < 0) { ! 39: Error ("Opening /dev/mouse"); ! 40: return (!Success); ! 41: } ! 42: sunMousefd = fd; ! 43: ioctl(sunMousefd, TIOCGDEV, &tspeed); ! 44: tspeed.ispeed = tspeed.ospeed = B1200; ! 45: ioctl(sunMousefd, TIOCSDEV, &tspeed); ! 46: } ! 47: ! 48: sysMousePriv.pScreen = &screenInfo.screen[0]; ! 49: sysMousePriv.x = sysMousePriv.pScreen->width / 2; ! 50: sysMousePriv.y = sysMousePriv.pScreen->height / 2; ! 51: ! 52: pMouse->devicePrivate = (pointer) &sysMousePriv; ! 53: pMouse->on = FALSE; ! 54: map[1] = 1; ! 55: map[2] = 2; ! 56: map[3] = 3; ! 57: InitPointerDeviceStruct( ! 58: pMouse, map, 3, sunMouseGetMotionEvents, sunMouseCtrl); ! 59: break; ! 60: ! 61: case DEVICE_ON: ! 62: AddEnabledDevice (sunMousefd); ! 63: pMouse->on = TRUE; ! 64: break; ! 65: ! 66: case DEVICE_CLOSE: ! 67: break; ! 68: ! 69: case DEVICE_OFF: ! 70: pMouse->on = FALSE; ! 71: RemoveEnabledDevice (sunMousefd); ! 72: break; ! 73: } ! 74: return (Success); ! 75: } ! 76: ! 77: static void ! 78: sunMouseCtrl (pMouse) ! 79: DevicePtr pMouse; ! 80: { ! 81: } ! 82: ! 83: static int ! 84: sunMouseGetMotionEvents (buff, start, stop) ! 85: CARD32 start, stop; ! 86: xTimecoord *buff; ! 87: { ! 88: return 0; ! 89: } ! 90: ! 91: static short ! 92: MouseAccelerate (pMouse, delta) ! 93: DevicePtr pMouse; ! 94: int delta; ! 95: { ! 96: register int sgn = sign(delta); ! 97: register PtrCtrl *pCtrl; ! 98: ! 99: delta = abs(delta); ! 100: pCtrl = &((DeviceIntPtr) pMouse)->u.ptr.ctrl; ! 101: ! 102: if (delta > pCtrl->threshold) { ! 103: return ((short) (sgn * (pCtrl->threshold + ! 104: ((delta - pCtrl->threshold) * pCtrl->num) / ! 105: pCtrl->den))); ! 106: } else { ! 107: return ((short) (sgn * delta)); ! 108: } ! 109: } ! 110: ! 111: void ! 112: sunMouseEvent(pMouse) ! 113: DevicePtr pMouse; ! 114: { ! 115: register i; ! 116: static char rbuf[512]; ! 117: static mstate, buttons, changebuttons; ! 118: static deltax, deltay; ! 119: int mousemoved = 0; ! 120: char *tail; ! 121: register char c, *cp; ! 122: ! 123: if ((i = read (sunMousefd, rbuf, sizeof(rbuf))) < 0) ! 124: FatalError ("Could not read from mouse"); ! 125: ! 126: tail = &rbuf[i]; ! 127: for (cp = rbuf; cp != tail; mstate++) { ! 128: c = *cp++; ! 129: ! 130: /* ! 131: * State Machine - corresponds to the 5 bytes of the ! 132: * Microport mouse. ! 133: */ ! 134: switch(mstate) { ! 135: case 0: ! 136: if ((c & 0xf0) == 0x80) { ! 137: i = ~c & 0x7; ! 138: changebuttons = buttons ^ i; ! 139: buttons = i; ! 140: } else ! 141: mstate--; ! 142: break; ! 143: case 1: ! 144: deltax = c; ! 145: break; ! 146: case 2: ! 147: deltay = c; ! 148: break; ! 149: case 3: ! 150: deltax += c; ! 151: break; ! 152: case 4: ! 153: deltay += c; ! 154: /* The mouse moved */ ! 155: if (deltax || deltay) { ! 156: if (deltax) ! 157: sysMousePriv.x += MouseAccelerate (pMouse, deltax); ! 158: if (deltay) ! 159: sysMousePriv.y -= MouseAccelerate (pMouse, deltay); ! 160: if (sunConstrainXY (&sysMousePriv.x, &sysMousePriv.y)) ! 161: mousemoved++; ! 162: } ! 163: /* Buttons changed states */ ! 164: if (changebuttons) { ! 165: if (mousemoved) { ! 166: sunmkX(pMouse, MotionNotify, 0); ! 167: mousemoved = 0; ! 168: } ! 169: for (i = 0; i < 3; i++) { ! 170: if (changebuttons & (1 << i)) { ! 171: int type; ! 172: if (buttons & (1 << i)) ! 173: type = ButtonPress; ! 174: else ! 175: type = ButtonRelease; ! 176: sunmkX(pMouse, type, 3 - i); ! 177: } ! 178: } ! 179: } ! 180: mstate = -1; ! 181: break; ! 182: } ! 183: } ! 184: if (mousemoved) ! 185: sunmkX(pMouse, MotionNotify, 0); ! 186: } ! 187: ! 188: /* ! 189: * Send a mouse of keyboard X event to dix ! 190: */ ! 191: sunmkX(pDev, type, detail) ! 192: DevicePtr pDev; ! 193: { ! 194: xEvent xE; ! 195: ! 196: if (type == MotionNotify) ! 197: sunMoveCursor (sysMousePriv.pScreen, ! 198: sysMousePriv.x, sysMousePriv.y); ! 199: xE.u.u.type = type; ! 200: xE.u.u.detail = detail; ! 201: xE.u.keyButtonPointer.rootX = sysMousePriv.x; ! 202: xE.u.keyButtonPointer.rootY = sysMousePriv.y; ! 203: xE.u.keyButtonPointer.time = ++lastEventTime; ! 204: (*pDev->processInputProc) (&xE, pDev); ! 205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.