Ejemplo n.º 1
0
void
VxMouseRead (int mousePort)
{
    Event	    ev;
    int		    dx, dy;
    unsigned long   flags;
    unsigned long   mask;
    int		    n;
    
    while (eventQueue->head != eventQueue->tail)
    {
	ev = *eventQueue->head;
	if (eventQueue->head >= &eventQueue->events[eventQueue->size-1])
	    eventQueue->head = &eventQueue->events[0];
	else
	    eventQueue->head++;
	switch (ev.e_type) {
	case E_BUTTON:
	    switch (ev.e_device) {
	    case E_MOUSE:
		switch (ev.e_key) {
		case BUTTON1:
		    mask = KD_BUTTON_1;
		    break;
		case BUTTON2:
		    mask = KD_BUTTON_2;
		    break;
		case BUTTON3:
		    mask = KD_BUTTON_3;
		    break;
		default:
		    mask = 0;
		    break;
		}
		if (ev.e_direction == E_KBUP)
		    mouseState &= ~mask;
		else
		    mouseState |= mask;
		KdEnqueueMouseEvent (mouseState | KD_MOUSE_DELTA, 0, 0);
		break;
	    case E_DKB:
		KdEnqueueKeyboardEvent (ev.e_key, ev.e_direction == E_KBUP);
		break;
	    }
	    break;
	case E_MMOTION:
	    KdEnqueueMouseEvent (mouseState | KD_MOUSE_DELTA,
				 ev.e_x, ev.e_y);
	    break;
	}
    }
}
Ejemplo n.º 2
0
/*
 * Standard PS/2 mouse protocol
 */
