Only in gpm-1.17.9.mod: MODIFIED diff -u gpm-1.17.9/README gpm-1.17.9.mod/README --- gpm-1.17.9/README Fri Aug 6 01:35:34 1999 +++ gpm-1.17.9.mod/README Fri Jan 21 20:55:49 2000 @@ -268,3 +268,6 @@ Edmund Grimley Evans (edmund@vocalis.com) Added "-t ms+lr" +George Staikos (staikos@0wned.org) + Added support for auto-reinitialise of mouse. + Common subdirectories: gpm-1.17.9/doc and gpm-1.17.9.mod/doc diff -u gpm-1.17.9/gpm.c gpm-1.17.9.mod/gpm.c --- gpm-1.17.9/gpm.c Fri Aug 6 01:35:33 1999 +++ gpm-1.17.9.mod/gpm.c Fri Jan 21 20:50:40 2000 @@ -60,7 +60,7 @@ { DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, - DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, 0, (Gpm_Type *)NULL }, }; @@ -404,7 +404,7 @@ if ( ((data=getMouseData(fd,m_type,kd_mode))==NULL) || ((*(m_type->fun))(&nEvent,data)==-1) ) { - if (!i) return 0; + if (!i) return -1; else break; } @@ -865,27 +865,17 @@ unlink(GPM_NODE_CTL); } -/*-------------------------------------------------------------------*/ -int main(int argc, char **argv) -{ - int ctlfd, newfd; - struct sockaddr_un ctladdr; - int i, len, kd_mode, fd; - struct timeval timeout; - int maxfd=-1; - int pending; - Gpm_Event event; - prgname=argv[0]; - setuid(0); /* just in case... */ - -/*....................................... parse command line */ +/* + * Moved the initialization code in here so we can reuse it if + * the auto-reinit flag is set and the mouse is unplugged on us. + * + * George Staikos - Jan 21/2000 + */ - cmdline(argc, argv); - atexit(gpm_exited); +static inline int initMouse(int i, int *fd, int *maxfd) +{ - for (i=1; i <= 1+opt_double; i++) - { which_mouse=mouse_table+i; /* used to access options */ /* open the device with ndelay, to catch a locked device */ @@ -893,22 +883,22 @@ { if (!strcmp(opt_dev,"-")) fd=0; - else if ((fd=open(opt_dev,O_RDWR | O_NDELAY))<0) + else if ((*fd=open(opt_dev,O_RDWR | O_NDELAY))<0) { oops(opt_dev); } } else /* use "/dev/mouse" */ { opt_dev = "/dev/mouse"; - if ((fd=open(opt_dev,O_RDWR | O_NDELAY))<0) + if ((*fd=open(opt_dev,O_RDWR | O_NDELAY))<0) { oops(opt_dev); } } /* and then reset the flag */ - fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) & ~O_NDELAY); + fcntl(*fd,F_SETFL,fcntl(*fd,F_GETFL) & ~O_NDELAY); /* init the device, and change mouse type */ if (m_type->init) - m_type=(m_type->init)(fd, m_type->flags, m_type); + m_type=(m_type->init)(*fd, m_type->flags, m_type); if (!m_type) { oops("mouse initialization failed"); } @@ -916,13 +906,39 @@ { unsigned int modem_lines; - ioctl(fd, TIOCMGET, &modem_lines); + ioctl(*fd, TIOCMGET, &modem_lines); modem_lines &= ~opt_toggle; - ioctl(fd, TIOCMSET, &modem_lines); + ioctl(*fd, TIOCMSET, &modem_lines); } - which_mouse->fd=fd; - maxfd=max(fd, maxfd); + which_mouse->fd=*fd; + *maxfd=max(*fd, *maxfd); +} + + + +/*-------------------------------------------------------------------*/ +int main(int argc, char **argv) +{ + int ctlfd, newfd; + struct sockaddr_un ctladdr; + int i, len, kd_mode, fd; + struct timeval timeout; + int maxfd=-1; + int pending; + Gpm_Event event; + + prgname=argv[0]; + setuid(0); /* just in case... */ + +/*....................................... parse command line */ + + cmdline(argc, argv); + atexit(gpm_exited); + + for (i=1; i <= 1+opt_double; i++) + { + initMouse(i, &fd, &maxfd); } /*for*/ /*....................................... catch interesting signals */ @@ -1055,8 +1071,10 @@ which_mouse=mouse_table+i; /* used to access options */ if (FD_ISSET(which_mouse->fd,&selSet)) { + int rc; FD_CLR(which_mouse->fd,&selSet); pending--; - if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) + rc = processMouse(which_mouse->fd, &event, m_type, kd_mode); + if (rc > 0) /* * pass it to the client, if any * or to the default handler, if any @@ -1065,6 +1083,16 @@ (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) || (cinfo[0] && do_client(cinfo[0], &event)) || do_selection(&event); + else if ((rc == -1) && opt_auto_reinit) { + /* try to reinitialise the mouse */ + gpm_debug_log(LOG_WARNING, + "Mouse was removed. Trying to reinitialise.\n"); + FD_CLR(which_mouse->fd, &selSet); + close(which_mouse->fd); + initMouse(i, &fd, &maxfd); + FD_CLR(which_mouse->fd, &selSet); + } + } else { } } diff -u gpm-1.17.9/gpmInt.h gpm-1.17.9.mod/gpmInt.h --- gpm-1.17.9/gpmInt.h Fri Aug 6 01:35:34 1999 +++ gpm-1.17.9.mod/gpmInt.h Fri Jan 21 20:19:38 2000 @@ -87,6 +87,7 @@ char *opt_type, *opt_dev, *opt_sequence; int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_toggle, opt_glidepoint_tap; + int opt_auto_reinit; Gpm_Type *m_type; int fd; }; @@ -110,7 +111,8 @@ #define opt_toggle (which_mouse->opt_toggle) #define opt_glidepoint_tap \ (which_mouse->opt_glidepoint_tap) - +#define opt_auto_reinit \ + (which_mouse->opt_auto_reinit) #define m_type (which_mouse->m_type) /* the other variables */ diff -u gpm-1.17.9/gpn.c gpm-1.17.9.mod/gpn.c --- gpm-1.17.9/gpn.c Fri Aug 6 01:35:33 1999 +++ gpm-1.17.9.mod/gpn.c Fri Jan 21 20:13:18 2000 @@ -212,7 +212,8 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" - " -V verbosity increase number of logged messages\n", + " -V verbosity increase number of logged messages\n" + " -y automatically reinitialize when unplugged\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; @@ -296,7 +297,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TyvV::23"; int i, opt; FILE *f; static struct {char *in; char *out;} seq[] = { @@ -374,6 +375,7 @@ break; case 't': opt_type=optarg; break; case 'T': opt_test++; break; + case 'y': opt_auto_reinit++; break; case 'v': printf(GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); exit(0); case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); diff -u gpm-1.17.9/mouse-test.c gpm-1.17.9.mod/mouse-test.c --- gpm-1.17.9/mouse-test.c Fri Aug 6 01:35:34 1999 +++ gpm-1.17.9.mod/mouse-test.c Fri Jan 21 20:18:57 2000 @@ -54,7 +54,7 @@ struct mouse_features mymouse = { DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, - DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, 0, (Gpm_Type *)NULL }; Common subdirectories: gpm-1.17.9/sample and gpm-1.17.9.mod/sample