]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/aux/accupoint.c
abaco: cleanup, handle image/x-icon, don't use backspace as a hotkey, and remove...
[plan9front.git] / sys / src / cmd / aux / accupoint.c
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 }