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 + -
显示快捷键?