📄 mouse_2.c
字号:
int bytesread; int i, wheel; static unsigned int prev = 0; static int but = 0; /* static is hack for MouseMan */ static int mouse_orientation = 0; int dx = 0, dy = 0, dz = 0, drx = 0, dry = 0, drz = 0; int ax = 0, ay = 0; static int oldax = 0, olday = 0, nodev = 0; int j; char SpaceWare[] = "SpaceWare!"; if (ms.fd == -1) return -1;again: if (ms.fd_mode == 1) { /* We don't want to wait, set NDELAY mode. */ fcntl(ms.fd, F_SETFL, O_RDONLY | O_NDELAY ); ms.fd_mode = 0; } bytesread = read(ms.fd, &buf[nu_bytes], MOUSEBUFFERSIZE - nu_bytes); i = 0; if (bytesread >= 1) nu_bytes += bytesread;#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : #bytes in buffer: %d", nu_bytes);#endifhandle_packets: /* Handle packets in buffer. */#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : Bytes left in buffer: %d at %d, packet is %d bytes", nu_bytes - i, i, mouse_proto[ms.type][4]); if (nu_bytes - i > 0) debugf(DSER, "MOUSE : Header byte: %c %d", (buf[i] & 0177), buf[i]);#endif if ((ms.type == MOUSE_LOGIMAN) && ((nu_bytes - i) >= 1) && ((buf[i] & mouse_proto[ms.type][0]) != mouse_proto[ms.type][1]) && ((char) (buf[i] & ~0x33) == 0)) { /* s/23/33/, for 4-but trackman */ /* Hack-o-matic, stolen from xf86_Mouse.c */ but = ((buf[i] & 0x20) >> 4) | ((buf[i] & 0x10) >> 1) | (but & 0x05); mouse_handler(but, 0, 0, 0, 0, 0, 0); event_handled++; i++; } if ((ms.type == MOUSE_SPACEBALL)) { j = i; while ((nu_bytes - j > 0) && (buf[j]!=13)) j++; nu_packets=(buf[j]==13); } else { nu_packets = 1; } if ((nu_packets==0)||(nu_bytes - i < mouse_proto[ms.type][4])) { /* No full packet available. */ if (wait == 0 || (wait == 1 && event_handled)) { if (i >= nu_bytes) { nu_bytes = 0; i = 0; } else { /* Move partial packet to front of buffer. */ for (j = i; j < nu_bytes; j++) buf[j - i] = buf[j]; nu_bytes -= i; } return event_handled; } else { /* (wait == 1 && !event_handled) */ if (i >= nu_bytes) { nu_bytes = 0; i = 0; } /* Wait mode, we'll sleep on reads. */ fcntl(ms.fd, F_SETFL, O_RDONLY); ms.fd_mode = 1; read(ms.fd, &buf[nu_bytes], 1); if ((ms.type == MOUSE_SPACEBALL)) { nu_packets=(buf[nu_bytes]==13); } else { nu_packets=1; } nu_bytes++; if ((nu_packets==0)||(nu_bytes - i < mouse_proto[ms.type][4])) /* Not a complete packet. */ goto again; } } /* Check header byte. */ if ((buf[i] & mouse_proto[ms.type][0]) != mouse_proto[ms.type][1]) { /* Not a header byte. */#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : Bad header byte: %c %d", (buf[i] & 0177), buf[i]);#endif i++; goto handle_packets; } /* Check whether it's a valid data packet. */ if ((ms.type != MOUSE_PS2)&&(ms.type != MOUSE_IMPS2) && (ms.type != MOUSE_EXPPS2)&&(ms.type != MOUSE_SPACEBALL) && (ms.type != MOUSE_WACOM_GRAPHIRE) && (ms.type != MOUSE_DRMOUSE4DS)) for (j = 1; j < mouse_proto[ms.type][4]; j++) if ((buf[i + j] & mouse_proto[ms.type][2]) != mouse_proto[ms.type][3] || buf[i + j] == 0x80) { i = i + j + 1; goto handle_packets; } /* Construct the event. */ switch (ms.type) {#if defined(MS3B) case MOUSE_MICROSOFT: /* Microsoft */ but = (but & 8) | ((buf[i] & 0x20) >> 3) | ((buf[i] & 0x10) >> 4); dx = (char) (((buf[i] & 0x03) << 6) | (buf[i + 1] & 0x3F)); dy = (char) (((buf[i] & 0x0C) << 4) | (buf[i + 2] & 0x3F)); if((dx == 0) && (dy == 0) && (but == (prev &~ MOUSE_MIDDLEBUTTON))) but = prev ^ MOUSE_MIDDLEBUTTON; else but |= prev & MOUSE_MIDDLEBUTTON; prev = but; break;#else case MOUSE_MICROSOFT: /* Microsoft */#endif case MOUSE_LOGIMAN: /* MouseMan / TrackMan */ case MOUSE_PNP: default: but = (but & 0x0A) | ((buf[i] & 0x20) >> 3) | ((buf[i] & 0x10) >> 4); dx = (char) (((buf[i] & 0x03) << 6) | (buf[i + 1] & 0x3F)); dy = (char) (((buf[i] & 0x0C) << 4) | (buf[i + 2] & 0x3F)); break; case MOUSE_WACOM_GRAPHIRE: /* Wacom Graphire Tablet */ if (!(buf[i] & 0x40)) { /* no device on tablet */ nodev = 1; break; } but = (buf[i + 3] & 0x08) ? MOUSE_LEFTBUTTON : 0 | (buf[i + 3] & 0x10) ? MOUSE_RIGHTBUTTON : 0 | (buf[i + 3] & 0x20) ? MOUSE_MIDDLEBUTTON : 0; /* The absolute position is returned, not the change in position, so we convert it. */ ax = ((buf[i + 0] & 0x03) << 14) | (buf[i + 1] << 7) | buf[i + 2]; ay = ((buf[i + 3] & 0x03) << 14) | (buf[i + 4] << 7) | buf[i + 5]; if (nodev) { oldax = ax; olday = ay; nodev = 0; } dx = ax - oldax; dy = ay - olday; dz = (((buf[i+6] & 0x3f) << 1) | ((buf[i+3] & 0x04) >> 2)); if (buf[i+6] & 0x40) dz = -dz; /* The tablet has *very* high resolution, so we normalize that a bit. */ dx /= 2; dy /= 2; oldax = ax; olday = ay; if (buf[i] & 0x20 && dz) /* stylus has pressure */ but |= MOUSE_LEFTBUTTON; else if (buf[i+6] & 0x30) { /* roller is being turned */ wheel = (buf[i + 6] & 0x30) >> 3; if (buf[i+6] & 0x40) wheel = -wheel;#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(ms.wheel_delta) { drx = ((wheel < 0) ? (-ms.wheel_delta) : ms.wheel_delta);#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : RX axis delta = %d", drx);#endif } } break; case MOUSE_INTELLIMOUSE: /* Serial IntelliMouse */ /* This bit modified from gpm 1.13 */ but = ((buf[i] & 0x20) >> 3) | /* left */ ((buf[i + 3] & 0x10) >> 3) | /* middle */ ((buf[i] & 0x10) >> 4); /* right */ dx = (char) (((buf[i] & 0x03) << 6) | (buf[i + 1] & 0x3F)); dy = (char) (((buf[i] & 0x0C) << 4) | (buf[i + 2] & 0x3F)); /* Did we turn the wheel? */ if((wheel = buf[i + 3] & 0x0f) != 0) {#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(ms.wheel_delta) { drx = ((wheel > 7) ? (-ms.wheel_delta) : ms.wheel_delta);#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : RX axis delta = %d", drx);#endif } } break; case MOUSE_MOUSESYSTEMS: /* Mouse Systems Corp */ case MOUSE_GPM: but = (~buf[i]) & 0x07; dx = (char) (buf[i + 1]); dx += (char) (buf[i + 3]); dy = -((char) (buf[i + 2])); dy -= (char) (buf[i + 4]); break; case MOUSE_MMSERIES: /* MM Series */ case MOUSE_LOGITECH: /* Logitech */ but = buf[i] & 0x07; dx = (buf[i] & 0x10) ? buf[i + 1] : -buf[i + 1]; dy = (buf[i] & 0x08) ? -buf[i + 2] : buf[i + 2]; break; case MOUSE_BUSMOUSE: /* BusMouse */ but = (~buf[i]) & 0x07; dx = (char) buf[i + 1]; dy = -(char) buf[i + 2]; break; case MOUSE_PS2: /* PS/2 mouse */ but = (buf[i] & 0x04) >> 1 | /* Middle */ (buf[i] & 0x02) >> 1 | /* Right */ (buf[i] & 0x01) << 2; /* Left */ dx = (buf[i] & 0x10) ? buf[i + 1] - 256 : buf[i + 1]; dy = (buf[i] & 0x20) ? -(buf[i + 2] - 256) : -buf[i + 2]; break; case MOUSE_DRMOUSE4DS: /* Digital Research 4-Axis mouse - like the PS/2 IntelliMouse, but has two wheels. */ /* This bit modified from the gpm 1.13 imps2 patch by Tim Goodwin */ but = ((buf[i] & 1) << 2) | /* left */ ((buf[i] & 6) >> 1); /* middle and right */ dx = (buf[i] & 0x10) ? buf[i + 1] - 256 : buf[i + 1]; dy = (buf[i] & 0x20) ? -(buf[i + 2] - 256) : -buf[i + 2]; /* Did we turn the wheel? */ if((wheel = buf[i + 3]) != 0) {#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : Wheel turned (0x%02x)", wheel);#endif /* RX reports as 1 or F, RY reports as 2 or E */ /* both never report at the same time, which makes life easier */ if (ms.wheel_delta) { switch (wheel & 0x0F) { case 1: drx = ms.wheel_delta; break; case 2: dry = -ms.wheel_delta; break; case 14: dry = ms.wheel_delta; break; case 15: drx = -ms.wheel_delta; break; }#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : RX axis delta = %d : RY axis delta = %d", drx, dry);#endif#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : .");#endif } } break; case MOUSE_IMPS2: /* PS/2 IntelliMouse */ /* This bit modified from the gpm 1.13 imps2 patch by Tim Goodwin */ but = ((buf[i] & 1) << 2) | /* left */ ((buf[i] & 6) >> 1); /* middle and right */ dx = (buf[i] & 0x10) ? buf[i + 1] - 256 : buf[i + 1]; dy = (buf[i] & 0x20) ? -(buf[i + 2] - 256) : -buf[i + 2]; /* Did we turn the wheel? */ if((wheel = buf[i + 3]) != 0) {#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(ms.wheel_delta) { drx = ((wheel > 0x7f) ? (-ms.wheel_delta) : ms.wheel_delta);#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : RX axis delta = %d", drx);#endif }#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : .");#endif } break; case MOUSE_EXPPS2: /* PS/2 IntelliMouse Explorer */ /* This bit modified from the gpm 1.13 imps2 patch by Tim Goodwin */ but = ((buf[i] & 1) << 2) | /* left */ ((buf[i] & 6) >> 1) | /* middle and right */ ((buf[i+3] & 48) >> 1); dx = (buf[i] & 0x10) ? buf[i + 1] - 256 : buf[i + 1]; dy = (buf[i] & 0x20) ? -(buf[i + 2] - 256) : -buf[i + 2]; /* Did we turn the wheel? */ if(((wheel = buf[i + 3]) & 15) != 0) {#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(ms.wheel_delta) { drx = ((wheel > 7) ? (-ms.wheel_delta) : ms.wheel_delta);#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : RX axis delta = %d", drx);#endif }#if defined(DEBUG_WHEEL) debugf(DSER, "MOUSE : .");#endif } break; case MOUSE_SPACEBALL: switch (buf[i]) { case 'D': but = 0177 & buf[i+1]; /* Strip the MSB, which is a parity bit */ for (j = 2; j < 11; ++j) { buf[i+j] &= 0177; /* Make sure everything is 7bit */ buf[i+j] ^= SpaceWare[j-2]; /* What's this doing in the data? */ } /* Turn chars into 10 bit integers */ if (mouse_orientation == MOUSE_ORIENTATION_VERTICAL) { dx = ((buf[i + 2] & 0177) << 3) | ((buf[i + 3] & 0160) >> 4); dy = ((buf[i + 3] & 0017) << 6) | ((buf[i + 4] & 0176) >> 1); dz = ((buf[i + 4] & 0001) << 9) | ((buf[i + 5] & 0177) << 2)| ((buf[i + 6] & 0140) >> 5); drx = ((buf[i + 6] & 0037) << 5) | ((buf[i + 7] & 0174) >> 2); dry = ((buf[i + 7] & 0003) << 8) | ((buf[i + 8] & 0177) << 1)| ((buf[i + 9] & 0100) >> 6); drz = ((buf[i + 9] & 0077) << 4) | ((buf[i + 10] & 0170) >> 3); } else { dx = ((buf[i + 2] & 0177) << 3) | ((buf[i + 3] & 0160) >> 4); dz = ((buf[i + 3] & 0017) << 6) | ((buf[i + 4] & 0176) >> 1); dy = ((buf[i + 4] & 0001) << 9) | ((buf[i + 5] & 0177) << 2)| ((buf[i + 6] & 0140) >> 5); drx = ((buf[i + 6] & 0037) << 5) | ((buf[i + 7] & 0174) >> 2); drz = ((buf[i + 7] & 0003) << 8) | ((buf[i + 8] & 0177) << 1)| ((buf[i + 9] & 0100) >> 6); dry = ((buf[i + 9] & 0077) << 4) | ((buf[i + 10] & 0170) >> 3); } /* Get the sign right. */ if (dx > 511) dx -= 1024; if (dy > 511) dy -= 1024; if (dz > 511) dz -= 1024; if (drx > 511) drx -= 1024; if (dry > 511) dry -= 1024; if (drz > 511) drz -= 1024; if (mouse_orientation == MOUSE_ORIENTATION_HORIZONTAL) { dz *= -1; drz *= -1; } /* if (fabs(dx) < sorb_trans_thresh[1]) dx = 0; */ i += 13;#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : Got D packet! but=%d, x=%d y=%d z=%d rx=%d ry=%d rz=%d", but, dx, dy, dz, drx, dry, drz);#endif break; case 'K': /* Button press/release w/out motion */ but=0177 & buf[i+2]; if (but == MOUSE_RESETBUTTON) mouse_orientation=1-mouse_orientation;#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : Got K packet! but=%d, x=%d y=%d z=%d rx=%d ry=%d rz=%d", but, dx, dy, dz, drx, dry, drz);#endif i += 6; break; case 'R':#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : Got init string!");#endif for (j = i; ((buf[j] != 13) && (j < nu_bytes)); j++) {#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : %c",(buf[j] & 0177)); } debugf(DSER, "MOUSE : ");#else ; }#endif i = j + 1; break; default:#if defined(DEBUG_MOUSE) debugf(DSER, "MOUSE : Got unknown packet!");#endif i++; break; } break; } if (ms.type != MOUSE_SPACEBALL) i += mouse_proto[ms.type][4]; /* Try to snag that optional mouseman fourth byte, if present */ if ((ms.type == MOUSE_LOGIMAN) && ((nu_bytes - i) >= 1) && ((buf[i] & mouse_proto[ms.type][0]) != mouse_proto[ms.type][1]) && ((char) (buf[i] & ~0x23) == 0)) { /* Hack-o-matic, stolen from xf86_Mouse.c */ but = ((buf[i] & 0x20) >> 4) | (but & 0x05); i++; } if (ms.accel.maxdelta) { if (abs(dx) > ms.accel.maxdelta) dx = (dx > 0) ? ms.accel.maxdelta : -ms.accel.maxdelta; if (abs(dy) > ms.accel.maxdelta) dy = (dy > 0) ? ms.accel.maxdelta : -ms.accel.maxdelta; if (abs(dz) > ms.accel.maxdelta) dz = (dz > 0) ? ms.accel.maxdelta : -ms.accel.maxdelta; } switch (ms.accel.type) { int delta; case MOUSE_ACCEL_TYPE_NORMAL:#if defined(DEBUG_ACCEL) debugf(DSER, "MOUSE : %ld", (long) dx);#endif if (abs(dx) > ms.accel.thresh) dx = (int) ((float) dx * ms.accel.mult); if (abs(dy) > ms.accel.thresh) dy = (int) ((float) dy * ms.accel.mult); if (abs(dz) > ms.accel.thresh) dz = (int) ((float) dz * ms.accel.mult);#if defined(DEBUG_ACCEL) debugf(DSER, "MOUSE : %ld", (long) dx);#endif break; case MOUSE_ACCEL_TYPE_POWER:#if defined(DEBUG_ACCEL) debugf(DSER, "MOUSE : %ld", (long) dx);#endif delta = abs(dx); dx = (delta >= ms.accel.thresh) ? (float) dx * ms.accel.mult : (float) dx * ms.accel.powertable[delta]; delta = abs(dy); dy = (delta >= ms.accel.thresh) ? (float) dy * ms.accel.mult : (float) dy * ms.accel.powertable[delta]; delta = abs(dz); dz = (delta >= ms.accel.thresh) ? (float) dz * ms.accel.mult : (float) dz * ms.accel.powertable[delta];#if defined(DEBUG_ACCEL) debugf(DSER, "MOUSE : %ld", (long) dx);#endif break; } if (ms.accel.amaxdelta && ms.accel.type) { if (abs(dx) > ms.accel.amaxdelta) dx = (dx > 0) ? ms.accel.amaxdelta : -ms.accel.amaxdelta; if (abs(dy) > ms.accel.amaxdelta) dy = (dy > 0) ? ms.accel.amaxdelta : -ms.accel.amaxdelta; if (abs(dz) > ms.accel.amaxdelta) dz = (dz > 0) ? ms.accel.amaxdelta : -ms.accel.amaxdelta; } mouse_handler(but, dx, dy, dz, drx, dry, drz); event_handled = 1; goto handle_packets;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -