Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <draw.h>
4
#include <event.h>
5
 
6
/*
7
 * Convert AccuPoint buttons 4 and 5 to a simulation of button 2.
8
 * The buttons generate down events, repeat, and have no up events,
9
 * so it's a struggle. This program turns the left button into a near-as-
10
 * possible simulation of a regular button 2, but it can only sense up
11
 * events by timeout, so it's sluggish.  Thus it also turns the right button
12
 * into a click on button 2, useful for acme and chords.
13
 */
14
 
15
typedef struct M M;
16
 
17
struct M
18
{
19
	Mouse;
20
	int	byte;
21
};
22
 
23
int	button2;
24
int	interrupted;
25
 
26
int
27
readmouse(M *m)
28
{
29
	char buf[1+4*12];
30
	int n;
31
 
32
	n = read(0, buf, sizeof buf);
33
	if(n < 0)
34
		return n;
35
	if(n != sizeof buf)
36
		return 0;
37
	m->byte = buf[0];
38
	m->xy.x =  atoi(buf+1+0*12);
39
	m->xy.y =  atoi(buf+1+1*12);
40
	m->buttons =  atoi(buf+1+2*12);
41
	m->msec =  atoi(buf+1+3*12);
42
	return 1;
43
}
44
 
45
void
46
writemouse(M *m)
47
{
48
	print("%c%11d %11d %11d %11ld ",
49
		m->byte,
50
		m->xy.x,
51
		m->xy.y,
52
		m->buttons&7,
53
		m->msec);
54
}
55
 
56
void
57
notifyf(void*, char *s)
58
{
59
	if(strcmp(s, "alarm") == 0)
60
		interrupted = 1;
61
	noted(NCONT);
62
}
63
 
64
void
65
main(void)
66
{
67
	M m, om;
68
	int n;
69
 
70
	notify(notifyf);
71
	memset(&m, 0, sizeof m);
72
	om = m;
73
	for(;;){
74
		interrupted = 0;
75
		/* first click waits 500ms before repeating; after that they're 150, but that's ok */
76
		if(button2)
77
			alarm(550);
78
		n = readmouse(&m);
79
		if(button2)
80
			alarm(0);
81
		if(interrupted){
82
			/* timed out; clear button 2 */
83
			om.buttons &= ~2;
84
			button2 = 0;
85
			writemouse(&om);
86
			continue;
87
		}
88
		if(n <= 0)
89
			break;
90
		/* avoid bounce caused by button 5 click */
91
		if((om.buttons&16) && (m.buttons&16)){
92
			om.buttons &= ~16;
93
			continue;
94
		}
95
		if(m.buttons & 2)
96
			button2 = 0;
97
		else{
98
			/* only check 4 and 5 if 2 isn't down of its own accord */
99
			if(m.buttons & 16){
100
				/* generate quick button 2 click */
101
				button2 = 0;
102
				m.buttons |= 2;
103
				writemouse(&m);
104
				m.buttons &= ~2;
105
				/* fall through to generate up event */
106
			}else if(m.buttons & 8){
107
				/* press and hold button 2 */
108
				button2 = 1;
109
			}
110
		}
111
		if(button2)
112
			m.buttons |= 2;
113
		if(m.byte!=om.byte || m.buttons!=om.buttons || !eqpt(m.xy, om.xy))
114
			writemouse(&m);
115
		om = m;
116
	}
117
}