|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.