static Bool ps2Parse (KdMouseInfo *mi, unsigned char *ev, int ne)
{
    Kmouse	    *km = mi->driver;
    int		    dx, dy, dz;
    unsigned long   flags;
    unsigned long   flagsrelease = 0;
    
    flags = KD_MOUSE_DELTA;
    if (ev[0] & 4)
	flags |= KD_BUTTON_2;
    if (ev[0] & 2)
	flags |= KD_BUTTON_3;
    if (ev[0] & 1)
	flags |= KD_BUTTON_1;
    
    if (ne > 3)
    {
	dz = (int) (signed char) ev[3];
	/*if (dz > 0)*/
	if (dz < 0)
	{
	    flags |= KD_BUTTON_4;
	/*else if (dz < 0)*/
	flagsrelease = KD_BUTTON_4;
	}
	else if (dz > 0)
	{
	    flags |= KD_BUTTON_5;
	    flagsrelease = KD_BUTTON_5;
	}
    }
	
    dx = ev[1];
    if (ev[0] & 0x10)
	dx -= 256;
    dy = ev[2];
    if (ev[0] & 0x20)
	dy -= 256;
    dy = -dy;
    if (!MouseReasonable (mi, flags, dx, dy))
	return FALSE;
    if (km->stage == MouseWorking)
    {
	KdEnqueueMouseEvent (mi, flags, dx, dy);
	if (flagsrelease)
	{
	    flags &= ~flagsrelease;
	    KdEnqueueMouseEvent (mi, flags, dx, dy);
	}
    }
    return TRUE;
}
Ejemplo n.º 3
0
static Bool logiParse (KdMouseInfo *mi, unsigned char *ev, int ne)
{
    Kmouse	    *km = mi->driver;
    int		    dx, dy;
    unsigned long   flags;

    flags = KD_MOUSE_DELTA;
    
    if (ne == 3)
    {
	if (ev[0] & 0x20)
	    flags |= KD_BUTTON_1;
	if (ev[0] & 0x10)
	    flags |= KD_BUTTON_3;
    
	dx = (signed char)(((ev[0] & 0x03) << 6) | (ev[1] & 0x3F));
	dy = (signed char)(((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F));
	flags |= km->state & KD_BUTTON_2;
    }
    else
    {
	if (ev[0] & 0x20)
	    flags |= KD_BUTTON_2;
	dx = 0;
	dy = 0;
	flags |= km->state & (KD_BUTTON_1|KD_BUTTON_3);
    }

    if (!MouseReasonable (mi, flags, dx, dy))
	return FALSE;
    if (km->stage == MouseWorking)
	KdEnqueueMouseEvent (mi, flags, dx, dy);
    return TRUE;
}
Ejemplo n.º 4
0
Archivo: ts.c Proyecto: dikerex/theqvd
void
TsRead (int tsPort, void *closure)
{
    KdMouseInfo	    *mi = closure;
    int		    fd = (int) mi->driver;
    TS_EVENT	    event;
    long	    buf[3];
    int		    n;
    long	    pressure;
    long	    x, y;
    unsigned long   flags;
    unsigned long   buttons;

    n = TsReadBytes (tsPort, (char *) &event, sizeof (event), sizeof (event));
    if (n == sizeof (event))  
    {
	if (event.pressure) 
	{
	    /* 
	     * HACK ATTACK.  (static global variables used !)
	     * Here we test for the touch screen driver actually being on the
	     * touch screen, if it is we send absolute coordinates. If not,
	     * then we send delta's so that we can track the entire vga screen.
	     */
	    if (KdTsCurScreen == KdTsPhyScreen) {
	    	flags = KD_BUTTON_1;
	    	x = event.x;
	    	y = event.y;
	    } else {
	    	flags = /* KD_BUTTON_1 |*/ KD_MOUSE_DELTA;
	    	if ((lastx == 0) || (lasty == 0)) {
	    	    x = 0;
	    	    y = 0;
	    	} else {
	    	    x = event.x - lastx;
	    	    y = event.y - lasty;
	    	}
	    	lastx = event.x;
	    	lasty = event.y;
	    }
	} else {
	    flags = KD_MOUSE_DELTA;
	    x = 0;
	    y = 0;
	    lastx = 0;
	    lasty = 0;
	}
	KdEnqueueMouseEvent (mi, flags, x, y);
    }
}
Ejemplo n.º 5
0
static void
EvdevMotion (KdMouseInfo    *mi)
{
    Kevdev		*ke = mi->driver;
    int			i;

    for (i = 0; i <= ke->max_rel; i++)
	if (ke->rel[i])
	{
            KdEnqueueMouseEvent (mi, flags | KD_MOUSE_DELTA, ke->rel[0], ke->rel[1]);
	    int a;
//	    ErrorF ("rel");
	    for (a = 0; a <= ke->max_rel; a++)
	    {
//		if (ISBITSET (ke->relbits, a))
//		    ErrorF (" %d=%d", a, ke->rel[a]);
		ke->rel[a] = 0;
	    }
//	    ErrorF ("\n");
	    break;
	}
    for (i = 0; i < ke->max_abs; i++)
	if (ke->abs[i] != ke->prevabs[i])
	{
            KdEnqueueMouseEvent (mi, flags, ke->abs[0], ke->abs[1]);
	    int a;
//	    ErrorF ("abs");
	    for (a = 0; a <= ke->max_abs; a++)
	    {
//		if (ISBITSET (ke->absbits, a))
//		    ErrorF (" %d=%d", a, ke->abs[a]);
		ke->prevabs[a] = ke->abs[a];
	    }
//	    ErrorF ("\n");
	    break;
	}
}
Ejemplo n.º 6
0
Archivo: ps2.c Proyecto: dikerex/theqvd
void
Ps2Read (int ps2Port, void *closure)
{
    unsigned char   buf[3 * 200];
    unsigned char   *b;
    int		    n;
    int		    dx, dy;
    unsigned long   flags;
    int		    id = (int) closure;
    unsigned long   left_button = KD_BUTTON_1;
    unsigned long   right_button = KD_BUTTON_3;

#undef SWAP_USB
#ifdef SWAP_USB
    if (id == 2)
    {
	left_button = KD_BUTTON_3;
	right_button = KD_BUTTON_1;
    }
#endif
    while ((n = Ps2ReadBytes (ps2Port, buf, sizeof (buf), 3)) > 0)
    {
	b = buf;
	while (n >= 3)
	{
	    flags = KD_MOUSE_DELTA;
	    if (b[0] & 4)
		flags |= KD_BUTTON_2;
	    if (b[0] & 2)
		flags |= right_button;
	    if (b[0] & 1)
		flags |= left_button;
		
	    dx = b[1];
	    if (b[0] & 0x10)
		dx -= 256;
	    dy = b[2];
	    if (b[0] & 0x20)
		dy -= 256;
	    dy = -dy;
	    n -= 3;
	    b += 3;
	    KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy);
	}
    }
}
Ejemplo n.º 7
0
static Bool busParse (KdMouseInfo *mi, unsigned char *ev, int ne)
{
    Kmouse	    *km = mi->driver;
    int		    dx, dy;
    unsigned long   flags;
    
    flags = KD_MOUSE_DELTA;
    dx = (signed char) ev[1];
    dy = -(signed char) ev[2];
    if ((ev[0] & 4) == 0)
	flags |= KD_BUTTON_1;
    if ((ev[0] & 2) == 0)
	flags |= KD_BUTTON_2;
    if ((ev[0] & 1) == 0)
	flags |= KD_BUTTON_3;
    if (!MouseReasonable (mi, flags, dx, dy))
	return FALSE;
    if (km->stage == MouseWorking)
	KdEnqueueMouseEvent (mi, flags, dx, dy);
    return TRUE;
}
Ejemplo n.º 8
0
/*
 * Mouse systems protocol, 5 bytes
 */
