--- ../original-gpm-1.19.2/mice.c Tue Mar 7 15:10:00 2000 +++ mice.c Wed Jun 14 12:36:42 2000 @@ -305,7 +305,6 @@ return 0; } - /* Thu Jan 28 20:54:47 MET 1999 hof@hof-berlin.de SummaSketch reportformat */ static int R_summa(Gpm_Event *state, int fd) { @@ -332,7 +331,55 @@ return write(fd,buffer,5); } +/* Suvil Penbrush Professional tablet support absolute mode*/ +/* Summagraphics MM-Series format*/ +/* (Grzegorz Adam Hankiewicz) gradha@iname.com Wed Jun 14 11:32:27 CEST 2000 */ +int suvilmaxx,suvilmaxy; +static int M_suvil (Gpm_Event *state, unsigned char *data) +{ + int x, y; + + x = data[2] * 128 + data[1]; + y = data[4] * 128 + data[3]; + + if (x >= suvilmaxx) x = suvilmaxx; + if (y >= suvilmaxy) y = suvilmaxy; + + state->x = x * win.ws_col / suvilmaxx; + state->y = 1 + y * win.ws_row / suvilmaxy; + + realposx = x * REALPOS_MAX / suvilmaxx; + realposy = y * REALPOS_MAX / suvilmaxy; + + state->buttons = + !!(data[0]&1) * GPM_B_LEFT + + !!(data[0]&2) * GPM_B_RIGHT + + !!(data[0]&4) * GPM_B_MIDDLE; + return 0; +} + +/* Wed Jun 14 11:32:27 CEST 2000 gradha@iname.com */ +static int R_suvil(Gpm_Event *state, int fd) +{ + signed char buffer[5]; + static int x, y; + + buffer[0] = 0x98 + ((state->buttons & GPM_B_LEFT) > 0 ? 1:0) + + ((state->buttons & GPM_B_MIDDLE) > 0 ? 2:0) + + ((state->buttons & GPM_B_RIGHT) > 0 ? 3:0); + + x = realposx * suvilmaxx / REALPOS_MAX ; y = realposy; + + buffer[1] = x & 0x7f; + buffer[2] = (x >> 7) & 0x7f; + buffer[3] = y & 0x7f; + buffer[4] = (y >> 7) & 0x7f; + + + + return write (fd, buffer, 5); +} /* 'Genitizer' (kw@dtek.chalmers.se 11/12/97) */ static int M_geni(Gpm_Event *state, unsigned char *data) @@ -1768,6 +1815,57 @@ return type; } +static Gpm_Type *I_suvil(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + char byte; + char config[5]; + + #define SUVIL_SP66 0x06 + + write (fd, 0, 1); /* Reset */ + usleep (400000); /* wait */ + setspeed (fd, 1200, 1200, 1, B1200|CS7|CREAD|CLOCAL|HUPCL|PARENB|PARODD); + write (fd, 0, 1); /* Reset */ + usleep (400000); /* wait */ + + /* First try setting tablet to tablet mode */ + write (fd, "X", 1); + usleep (3000); + + /* Now set stablet speed to 9600 */ + setspeed (fd, 1200, 9600, 1, B9600|CS8|CREAD|CLOCAL|HUPCL|PARENB|PARODD); + + /* Set tablet to not report coordinates and ask model */ + write (fd, "D?", 2); + usleep (3000); + read (fd, &byte, 1); + + switch (byte) + { + case 'S': + case SUVIL_SP66: + byte = SUVIL_SP66; + /* Set upper left origin and read maximum resolution range */ + write (fd, "ba", 2); + read (fd, config, 5); + + suvilmaxx = config[2]*128+config[1]; + suvilmaxy = config[4]*128+config[3]; + + /* Finally set tablet to report absolute coordinates in stream mode */ + write (fd, "I!@", 3); + break; + + default: + /* Don't support this model */ + return NULL; + break; + } + + return type; +} + static Gpm_Type *I_mtouch(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { @@ -2043,6 +2141,9 @@ "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + {"suvil", "Suvil Penbrush Professional (sp-66)", "", M_suvil, I_suvil, STD_FLG, + {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_suvil}, + {"", "", "", NULL, NULL, 0, {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} @@ -2068,7 +2169,7 @@ } - + /* * Use 4 as indent-level. It used to be 2, but new stuff will be inserted * using 4.