233 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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 <staikos@0wned.org> - 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
 |