static Bool mscParse (KdMouseInfo *mi, unsigned char *ev, int ne)
{
    Kmouse	    *km = mi->driver;
    int		    dx, dy;
    unsigned long   flags;

    flags = KD_MOUSE_DELTA;
    
    if (!(ev[0] & 0x4))
	flags |= KD_BUTTON_1;
    if (!(ev[0] & 0x2))
	flags |= KD_BUTTON_2;
    if (!(ev[0] & 0x1))
	flags |= KD_BUTTON_3;
    dx =    (signed char)(ev[1]) + (signed char)(ev[3]);
    dy = - ((signed char)(ev[2]) + (signed char)(ev[4]));

    if (!MouseReasonable (mi, flags, dx, dy))
	return FALSE;
    if (km->stage == MouseWorking)
	KdEnqueueMouseEvent (mi, flags, dx, dy);
    return TRUE;
}
Ejemplo n.º 9
0
void
BusRead (int adbPort, void *closure)
{
    unsigned char   buf[3];
    unsigned char   *b;
    int		    n;
    int		    dx, dy;
    unsigned long   flags;

    n = read (adbPort, buf, 3);
    if (n == 3)
    {
	flags = KD_MOUSE_DELTA;
	dx = (char) buf[1];
	dy = -(char) buf[2];
	if ((buf[0] & 4) == 0)
	    flags |= KD_BUTTON_1;
	if ((buf[0] & 2) == 0)
	    flags |= KD_BUTTON_2;
	if ((buf[0] & 1) == 0)
	    flags |= KD_BUTTON_3;
        KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy);
    }
}
Ejemplo n.º 10
0
static void
EvdevRead (int evdevPort, void *closure)
{
    KdMouseInfo		*mi = closure;
    Kevdev		*ke = mi->driver;
    int			i, n;
    struct input_event	events[NUM_EVENTS];

    n = read (evdevPort, &events, NUM_EVENTS * sizeof (struct input_event));
    if (n <= 0)
	return;
    n /= sizeof (struct input_event);
    for (i = 0; i < n; i++)
    {
	switch (events[i].type) {
	case EV_SYN:
	    break;
	case EV_KEY:
	    EvdevMotion (mi);
	    ASSIGNBIT(ke->key,events[i].code, events[i].value);
	    if (events[i].code < 0x100)
		ErrorF ("key %d %d\n", events[i].code, events[i].value);
	    else
		ErrorF ("key 0x%x %d\n", events[i].code, events[i].value);
	    
	    if (events[i].value==1) {
	      switch (events[i].code) {
	      case BTN_LEFT:
                flags |= KD_BUTTON_1;
                break;
	      case BTN_RIGHT:
		flags |= KD_BUTTON_3;
                break;
	      case BTN_MIDDLE:
                flags |= KD_BUTTON_2;
                break;
	      case BTN_FORWARD:
                flags |= KD_BUTTON_4;
                break;
	      case BTN_BACK:
                flags |= KD_BUTTON_5;
                break;
	      }
	    }
	    else if (events[i].value==0) {
	      switch (events[i].code) {
	      case BTN_LEFT:
                flags &= ~KD_BUTTON_1;
                break;
	      case BTN_RIGHT:
		flags &= ~KD_BUTTON_3;
                break;
	      case BTN_MIDDLE:
                flags &= ~KD_BUTTON_2;
                break;
	      case BTN_FORWARD:
                flags &= ~KD_BUTTON_4;
                break;
	      case BTN_BACK:
                flags &= ~KD_BUTTON_5;
                break;
	      }
	    }
	    KdEnqueueMouseEvent (mi, KD_MOUSE_DELTA | flags, 0, 0);
	    break;
	case EV_REL:
	    ke->rel[events[i].code] += events[i].value;
	    break;
	case EV_ABS:
	    ke->abs[events[i].code] = events[i].value;
	    break;
	}
    }
    EvdevMotion (mi);
}