⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mouse_2.c

📁 超强的嵌入式GUI系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	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;}#endif /* VIDEO_HELPER_MOUSE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -