ms.c
来自「linux 下svgalib编的一个界面程序示例」· C语言 代码 · 共 1,183 行 · 第 1/3 页
C
1,183 行
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;#ifdef DEBUG_WHEEL fprintf(stderr, " Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(m_wheel_delta) { drx = ((wheel < 0) ? (-m_wheel_delta) : m_wheel_delta);#ifdef DEBUG_WHEEL fprintf(stderr, "; RX axis delta = %d", drx);#endif } /* Are fake keyboard events enabled? */ if(m_fake_kbd_events && __svgalib_keyboard_eventhandler) { /* Fake keypresses... */ int key = ((wheel < 0) ? m_fake_upscancode : m_fake_downscancode);#ifdef DEBUG_WHEEL fprintf(stderr, "; pressing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 1); /* press */ /* todo: delay */#ifdef DEBUG_WHEEL fprintf(stderr, ", releasing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 0); /* release */#ifdef DEBUG_WHEEL fprintf(stderr, ".\n");#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) {#ifdef DEBUG_WHEEL fprintf(stderr, " Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(m_wheel_delta) { drx = ((wheel > 7) ? (-m_wheel_delta) : m_wheel_delta);#ifdef DEBUG_WHEEL fprintf(stderr, "; RX axis delta = %d", drx);#endif } /* Are fake keyboard events enabled? */ if(m_fake_kbd_events && __svgalib_keyboard_eventhandler) { /* Fake keypresses... */ int key = ((wheel > 7) ? m_fake_upscancode : m_fake_downscancode);#ifdef DEBUG_WHEEL fprintf(stderr, "; pressing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 1); /* press */ /* todo: delay */#ifdef DEBUG_WHEEL fprintf(stderr, ", releasing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 0); /* release */#ifdef DEBUG_WHEEL fprintf(stderr, ".\n");#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) {#ifdef DEBUG_WHEEL fprintf(stderr, " 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 (m_wheel_delta) { switch (wheel & 0x0F) { case 1: drx = m_wheel_delta; break; case 15: drx = -m_wheel_delta; break; case 2: dry = -m_wheel_delta; break; case 14: dry = m_wheel_delta; break; };#ifdef DEBUG_WHEEL fprintf(stderr, "; RX axis delta = %d : RY axis delta = %d", drx, dry);#endif /* Are fake keyboard events enabled? */ if(m_fake_kbd_events && __svgalib_keyboard_eventhandler) { /* Fake keypresses... */ int key = ((drx+dry < 0) ? m_fake_upscancode : m_fake_downscancode);#ifdef DEBUG_WHEEL fprintf(stderr, "; pressing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 1); /* press */ /* todo: delay */#ifdef DEBUG_WHEEL fprintf(stderr, ", releasing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 0); /* release */ }#ifdef DEBUG_WHEEL fprintf(stderr, ".\n");#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) {#ifdef DEBUG_WHEEL fprintf(stderr, " Wheel turned (0x%02x)", wheel);#endif /* RX-axis */ if(m_wheel_delta) { drx = ((wheel > 0x7f) ? (-m_wheel_delta) : m_wheel_delta);#ifdef DEBUG_WHEEL fprintf(stderr, "; RX axis delta = %d", drx);#endif } /* Are fake keyboard events enabled? */ if(m_fake_kbd_events && __svgalib_keyboard_eventhandler) { /* Fake keypresses... */ int key = ((wheel > 0x7f) ? m_fake_upscancode : m_fake_downscancode);#ifdef DEBUG_WHEEL fprintf(stderr, "; pressing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 1); /* press */ /* todo: delay */#ifdef DEBUG_WHEEL fprintf(stderr, ", releasing scancode %d", key);#endif __svgalib_keyboard_eventhandler(key, 0); /* release */ }#ifdef DEBUG_WHEEL fprintf(stderr, ".\n");#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;#ifdef DEBUG printf("Got D packet! but=%d, x=%d y=%d z=%d rx=%d ry=%d rz=%d\n", 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;#ifdef DEBUG printf("Got K packet! but=%d, x=%d y=%d z=%d rx=%d ry=%d rz=%d\n", but,dx,dy,dz,drx,dry,drz);#endif i+=6; break; case 'R':#ifdef DEBUG printf("Got init string!\n");#endif for (j=i;((buf[j] !=13)&&(j<nu_bytes));j++) printf("%c",(buf[j] & 0177)); printf("\n\n"); i=j+1; break; default:#ifdef DEBUG printf("Got unknown packet!\n");#endif i++; break; } break; } if (m_type != MOUSE_SPACEBALL) i += proto[m_type][4]; /* Try to snag that optional mouseman fourth byte, if present */ if ((m_type == MOUSE_LOGIMAN) && ((nu_bytes - i) >= 1) && ((buf[i] & proto[m_type][0]) != proto[m_type][1]) && ((char) (buf[i] & ~0x23) == 0)) { /* Hack-o-matic, stolen from xf86_Mouse.c */ but = ((buf[i] & 0x20) >> 4) | (but & 0x05); i++; } if (__svgalib_m_ignore_dx) dx = 0; if (__svgalib_m_ignore_dy) dy = 0; if (__svgalib_m_ignore_dz) dz = 0; if (m_maxdelta) { if (abs(dx) > m_maxdelta) dx = (dx > 0) ? m_maxdelta : -m_maxdelta; if (abs(dy) > m_maxdelta) dy = (dy > 0) ? m_maxdelta : -m_maxdelta; if (abs(dz) > m_maxdelta) dz = (dz > 0) ? m_maxdelta : -m_maxdelta; } switch (m_accel_type) { int delta; case MOUSE_ACCEL_TYPE_NORMAL:#ifdef DEBUG_ACCEL printf("%ld\t", (long)dx);#endif if (abs(dx) > m_accel_thresh) dx = (int) ((float)dx * m_accel_mult); if (abs(dy) > m_accel_thresh) dy = (int) ((float)dy * m_accel_mult); if (abs(dz) > m_accel_thresh) dz = (int) ((float)dz * m_accel_mult);#ifdef DEBUG_ACCEL printf("%ld\n", (long)dx);#endif break; case MOUSE_ACCEL_TYPE_POWER:#ifdef DEBUG_ACCEL printf("%ld\t", (long)dx);#endif delta = abs(dx); dx = (delta >= m_accel_thresh) ? (float)dx * m_accel_mult : (float)dx * m_accel_powertable[delta]; delta = abs(dy); dy = (delta >= m_accel_thresh) ? (float)dy * m_accel_mult : (float)dy * m_accel_powertable[delta]; delta = abs(dz); dz = (delta >= m_accel_thresh) ? (float)dz * m_accel_mult : (float)dz * m_accel_powertable[delta];#ifdef DEBUG_ACCEL printf("%ld\n", (long)dx);#endif break; } if (m_accel_maxdelta && m_accel_type) { if (abs(dx) > m_accel_maxdelta) dx = (dx > 0) ? m_accel_maxdelta : -m_accel_maxdelta; if (abs(dy) > m_accel_maxdelta) dy = (dy > 0) ? m_accel_maxdelta : -m_accel_maxdelta; if (abs(dz) > m_accel_maxdelta) dz = (dz > 0) ? m_accel_maxdelta : -m_accel_maxdelta; } __svgalib_mouse_eventhandler(but, dx, dy, dz, drx, dry, drz); event_handled = 1; goto handle_packets;}void __svgalib_mouse_update_keymap(void){ /* The keyboard has been remapped, and we should accordingly remap any symbolically-specified scancodes for fake keyboard events. */#ifdef DEBUG_WHEEL fprintf(stderr, " Remapping fake keyboard event scancodes... ");#endif if(m_fake_upkeyname) m_fake_upscancode = __svgalib_mapkeyname(m_fake_upkeyname); if(m_fake_downkeyname) m_fake_downscancode = __svgalib_mapkeyname(m_fake_downkeyname);#ifdef DEBUG_WHEEL fprintf(stderr, "done.\n");#endif}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?