ref: 6b37f1f49d86455b9e734e58167fd076b9a70081
dir: /mousetrap.c/
#include <u.h>
#include <libc.h>
void
usage(void)
{
fprint(2, "usage: %s [-m map]\n", argv0);
exits("usage");
}
enum {
Left = 0x01, Mid = 0x02, Right = 0x04,
Scrld = 0x08, Scrlu = 0x10,
Fwd = 0x20, Bwd = 0x40,
Fn1 = 0x80, Fn2 = 0x100, Fn3 = 0x200,
};
typedef struct Butt Butt;
struct Butt {
int raw; int cooked;
int down;
void (*action)(void);
};
Butt identity[] = {
{Left, Left, 0, nil},
{Mid, Mid, 0, nil},
{Right, Right, 0, nil},
{Scrld, Scrld, 0, nil},
{Scrlu, Scrlu, 0, nil},
{-1, -1, -1, nil},
};
Butt huge[] = {
{Left, Left, 0, nil},
{Mid, Mid, 0, nil},
{Right, Mid, 0, nil},
{Scrld, Scrld, 0, nil},
{Scrlu, Scrlu, 0, nil},
{Fwd, Mid, 0, nil},
{Bwd, Left, 0, nil},
{Fn1, Mid, 0, nil},
{Fn2, Right, 0, nil},
{Fn3, Right, 0, nil},
{-1, -1, -1, nil},
};
Butt contour[] = {
{Left, Left, 0, nil},
{Mid, Mid, 0, nil},
{Right, Right, 0, nil},
{Scrld, Scrld, 0, nil},
{Scrlu, Scrlu, 0, nil},
{Fwd, Scrld, 0, nil},
{Bwd, Scrlu, 0, nil},
{-1, -1, -1, nil},
};
int
parsein(int *x, int *y, int *b)
{
int nr;
char buf[1+12+12+12+1];
char *p;
if((nr = read(0, buf, sizeof buf)) < 0)
sysfatal("read: %r");
if(nr == 0)
return 0;
buf[nr] = 0;
*x = strtol(buf+1, &p, 10);
if(p == nil)
sysfatal("x not a num");
*y = strtol(p, &p, 10);
if(p == nil)
sysfatal("y not a num");
*b = strtol(p, &p, 10);
if(p == nil)
sysfatal("b not a num");
return nr;
}
static int
buttonmap(Butt *m, int b)
{
int r;
for(r = 0; m->raw != -1; m++){
if(m->raw & b){
if(m->action != nil && m->down == 0)
m->action();
r |= m->cooked;
m->down = 1;
}else
m->down = 0;
}
return r;
}
void
main(int argc, char **argv)
{
int x, y, b;
char *mapn;
Butt *map;
mapn = "default";
ARGBEGIN{
case 'm':
mapn = EARGF(usage());
break;
default:
usage();
}ARGEND;
map = identity;
if(strncmp(mapn, "elecom", 6) == 0
|| strncmp(mapn, "huge", 4) == 0)
map = huge;
else if(strncmp(mapn, "contour", 7) == 0)
map = contour;
x = y = b = 0;
for(;;){
if(parsein(&x, &y, &b) == 0)
break;
// x = scale(s, x);
// y = scale(s, y);
b = buttonmap(map, b);
fprint(1, "%s%11d %11d %11d", "m", x, y, b);
}
exits(nil);
}