--- gpm-1.15.5/gpm.c Fri Aug 28 00:25:06 1998 +++ gpm.c Sat Sep 12 23:28:34 1998 @@ -20,7 +20,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ -static char rcsid[] = "$Id: gpm.c,v 1.6 1998/08/20 06:59:35 itz Exp $"; +static char rcsid[] = "$Id: gpm.c,v 1.8 1998/09/13 06:28:34 itz Exp $"; #include #include @@ -74,6 +74,7 @@ int opt_ptrdrag=DEF_PTRDRAG; int opt_kill=0; int opt_repeater=0, opt_double=0; +int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ char *consolename = "/dev/tty0"; static int opt_resize=0; /* not really an option */ @@ -161,6 +162,10 @@ if (ioctl(fd, TIOCLINUX, buf+sizeof(short)-1) < 0) oops("ioctl(TIOCLINUX)"); close(fd); + + if (mode < 3) { + opt_aged = 0; + } /*if*/ } @@ -170,6 +175,11 @@ char c=3; int fd; + if (opt_aged) { + gpm_debug_log(LOG_DEBUG,"Skipping paste; selection has aged"); + return; + } /*if*/ + fd=open_console(O_WRONLY); if (ioctl(fd, TIOCLINUX, &c) < 0) oops("ioctl(TIOCLINUX)"); @@ -580,6 +590,28 @@ return 1; } +/* itz Sat Sep 12 20:46:51 PDT 1998 this used to be shared with + gpn.c. Mixing apples and oranges. */ + +static void +xfer_options(int fd) +{ + struct mouse_features *which_mouse=mouse_table+1; /* local */ + struct {int a,B,d,i,p,r,V,A;} opts; /* -l already processed */ + + read(fd,&opts,sizeof(opts)); + opt_accel=opts.a; + sprintf(opt_sequence,"%08d",opts.B); + opt_delta=opts.d; + opt_time=opts.i; opt_ptrdrag=opts.p; opt_scale=opts.r; + gpm_debug_level = opts.V; + opt_aged = opts.A; + gpm_debug_log(LOG_INFO,"got %i,%i,%i,%i,%i,%i,%i,%i", opt_accel, opts.B, + opt_delta, opt_time, opt_ptrdrag, opt_scale, + gpm_debug_level, opt_aged); + kill(getpid(),SIGWINCH); /* update delta's */ +} + /*-------------------------------------------------------------------*/ /* returns -1 if closing connection */ static inline int processRequest(Gpm_Cinfo *ci, int vc) @@ -642,27 +674,27 @@ switch(conn.vc) { case GPM_REQ_SNAPSHOT: - i=open_console(O_RDONLY); - ioctl(i,VT_GETSTATE,&stat); - event.modifiers=6; /* code for the ioctl */ - if (ioctl(i,TIOCLINUX,&(event.modifiers))<0) - oops("get_shift_state"); - close(i); - event.vc = stat.v_active; - event.x=statusX; event.y=statusY; - event.dx=maxx; event.dy=maxy; - event.buttons= statusB; - event.clicks=statusC; - /* fall through */ + i=open_console(O_RDONLY); + ioctl(i,VT_GETSTATE,&stat); + event.modifiers=6; /* code for the ioctl */ + if (ioctl(i,TIOCLINUX,&(event.modifiers))<0) + oops("get_shift_state"); + close(i); + event.vc = stat.v_active; + event.x=statusX; event.y=statusY; + event.dx=maxx; event.dy=maxy; + event.buttons= statusB; + event.clicks=statusC; + /* fall through */ case GPM_REQ_BUTTONS: - event.type= (opt_three==1 ? 3 : 2); /* buttons */ - write(ci->fd,&event,sizeof(Gpm_Event)); - break; + event.type= (opt_three==1 ? 3 : 2); /* buttons */ + write(ci->fd,&event,sizeof(Gpm_Event)); + break; case GPM_REQ_CONFIG: - xfer_options(1,ci->fd); - break; + xfer_options(ci->fd); + break; } return 0; @@ -716,13 +748,14 @@ free(info); return -1; } + if (stat (addr.sun_path, &statbuf) == -1 || !S_ISSOCK(statbuf.st_mode)) { - gpm_debug_log (LOG_ERR, "Address not a socket in processConn"); + gpm_debug_log (LOG_ERR, "Address %s not a socket in processConn",addr.sun_path); free(info); /* itz 10-12-95 verify client's right */ return -1; /* to read requested tty */ } /*if*/ - + unlink (addr.sun_path); /* delete socket */ staletime = time(0) - 30; @@ -803,16 +836,18 @@ gpm_exited(void) { gpm_debug_log(LOG_DEBUG,"Removing files %s and %s", GPM_NODE_PID, GPM_NODE_CTL); - unlink(GPM_NODE_PID); + if (gpm_log_daemon) { + unlink(GPM_NODE_PID); + } /*if*/ unlink(GPM_NODE_CTL); } /*-------------------------------------------------------------------*/ int main(int argc, char **argv) { - int mousefd, ctlfd, newfd; + int ctlfd, newfd; struct sockaddr_un ctladdr; - int i, len, kd_mode; + int i, len, kd_mode, fd; struct timeval timeout; int maxfd=-1; int pending; @@ -823,14 +858,52 @@ /*....................................... parse command line */ - mousefd=cmdline(argc, argv); - maxfd=max(mousefd,maxfd); + cmdline(argc, argv); + atexit(gpm_exited); + + 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 */ + if (opt_dev) + { + if (!strcmp(opt_dev,"-")) + fd=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) + { oops(opt_dev); } + } + + /* and then reset the flag */ + 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); + if (!m_type) + { fprintf(stderr, "mouse initialization failed\n"); exit(1); } + + if (opt_toggle) + { + unsigned int modem_lines; + + ioctl(fd, TIOCMGET, &modem_lines); + modem_lines &= ~opt_toggle; + ioctl(fd, TIOCMSET, &modem_lines); + } + + which_mouse->fd=fd; + maxfd=max(fd, maxfd); + } /*for*/ /*....................................... catch interesting signals */ - if (!opt_kill && !opt_quit) { - atexit(gpm_exited); - } /*if*/ signal(SIGTERM, gpm_killed); signal(SIGINT, gpm_killed); signal(SIGUSR1, gpm_killed); /* usr1 is used by a new gpm killing the old */ @@ -875,7 +948,7 @@ FD_SET(mouse_table[2].fd,&connSet); readySet=connSet; - FD_SET(mousefd,&readySet); + FD_SET(mouse_table[1].fd,&readySet); signal(SIGPIPE,SIG_IGN); /* WARN */ @@ -941,10 +1014,10 @@ close(fd); if (kd_mode != KD_TEXT && !opt_repeater) { - wait_text(&mousefd); - maxfd=max(maxfd,mousefd); + wait_text(&mouse_table[1].fd); + maxfd=max(maxfd,mouse_table[1].fd); readySet=connSet; - FD_SET(mousefd,&readySet); + FD_SET(mouse_table[1].fd,&readySet); continue; /* reselect */ } } @@ -998,8 +1071,19 @@ if (FD_ISSET(ci->fd,&selSet)) { FD_CLR(ci->fd,&selSet); pending--; + + /* itz Sat Sep 12 21:10:22 PDT 1998 */ + /* this code is clearly incorrect; the next highest + descriptor after the one we're closing is not necessarily + being used. Fortunately, it doesn't hurt simply to leave this + out. */ + +#ifdef NOTDEF if ((processRequest(ci,i)==-1) && maxfd==ci->fd) maxfd--; +#else + (void)processRequest(ci,i); +#endif } } } --- gpm-1.15.5/gpn.c Fri Aug 28 00:25:06 1998 +++ gpn.c Sat Sep 12 22:46:11 1998 @@ -20,7 +20,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ -static char rcsid[] = "$Id: gpn.c,v 1.10 1998/08/14 20:19:59 itz Exp $"; +static char rcsid[] = "$Id: gpn.c,v 1.11 1998/09/13 05:46:11 itz Exp $"; #include #include @@ -56,7 +56,8 @@ extern int errno; -static int check_uniqueness(int retain); +static void check_uniqueness(void); +static void check_kill(void); /*===================================================================*/ /* octal digit */ @@ -138,48 +139,38 @@ } /*===================================================================* - * This function transfers "-a -B -p -i -l -p -r" to a running server, - * or gets the options from another server. + * This function transfers "-a -B -p -i -l -p -r" to a running server. *-------------------------------------------------------------------*/ -int -xfer_options(int direction, int fd) +static int +xfer_options(void) { - Gpm_Connect fake = {0,0,0,0,getpid(),1}; - Gpm_Connect req = {0,0,0,0, 0, GPM_REQ_CONFIG}; struct mouse_features *which_mouse=mouse_table+1; /* local */ + struct {int a,B,d,i,p,r,V,A;} opts; /* -l already processed */ + Gpm_Connect fake; char *tty; - struct {int a,B,d,i,p,r;} opts; /* -l already processed */ + int fd; + + fake.minMod = fake.maxMod = fake.eventMask = fake.defaultMask = 0; + opts.a=opt_accel; sscanf(opt_sequence,"%d",&opts.B); opts.d=opt_delta; + opts.i=opt_time; opts.p=opt_ptrdrag; opts.r=opt_scale; + opts.V = gpm_debug_level; opts.A = opt_aged; + + tty=ttyname(0); /* stdin */ + if (!tty) oops("ttyname()"); + if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) + {fprintf(stderr,"%s: %s: not a virtual console\n",prgname,tty);exit(1);} - if (direction==0) /* out */ - { - opts.a=opt_accel; sscanf(opt_sequence,"%d",&opts.B); opts.d=opt_delta; - opts.i=opt_time; opts.p=opt_ptrdrag; opts.r=opt_scale; - fd=check_uniqueness(1); - if (fd<0) oops(GPM_NODE_CTL); - tty=ttyname(0); /* stdin */ - if (!tty) oops("ttyname()"); - if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) - {fprintf(stderr,"%s: %s: not a virtual console\n",prgname,tty);exit(1);} - write(fd,&fake,sizeof(Gpm_Connect)); - write(fd,&req,sizeof(Gpm_Connect)); - write(fd,&opts,sizeof(opts)); - close(fd); - return 0; - } - if (direction==1) /* in */ - { - read(fd,&opts,sizeof(opts)); - opt_accel=opts.a; - sprintf(opt_sequence,"%08d",opts.B); - opt_delta=opts.d; - opt_time=opts.i; opt_ptrdrag=opts.p; opt_scale=opts.r; - gpm_debug_log(LOG_INFO,"got %i,%i,%i,%i,%i,%i", opt_accel, opts.B, - opt_delta, opt_time, opt_ptrdrag, opt_scale); - kill(getpid(),SIGWINCH); /* update delta's */ - return 0; - } - return -1; + if (-1 == (fd = Gpm_Open(&fake, -1))) { + oops("Gpm_Open()"); + } /*if*/ + + fake.pid = 0; fake.vc = GPM_REQ_CONFIG; + write(fd,&fake,sizeof(Gpm_Connect)); + write(fd,&opts,sizeof(opts)); + Gpm_Close(); + return 0; } + /*===================================================================*/ static int usage(char *whofailed) @@ -195,6 +186,7 @@ printf("Usage: %s [options]\n",prgname); printf(" Valid options are (not all of them are implemented)\n" " -a accel sets the acceleration (default %d)\n" + " -A start with selection disabled (`aged')\n" " -b baud-rate sets the baud rate (default %d)\n" " -B sequence allows changing the buttons (default '%s')\n" " -d delta sets the delta value (default %d) (must be 2 or more)\n" @@ -225,65 +217,86 @@ return 1; } -/*===================================================================* - * If "retain" is not 0, then a connection is open, and the fd is - * returned (used by "-q"). Otherwise, a check is performed - *-------------------------------------------------------------------*/ -static int -check_uniqueness(int retain) +/* itz Sat Sep 12 10:55:51 PDT 1998 Added this is replacement for the + unwanted functionality in check_uniqueness. */ + +static void +check_kill(void) { - struct sockaddr_un ctladdr; - int ctlfd, pid, len; FILE *f; + int old_pid; + FILE* fp = fopen(GPM_NODE_PID, "r"); + + if (0 == fp) { + if (opt_kill) { + oops(GPM_NODE_PID); + } else { + return; + } /*if*/ + } /*if*/ - bzero((char *)&ctladdr,sizeof(ctladdr)); - ctladdr.sun_family=AF_UNIX; - strcpy(ctladdr.sun_path, GPM_NODE_CTL); - len=sizeof(ctladdr.sun_family)+strlen(GPM_NODE_CTL); + if (1 != fscanf(fp,"%d",&old_pid)) { + oops(GPM_NODE_PID); + } /*if*/ + fclose(fp); - if ( (ctlfd=socket(AF_UNIX,SOCK_STREAM,0))<0 ) - oops("socket()"); + if (-1 == kill(old_pid,0)) { + gpm_debug_log(LOG_NOTICE, "Removing stale pid file %s", + GPM_NODE_PID); + } /*if*/ - if ( connect(ctlfd,(struct sockaddr *)(&ctladdr),len)>=0 || opt_kill) - { - if (retain) return ctlfd; - /* another gpm is runnin, get its pid */ - f=fopen(GPM_NODE_PID,"r"); - if (f && fscanf(f,"%i",&pid)==1) - { - if (opt_kill) - { - if (kill(pid,SIGUSR1)==-1) oops("kill()"); - } - else - { - gpm_oops(__FILE__,__LINE__,"%s is already running as pid %i",prgname, pid); - } - } - else - { - oops(GPM_NODE_PID); - } - } /*if*/ + if (opt_kill) { + kill(old_pid, SIGTERM); + exit(0); + } /*if*/ +} - /* not connected, so I'm alone */ - if (retain) - { close(ctlfd); return -1; } +/* itz Sat Sep 12 10:30:05 PDT 1998 this function used to mix two + completely different things; opening a socket to a running daemon + and checking that a running daemon existed. Ugly. */ - if (opt_kill) - { - gpm_debug_log(LOG_NOTICE,"Nobody to kill"); - unlink(GPM_NODE_PID); /* just in case */ - exit(0); - } - return 0; /* never */ +static void +check_uniqueness(void) +{ + static char tmp_pidfile [] = GPM_NODE_DIR "gpmXXXXXX"; + FILE* fp = 0; + + if (!mktemp(tmp_pidfile + strlen(GPM_NODE_DIR))) { + oops("mktemp()"); + } /*if*/ + if ((fp = fopen(tmp_pidfile,"w")) != NULL) { + fprintf(fp,"%d\n",getpid()); + fclose(fp); + } else if (getuid()) { + gpm_oops(__FILE__,__LINE__,"you're not root, can you write to %s?", + GPM_NODE_DIR); + } else { + oops(tmp_pidfile); + } /*if*/ + + /* now, try to link it to the real pid name; if that fails, the + file already exists, meaning another instance of the daemon is + already running */ + + if (link(tmp_pidfile, GPM_NODE_PID) == -1) { + fp = fopen(GPM_NODE_PID, "r"); + if (fp) { + int old_pid = -1; + fscanf(fp, "%d", &old_pid); + gpm_oops(__FILE__,__LINE__,"gpm already running as pid %d", old_pid); + } else { + oops(GPM_NODE_PID); + } /*if*/ + } else { + unlink(tmp_pidfile); + } /*if*/ } /*===================================================================*/ int cmdline(int argc, char **argv) { - char options[]="a:b:B:d:Dg:hi:kl:m:Mo:pqr:Rs:S:t:TvV::23"; - int i, opt, fd; + char options[]="a:Ab:B:d:Dg:hi:kl:m:Mo:pqr:Rs:S:t:TvV::23"; + int i, opt; FILE *f; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -308,6 +321,7 @@ switch (opt) { case 'a': opt_accel = atoi(optarg); break; + case 'A': opt_aged++; break; case 'b': opt_baud = atoi(optarg); break; case 'B': opt_sequence = optarg; break; case 'd': opt_delta = atoi(optarg); break; @@ -357,10 +371,10 @@ } openlog(prgname, LOG_PID, gpm_log_daemon ? LOG_DAEMON : LOG_USER); + check_kill(); if (!opt_quit) { - check_uniqueness(0); loadlut(opt_lut); } if (opt_repeater) @@ -393,10 +407,6 @@ if (!seq[opt].in) exit(usage("button sequence")); opt_sequence=strdup(seq[opt].out); /* I can rewrite on it */ - /* now we can put the options */ - if (opt_quit) { exit(xfer_options(0,0)); } - - /* look for the type */ for (m_type=mice; m_type->fun; m_type++) if (!strcmp(opt_type,m_type->name) @@ -406,41 +416,13 @@ if (!(m_type->fun)) /* not found */ exit(M_listTypes()); - /* open the device with ndelay, to catch a locked device */ - if (opt_dev) - { - if (!strcmp(opt_dev,"-")) - fd=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) - { oops(opt_dev); } - } + } /*for*/ - /* and then reset the flag */ - 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); - if (!m_type) - { fprintf(stderr, "mouse initialization failed\n"); exit(1); } - - if (opt_toggle) - { - unsigned int modem_lines; - - ioctl(fd, TIOCMGET, &modem_lines); - modem_lines &= ~opt_toggle; - ioctl(fd, TIOCMSET, &modem_lines); - } - - which_mouse->fd=fd; - } + /* now we can put the options */ + if (opt_quit) { + int st = xfer_options(); + exit(st); + } /*if*/ if (gpm_log_daemon) { /* itz Wed Aug 12 15:44:37 PDT 1998 */ /* now a runtime option */ @@ -459,26 +441,13 @@ oops("freopen(stderr) failed"); } if (setsid()<0) oops("setsid()"); - } /*if*/ + if (chdir("/")<0) oops("/"); - /* chdir */ - if (chdir(GPM_NODE_DIR) && mkdir(GPM_NODE_DIR,GPM_NODE_DIR_MODE)) - oops(GPM_NODE_DIR); - if (chdir(GPM_NODE_DIR)) - oops(GPM_NODE_DIR); /* well, I must create my directory first */ - - /* now sign */ - f=fopen(GPM_NODE_PID,"w"); - if (!f) - { - if (getuid()) { - gpm_oops(__FILE__,__LINE__,"you're not root, can you write to %s?", - GPM_NODE_DIR); - } /*if*/ - } /*if*/ - fprintf(f,"%i\n",getpid()); - fclose(f); - gpm_debug_log(LOG_INFO,"Signed"); + /* now sign */ + check_uniqueness(); + gpm_debug_log(LOG_INFO,"Signed"); + + } /*if*/ /* * well, I used to create a symlink in the /tmp dir to be compliant with old --- gpm-1.15.5/mice.c Fri Aug 28 00:25:06 1998 +++ mice.c Mon Sep 14 18:05:21 1998 @@ -21,7 +21,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ -static char rcsid[] = "$Id: mice.c,v 1.6 1998/08/14 20:51:42 itz Exp itz $"; +static char rcsid[] = "$Id: mice.c,v 1.7 1998/09/15 01:05:21 itz Exp $"; /* * This file is part of the mouse server. The information herein --- gpm-1.15.5/liblow.c Fri Aug 28 00:25:06 1998 +++ liblow.c Tue Sep 1 22:24:03 1998 @@ -22,7 +22,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ -static char rcsid[] = "$Id: liblow.c,v 1.3 1998/08/20 06:32:40 itz Exp $"; +static char rcsid[] = "$Id: liblow.c,v 1.4 1998/09/02 05:24:02 itz Exp $"; #include #include @@ -474,15 +474,13 @@ #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; - static int prevchar=EOF; +#define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ + static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; extern gpm_convert_event(char *data, Gpm_Event *event); int c; char mdata[4]; - if ((c=prevchar)!=EOF) /* if ungetc() didn't suffice... */ - { - prevchar=EOF; - return c; - } + if (nbprevchar) /* if there are some consumed char ... */ + return prevchar[--nbprevchar]; while(1) { @@ -501,14 +499,15 @@ if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) return c; if ((c=fgetc(f))!='[') - {ungetc(c,f); return 0x1B;} + {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ /* '[': go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) - {ungetc(c,f); return 0x1B;} + {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ if ((c=fgetc(f))!='M') - {ungetc(c,f);prevchar='['; return 0x1B;} + /* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/ + {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;} /* now, it surely is a mouse event */ --- gpm-1.15.5/libxtra.c Fri Aug 28 00:25:06 1998 +++ libxtra.c Sat Sep 12 23:26:14 1998 @@ -21,7 +21,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ -static char rcsid[] = "$Id: libxtra.c,v 1.3 1998/07/02 03:58:40 itz Exp $"; +static char rcsid[] = "$Id: libxtra.c,v 1.8 1998/09/13 06:26:14 itz Exp $"; #include #include @@ -40,7 +40,7 @@ */ static char *gpml_ver_s=GPM_RELEASE; -static int gpml_ver_i; +static int gpml_ver_i = 0; char *Gpm_GetLibVersion(int *where) { @@ -56,7 +56,7 @@ } static char gpm_ver_s[16]; -static int gpm_ver_i; +static int gpm_ver_i = 0; char *Gpm_GetServerVersion(int *where) { @@ -66,10 +66,10 @@ if (!gpm_ver_s[0]) { - f=popen("gpm -v","r"); + f=popen(SBINDIR "/gpm -v","r"); if (!f) return NULL; fgets(line,128,f); - pclose(f); + if (pclose(f)) return 0; sscanf(line,"%*s %s",gpm_ver_s); /* "gpm-Linux 0.98, March 1995" */ gpm_ver_s[strlen(gpm_ver_s)-1]='\0'; /* cut the ',' */ @@ -80,7 +80,6 @@ if (where) *where=gpm_ver_i; return gpm_ver_s; } - /*-------------------------------------------------------------------*/ /* --- gpm-1.15.5/mev.c Fri Aug 28 00:25:06 1998 +++ mev.c Sat Sep 12 23:23:15 1998 @@ -2,6 +2,7 @@ * mev.c - simple client to print mouse events (gpm-Linux) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) + * Copyright (C) 1998 Ian Zimmerman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,6 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ + +static char rcsid[] = "$Id: mev.c,v 1.3 1998/09/13 06:23:15 itz Exp $"; /* * This client is meant to be used both interactively to check --- gpm-1.15.5/mouse-test.c Fri Aug 28 00:25:06 1998 +++ mouse-test.c Wed Sep 2 10:10:57 1998 @@ -19,7 +19,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ********/ -static char rcsid[] = "$Id: mouse-test.c,v 1.2 1998/07/02 04:12:58 itz Exp $"; +static char rcsid[] = "$Id: mouse-test.c,v 1.3 1998/09/02 17:10:47 root Exp $"; /* This code is horrible. Browse it at your risk */ @@ -132,9 +132,12 @@ struct device **makedev(struct device **current, char *name) { - int fd; - if ((fd=open(name,O_RDWR))==-1) + int fd; int modes; + if ((fd=open(name,O_RDWR|O_NONBLOCK))==-1) { perror(name); return current; } + modes = fcntl(fd, F_GETFL); + if (0 > fcntl(fd, F_SETFL, modes & ~O_NONBLOCK)) + { close(fd); perror(name); return current; } *current=malloc(sizeof(struct device)); if (!*current) oops("malloc()"); --- gpm-1.15.5/libcurses.c Fri Aug 28 00:25:06 1998 +++ libcurses.c Sat Sep 12 23:36:15 1998 @@ -42,15 +42,6 @@ #define GET(win) ((win) ? wgetch(win) : getch()) -#ifdef __ELF__ -#ifdef PIC -#ifdef HAVE_GNU_STABS_H -#include -weak_symbol(wgetch); -#endif /* HAVE_GNU_STABS_H */ -#endif /* PIC */ -#endif /* __ELF__ */ - int Gpm_Wgetch(WINDOW *win) { fd_set selSet; @@ -99,15 +90,22 @@ #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; - static int prevchar=EOF; +/* JD patch 11/08/1998 */ +#define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ + static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; extern gpm_convert_event(char *data, Gpm_Event *event); int c; char mdata[4]; - if ((c=prevchar)!=EOF) /* if ungetc() didn't suffice... */ +/* JD patch 11/08/1998 */ + if (nbprevchar) /* if there are some consumed char ... */ + return prevchar[--nbprevchar]; +/* if ungetc() didn't suffice... */ +/* if ((c=prevchar)!=EOF) { prevchar=EOF; return c; } +*/ while(1) { @@ -126,14 +124,21 @@ if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) return c; if ((c=GET(win))!='[') - {ungetc(c,stdin); return 0x1B;} + {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ + /* {ungetc(c,stdin); return 0x1B;} */ /* '[': go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; + if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) - {ungetc(c,stdin); return 0x1B;} + {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ + /* {ungetc(c,stdin); return 0x1B;} */ + if ((c=GET(win))!='M') - {ungetc(c,stdin);prevchar='['; return 0x1B;} + /* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/ + {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;} + /* {ungetc(c,stdin);prevchar='['; return 0x1B;} */ + /* now, it surely is a mouse event */ --- gpm-1.15.5/gpm.h Fri Aug 28 00:25:06 1998 +++ gpm.h Sat Sep 12 23:24:35 1998 @@ -22,7 +22,7 @@ #ifndef _GPM_H_ #define _GPM_H_ -/* $Id: gpm.h,v 1.2 1998/07/01 19:16:49 itz Exp $ */ +/* $Id: gpm.h,v 1.6 1998/09/13 06:24:35 itz Exp $ */ #include /* _PATH_VARRUN etc. */ @@ -31,6 +31,7 @@ #endif /*....................................... Xtermish stuff */ + #define GPM_XTERM_ON \ printf("%c[?1001s",27), fflush(stdout), /* save old hilit tracking */ \ printf("%c[?1000h",27), fflush(stdout) /* enable mouse tracking */ --- gpm-1.15.5/gpmInt.h Fri Aug 28 00:25:06 1998 +++ gpmInt.h Sat Sep 12 23:27:16 1998 @@ -22,7 +22,7 @@ #ifndef _GPMINT_INCLUDED #define _GPMINT_INCLUDED -/* $Id: gpmInt.h,v 1.3 1998/07/02 03:15:55 itz Exp $ */ +/* $Id: gpmInt.h,v 1.8 1998/09/13 06:27:16 itz Exp $ */ #include "gpmCfg.h" #include "gpm.h" @@ -115,6 +115,7 @@ extern int opt_kill; extern int opt_repeater, opt_double; extern int opt_kernel, opt_explicittype; +extern int opt_aged; extern char *opt_special; extern int fifofd; extern char *consolename; /* the selected one */ @@ -129,7 +130,6 @@ int main(int argc, char **argv); /* gpn.c */ -int xfer_options(int direction, int fd); #define oops(s) gpm_oops(__FILE__, __LINE__,(s)) int cmdline(int argc, char **argv); int giveInfo(int request, int fd); --- gpm-1.15.5/twiddler.h Fri Aug 28 00:25:06 1998 +++ twiddler.h Tue Sep 1 22:21:34 1998 @@ -46,7 +46,7 @@ #define TW_M_MASK 0x1FF /* mask of movement bits, after shifting */ #define TW_M_BIT 0x100 -#define TW_SYSTEM_FILE SYSCONFDIR "/etc/gpm-twiddler.conf" -#define TW_CUSTOM_FILE SYSCONFDIR "/etc/gpm-twiddler.user" +#define TW_SYSTEM_FILE SYSCONFDIR "/gpm-twiddler.conf" +#define TW_CUSTOM_FILE SYSCONFDIR "/gpm-twiddler.user" --- gpm-1.15.5/t-mouse.el Fri Aug 28 00:25:06 1998 +++ t-mouse.el Tue Sep 8 14:06:28 1998 @@ -53,6 +53,11 @@ (defvar t-mouse-prev-set-selection-function 'x-set-selection) (defvar t-mouse-prev-get-selection-function 'x-get-selection) +(defvar t-mouse-swap-alt-keys nil + "When set, Emacs will handle mouse events with the right Alt +(a.k.a. Alt-Ger) modifier, not with the regular left Alt modifier. +Useful for people who play strange games with their keyboard tables.") + ;;; Code: @@ -297,7 +302,9 @@ (setq t-mouse-process (start-process "t-mouse" nil "mev" "-i" "-E" "-C" tty - "-M-rightAlt" "-e-move" "-dall" "-d-hard" + (if t-mouse-swap-alt-keys + "-M-leftAlt" "-M-rightAlt") + "-e-move" "-dall" "-d-hard" "-f"))) (setq t-mouse-filter-accumulator "") (set-process-filter t-mouse-process 't-mouse-process-filter) --- gpm-1.15.5/Makefile.in Fri Aug 28 00:25:06 1998 +++ Makefile.in Mon Sep 14 18:06:27 1998 @@ -3,7 +3,7 @@ # Copyright 1994,1997 rubini@linux.it # Copyright 1997 dickey@clark.net # Copyright (C) 1998 Ian Zimmerman -# $Id: Makefile.in,v 1.17 1998/08/28 06:39:55 itz Exp $ +# $Id: Makefile.in,v 1.24 1998/09/15 01:06:27 itz Exp $ # SHELL = /bin/sh @@ -16,6 +16,7 @@ exec_prefix = @exec_prefix@ libdir = @libdir@ +datadir = @datadir@ bindir = @bindir@ sbindir = @sbindir@ includedir = @includedir@ @@ -42,17 +43,17 @@ ETAGS = etags TAR = tar SED = sed - +DIFF = diff # Main portion: regular build rules GSRC = gpm.c gpn.c mice.c special.c twiddler.c -GOBJ = $(GSRC:.c=.o) debuglog.o +GOBJ = $(GSRC:.c=.o) debuglog.o liblow.o -LSRC = liblow.c libhigh.c libxtra.c libcurses.c +LSRC = liblow.c libhigh.c libxtra.c -LOBJ = $(LSRC:.c=.o) debuglog.o +LOBJ = $(LSRC:.c=.o) debuglog.o @CURSES_OBJS@ PICS = $(LOBJ:.o=.pic.o) @@ -64,7 +65,7 @@ PROG = $(POBJ:.o=) -SRCS = $(GSRC) $(LSRC) $(PSRC) debuglog.c +SRCS = $(GSRC) $(LSRC) $(PSRC) debuglog.c libcurses.c DEPS = $(SRCS:.c=.d) gpm-root.d @@ -172,8 +173,8 @@ # Configure & unconfigure -# because twiddler.h and gpm-root.y uses SYSCONFDIR -gpm-root.o twiddler.o: Makefile +# because twiddler.h and gpm-root.y uses SYSCONFDIR & gpn.o uses RELEASE & libxtra uses SBINDIR +libxtra.o libxtra.pic.o gpn.o gpm-root.o twiddler.o: Makefile Makefile: config.status Makefile.in $(SHELL) config.status @@ -195,8 +196,9 @@ @echo 'deletes files that may need special tools to rebuild.' maintainer-clean: barf distclean do-maintainer-clean - cd $(srcdir) && \ - rm -i `ls configure TAGS t-mouse.elc gpm-root.c gpm-@release@.tar.gz 2>/dev/null` + -cd $(srcdir) && \ + rm -i `ls configure TAGS t-mouse.elc gpm-root.c \ + gpm-@release@.tar.gz gpm-*-to-@release@.diff 2>/dev/null` TAGS: $(SRCS) $(HDRS) gpm-root.y do-TAGS cd $(srcdir) && $(ETAGS) -o TAGS $(SRCS) $(HDRS) gpm-root.y @@ -218,6 +220,18 @@ $(TAR) cf gpm-@release@.tar gpm-@release@ gzip gpm-@release@.tar +DIFFS = $(SRCS) $(HDRS) gpm-root.y exec.el t-mouse.el gpm-root.conf \ + gpm-twiddler.conf Makefile.in configure.in aclocal.m4 \ + install.sh mkinstalldirs create_vcs Announce COPYING ChangeLog \ + FAQ README README.twiddler doc/Makefile.in doc/doc.gpm \ + doc/infofilter doc/localstyle.tex doc/manpager doc/mktxt \ + sample/Makefile.in sample/README sample/configure.in \ + sample/gpm-xterm.c sample/gpm-xterm.h sample/rmev.c + +gpm-%-to-@release@.diff: $(DIFFS) gpm-% + for i in $(DIFFS); do \ + $(DIFF) -u gpm-$*/$$i $$i >>$@ ;\ + done # Subdirectory recursion magic --- gpm-1.15.5/configure.in Fri Aug 28 00:25:06 1998 +++ configure.in Sun Sep 13 00:09:38 1998 @@ -3,9 +3,9 @@ AC_INIT(gpmCfg.h) AC_PREREQ(2.12) -AC_REVISION($Id: configure.in,v 1.17 1998/08/28 07:23:09 itz Exp $) +AC_REVISION($Id: configure.in,v 1.21 1998/09/13 07:09:38 itz Exp $) -release=1.15.5 +release=1.15.6 AC_DEFINE_UNQUOTED(GPM_RELEASE,"$release") AC_DEFINE_UNQUOTED(RMEV_RELEASE,"$release") @@ -33,6 +33,14 @@ fi AC_CHECK_HEADERS(syslog.h linux/joystick.h ncurses.h ncurses/curses.h curses.h) +if test ${ac_cv_header_ncurses_h} = yes || + test ${ac_cv_header_ncurses_curses_h} = yes || + test ${ac_cv_header_curses_h} = yes ; then + CURSES_OBJS=libcurses.o +else + CURSES_OBJS= +fi + AC_CHECK_HEADERS(gnu-stabs.h sys/sysmacros.h linux/major.h) AC_CHECK_TYPE(__u32,unsigned) @@ -54,10 +62,11 @@ AC_SUBST(SHLIB) AC_SUBST(PICFLAGS) AC_SUBST(SOLDFLAGS) +AC_SUBST(CURSES_OBJS) lispdir='${datadir}/emacs/site-lisp' AC_SUBST(lispdir) -CPPFLAGS='-I$(srcdir) -I$(top_srcdir) $(DEFS) -DSYSCONFDIR=\"$(sysconfdir)\"' +CPPFLAGS='-I$(srcdir) -I$(top_srcdir) $(DEFS) -DSYSCONFDIR=\"$(sysconfdir)\" -DSBINDIR=\"$(sbindir)\"' LDFLAGS='-L$(top_builddir)' AC_OUTPUT(Makefile doc/Makefile sample/Makefile) --- gpm-1.15.5/ChangeLog Fri Aug 28 00:25:06 1998 +++ ChangeLog Mon Sep 14 18:17:18 1998 @@ -1,3 +1,112 @@ +Mon Sep 14 18:03:45 1998 Ian T Zimmerman + + * doc/Makefile.in (gv): Replace "$(TARGET)" with "gpm". + + * Makefile.in (gpm-%-to-@release@.diff): Added rule to create a + diff from snapshot of previous release. + + * mice.c: Reapply Edmund Grimley Evans' patch with new mouse types + ms+ and ms-lr which get lost somewhere. + +Sun Sep 13 00:08:54 1998 Ian T Zimmerman + + * configure.in: Set CURSES_OBJS dependent on finding the curses header. + +Sat Sep 12 10:53:54 1998 Ian T Zimmerman + + * Makefile.in (LOBJ): Make the buliding of libcurses.o decided by + configure again. + + * libcurses.c (Gpm_Wgetch): Remove the ELF assembler-dependent + wgetch hack again, as it is not really needed as long as clients + are linked statically. + + * gpm.c (processRequest): Removed GPM_REQ_CLEAR again, now that its + functionality is available with the -A flag and opt_aged. + + * gpmInt.h: Removed GPM_REQ_CLEAR again, now that its + functionality is available with the -A flag and opt_aged. + + * libxtra.c: Removed Gpm_ClearSelection() again, now that its + functionality is available with the -A flag and opt_aged. + + * gpm.h: Removed Gpm_ClearSelection() again, now that its + functionality is available with the -A flag and opt_aged. + + * mev.c (interact): Removed "clear" command again, now that its + functionality is available with the -A flag and opt_aged. + + * gpmInt.h: Change signature of xfer_options(). + Remove it altogether, it's better static and split to gpn.c and + gpm.c. + Add opt_aged. + + * gpn.c (check_uniqueness): Completely rewritten. This function + was a messy mixture of different things. + +Wed Sep 9 09:50:59 1998 Ian T Zimmerman + + * libxtra.c (Gpm_GetServerVersion): Provide explicit path for + popen of gpm daemon. + + * sample/Makefile.in (rmev.o): Added target because of usage of + RMEV_RELEASE. + (prefix): Looks like this has to be done in _every_ Makefile, + sigh. Even if it is not used explicitly, configure subsitutes + e.g. "@sysconfdir@" with "$(prefix)/etc". + (sysconfdir): Added sysconfdir. + + * Makefile.in (gpn.o gpm-root.o twiddler.o): gpn.o added to this + target because it uses RELEASE symbol substituted by configure. + +Tue Sep 8 14:04:44 1998 Ian T Zimmerman + + * mev.c (interact): Added case for "clear" command. + + * libxtra.c (Gpm_ClearSelection): Added. + + * gpmInt.h (GPM_REQ_CLEAR): Added (rubino's objection overruled; + the gpm protocol is not really ugly, it's the code that is, in + effect casting the data exchanged to Gpm_Conn and Gpm_Event. It + could be coded cleanly or even fixed from present state, but don't + hold your breath, you could suffocate.) + + * gpm.h: Add Gpm_ClearSelection. + + * t-mouse.el (t-mouse-swap-alt-keys): Added. This is what is + called "personal variable" :-) I swap the left and right Alt keys + in my Linux keytable, but I still want Emacs to handle left-Alt + events. + +Wed Sep 2 00:09:42 1998 Ian T Zimmerman + + * doc/Makefile.in (maintainer-clean): Ignore errors because the file + list can be empty. + + * sample/Makefile.in (maintainer-clean): -rm -i for uniformity. + + * Makefile.in (maintainer-clean): Ignore errors because the file + list can be empty. + + * mouse-test.c (makedev): Add O_NONBLOCK to open ttyS devices + (otherwise the program hangs in this function, at least on my + system). + + * doc/doc.gpm (gpm-root): Use @file at several places in + preference to other markup. Fix several other general + documentation bugs, mostly referring to obsolete (non-)features. + + * doc/Makefile.in (.SECONDARY): Need both %.ps and gpm.ps --- + looks like a gmake bug. + + * sample/gpm-xterm.h: Applied patch by Jean-Daniel + for looking back when scanning arrow key + sequences. + + * Makefile.in (datadir): Oops, need to define this if I define + elispdir. GNU standard document a little incomplete on this + point. + Fri Aug 28 00:06:05 1998 Ian T Zimmerman * configure.in: Oops, autoconf hates newlines between filenames in --- gpm-1.15.5/doc/Makefile.in Fri Aug 28 00:25:06 1998 +++ doc/Makefile.in Mon Sep 14 18:16:39 1998 @@ -19,6 +19,7 @@ top_srcdir = @top_srcdir@ top_builddir = .. +prefix = @prefix@ mandir = @mandir@ man1dir = $(mandir)/man1 man8dir = $(mandir)/man8 @@ -88,7 +89,7 @@ cd $(srcdir) && ./manpager doc.gpm $(srcdir)/gpmdoc.ps: gpm.ps - mv $< $@ + cp $< $@ mostlyclean: rm -f *~ gpm.dvi gpm.log gpm.aux @@ -133,7 +134,7 @@ TAGS: maintainer-clean: distclean - cd $(srcdir) && \ + -cd $(srcdir) && \ rm -i `ls gpmdoc.ps gpm.info gpmdoc.txt gpm.8 mev.1 gpm-root.1` DIST = gpmdoc.ps gpm.info gpmdoc.txt gpm.8 mev.1 gpm-root.1 manpager \ @@ -147,15 +148,12 @@ cp $(srcdir)/$$i $(top_builddir)/gpm-@release@/doc/$$i ;\ done +.PRECIOUS: %.texinfo +.SECONDARY: gpm.ps %.ps -.SECONDARY: gpm.ps - -check: _err.ps - gs -sDEVICE=linux -r320x200x16 $< - -gs: $(TARGET).ps +gs: gpm.ps gs -sDEVICE=linux -r640x480x2 $< -gv: $(TARGET).ps - ghostview $(TARGET).ps -magstep -1 -a4 +gv: gpm.ps + ghostview gpm.ps -magstep -1 -a4 --- gpm-1.15.5/doc/doc.gpm Fri Aug 28 00:25:06 1998 +++ doc/doc.gpm Sat Sep 12 23:20:13 1998 @@ -47,7 +47,7 @@ @setchapternewpage off @set version 1.15 %RELEASE -@set update-month July 1998 +@set update-month September 1998 @c allow changing the predefined style @tex @@ -305,6 +305,16 @@ Set the acceleration value used when a single motion event is longer than @var{delta} (see -d). +@item -A + Start up with selection pasting disabled. This is intended as a + security measure; a plausible attack on a system seems to be to + stuff a nasty shell command into the selection buffer + (@code{rm -rf /}) including the terminating line break, then all the + victim has to do is click the middle mouse button .. With time, + we hope to develop this into a more general aging mechanism; the + gpm daemon will disable (@emph{age}) selection pasting + automatically after a period of inactivity. + @item -b @var{baud} Set the baud rate. @@ -376,12 +386,13 @@ The default is not to show the pointer, which can be confusing as well. @item -q - Quit after changing mouse behaviour. This is intended to allow users - to change the mouse ``feeling'' (@t{-a}, @t{-B}, @t{-d}, @t{-i}, - @t{-l}, @t{-p}, @t{-r}) without restarting the server. Since this - needs root permissions, the system administrators can use the - `set-uid' bits to enable/disable such capability. Changing mouse - parameters is nonetheless only allowed from one of the virtual + Quit after changing mouse behaviour. This is intended to allow + users to change the mouse ``feeling'' (@t{-a}, @t{-B}, @t{-d}, + @t{-i}, @t{-l}, @t{-p}, @t{-r}, @t{-V}, @t{-A}) without + restarting the server. Since this needs root permissions, the + system administrators can use the `set-uid' bits to + enable/disable such capability. Changing mouse parameters is + nonetheless only allowed from one of the virtual consoles. Options are transferred only for the first mouse. @item -r @var{number} @@ -417,10 +428,10 @@ Raise the maximum level of messages that will be logged. Thus a positive argument has the effect of making the program more verbose. One can also give a negative argument to hush the - program; however, note that due to getopt(3) rules a negative + program; however, note that due to @code{getopt(3)} rules a negative argument must follow the option with no space betwixt (that is, @t{-V-1} but not @t{-V -1}. The argument is optional and its - default value is 1. + default value is 1. @xref{Program Arguments,,,libc}. @item -2 Force two buttons. This means that the middle button, if any, @@ -506,7 +517,7 @@ .SH MAINTAINERS Beginning with version 1.14 I release exclusive maintainance. Ian -Zimmermann and Prosa Inc. are going to support gpm development. The +Zimmerman and Prosa Inc. are going to support gpm development. The official contact point is now the mailing list @t{gpm@animal.unipv.it}, thanks to my University which generously hosts gpm discussions. The list is managed by SmartList and anyone is welcome. @@ -543,7 +554,7 @@ interested in, and to get mouse events. When no clients are connected to the active console, the server runs -the selection mechanism (cut and paste of text). The election +the selection mechanism (cut and paste of text). The selection mechanism is a simple and well-designed application, whose behaviour can be cloned by clients, by telling the server to inherit the default response for certain mouse events (@var{motion} being the most @@ -599,8 +610,10 @@ @item short x, y; The position of the mouse pointer where the event - is reported. Is is 1-based, to be compatible with @code{selection} - and @code{libcurses}. + is reported. It is 1-based by default, to be compatible with + @code{selection} and @code{libcurses}. This behavior can be + overriden, though, by setting the library variable + @code{gpm_zerobased}. @xref{Variables}. @item short dx, dy; The change in position since the last reported @@ -842,7 +855,7 @@ multiple programs using suspend-resume (thanks Ian). In addition to the per-console stacks, another stack is there to store -default-handling clients. xref @xref{Default Handlers}. +default-handling clients. @xref{Default Handlers}. Each client registers with the server and tells which events it is interested in. Events not managed by the client can be handled by the @@ -892,7 +905,7 @@ Keyboard modifiers are used to multiplex clients on the same virtual console. You (as a programmer) don't need to care about the internal -workings (which are detailed in ref @xref{Default Handlers}), but only +workings (which are detailed in @ref{Default Handlers}), but only need to choose the right values for your application. Ecamples: @@ -1105,7 +1118,7 @@ Since selection and curses has always been one-based, this variable, zero by default, can be used to trigger zero-based coordinates in event reporting. It must be set before opening the mouse - connection, and never changed later. + connection, and never changed later. @xref{Events}. @vindex gpm_visiblepointer @item int gpm_visiblepointer If not zero, causes the mouse cursor to be always visible on the @@ -1116,10 +1129,11 @@ @itemx gpm_my These variables (max X and max Y) are used when fitting events inside the screen. They are initalized by @t{Gpm_Open}, and - never touched any more. If your application installs a signal - handler for @t{SIGWINCH}, it should modify these variables. I - don't want the client library to install a signal - handler (although 1.11 handlet TSTP). + updated by a @code{SIGWINCH} handler internal to the library. + (Don't worry, the library doesn't @emph{replace} any + @code{SIGWINCH} handler your program may already have installed; + instead the library @emph{hooks} the signal, that is, it calls + any preexisting handler after taking care of its own needs.) @vindex gpm_hflag @item int gpm_hflag Used to signal if a character has been generated @@ -1146,9 +1160,10 @@ @deftypefun int Gpm_Open (Gpm_Connect *@var{conn}, int @var{flag}); @findex Gpm_Open -Open a connection with the server. The @var{conn} parameter points to the -connection information for the being-created connection, as already described. -It is passed to the server after filling the @code{pid} and @code{vc} fields. +Open a connection with the server. The @var{conn} parameter points to +the connection information for the being-created connection, as already +described. @xref{Connection Details}. It is passed to the server after +filling the @code{pid} and @code{vc} fields. @var{flag} should be @code{0} for normal applications, those interested in events related to their own console. The own console is considered to @@ -1265,8 +1280,7 @@ bit will be available in the future to force the pointer in the visible region. -Note that fitting uses @t{gpm_mx} and @t{gpm_my}, which you should -update when necessary. @xref{Variables}. +Note that fitting uses @t{gpm_mx} and @t{gpm_my}. @xref{Variables}. @end deftypefun %-------------------------------------------------------------------------- @@ -1327,13 +1341,14 @@ @node High Level Lib, Xterm, Low Level Library, The ClientLib @section High Level Library -The high level library is part of the main @t{libgpm.a}, but it -acts at a different level of abstraction. The high level library depends -in the lowe-level one, so if you link your application with any object -of the high-level library, you're forced to link in the low-level one too. - -If your application runs under xterm, however @t{gpm-xterm} offers all the -needed functionality. +The high level library is part of the main @t{libgpm.a}, but it acts at +a different level of abstraction. The high level library depends in the +low-level one, so if you link your application with any object of the +high-level library, you're forced to link in the low-level one too. + +If your application @emph{only} runs under xterm, please see +@t{gpm-xterm} in the @file{sample} subdirectory of the distribution, +which offers all the needed functionality. The main role of the high-level library is to define a way to manage windows (or "Regions of Interest" on your text screen). The regions @@ -1504,10 +1519,10 @@ As of release 0.18, @t{gpm}-based applications can run under xterm without any need for recompilation. The library is designed to convert -xterm mouse events to gpm-style structures, so that the client will -get the same events it got under the Linux console. Moreover, -a source file (@t{gpm-xterm.c}) is available to mimick libgpm under -a different OS than Linux. Porting to other text-based consoles is an open +xterm mouse events to gpm-style structures, so that the client will get +the same events it got under the Linux console. Moreover, a source file +@file{sample/gpm-xterm.c} is available to mimick libgpm under a +different OS than Linux. Porting to other text-based consoles is an open issue, but I myself have Linux alone. The goal is to provide a uniform mouse interface with both xterm and the @@ -1557,15 +1572,15 @@ %M The information below is extracted from the texinfo file, which is the %M preferred source of information. -The @code{mev} program is modeled after @code{xev}. It prints to @code{stdout} the +The @t{mev} program is modeled after @t{xev}. It prints to @code{stdout} the console events it gets, both keyboard and mouse events. -@code{mev}'s default behaviour is to get anything, but command line switches +@t{mev}'s default behaviour is to get anything, but command line switches can be used to set the various fields in the @code{Gpm_Connect} structure, in -order to customize the program's behaviour. I'm using @code{mev} to -handle mouse events to @code{emacs} @xref{Emacs Support}. +order to customize the program's behaviour. I'm using @t{mev} to +handle mouse events to @t{emacs} @xref{Emacs Support}. -Command line switches for @code{mev} are the following: +Command line switches for @t{mev} are the following: @table @code @item -C @var{number} @@ -1598,13 +1613,13 @@ @item -m @var{number} Choose the minimum modifier mask. Any event with - fewer modifiers will not be reported to @code{mev}. It defaults to 0. + fewer modifiers will not be reported to @t{mev}. It defaults to 0. The mask must be provided either as a decimal number, or as a symbolic string. @item -M @var{number} Choose the maximum modifier mask. Any event with - more modifier than specified will not be reported to @code{mev}. + more modifier than specified will not be reported to @t{mev}. It defaults to @code{\~0}, i.e. all events are received. The mask must be provided either as a decimal number, or as a symbolic string. @@ -1625,7 +1640,7 @@ Allowed names for modifiers are @samp{shift}, @samp{leftAlt}, @samp{rightAlt}, @samp{anyAlt} (one or the other), @samp{control}. -When the @samp{-i} switch is specified, @code{mev} looks at its standard input as +When the @samp{-i} switch is specified, @t{mev} looks at its standard input as command lines rather than events. The input lines are parsed, and the commands @samp{push} and @samp{pop} are recognized. @@ -1635,13 +1650,14 @@ the connection with the server. @samp{pop} is used to pop the connection stack. If an empty stack is popped the program exits. -The only other commands recognized are @samp{info}, used to return the -stack depth, and @samp{quit} to premautrely terminate the program. +Other commands recognized are @samp{info}, used to return the stack +depth; @samp{quit} to premautrely terminate the program; and +@samp{snapshot} to get some configuration information from the server. @ignore .SH AUTHOR Alessandro Rubini -Ian Zimmermann +Ian Zimmerman .SH FILES .nf @@ -1676,10 +1692,10 @@ @section Emacs Support Emacs support is quite complete as of 0.14. The enclosed file -@code{t-mouse.el}, also available in byte-compiled form, is used to pass -mouse events to emacs. @code{t-mouse.elc} is installed in the -@code{lib/emacs/site-lisp} directory of the install tree -(by default @code{/usr}). +@file{t-mouse.el}, also available in byte-compiled form, is used to pass +mouse events to emacs. @file{t-mouse.elc} is installed in the +@file{share/emacs/site-lisp} directory of the install tree +(by default @file{/usr}). Events with modifiers other than Meta, Control, and Shift are not managed by the library. Managed events are passed to the lisp program, @@ -1690,7 +1706,7 @@ shift-mouse to run selection and control-mouse to run @t{gpm-root}. @xref{gpm-root}. -I suggest to put the following form in your own @code{.emacs} file, to +I suggest to put the following form in your own @file{.emacs} file, to avoid loading @code{t-mouse} when you aren't working on the Linux console: @lisp @@ -1700,19 +1716,21 @@ (load-library "t-mouse")) @end lisp -Mouse events are appended to the list variable unread-command-events -where the Emacs main event loop will find them. They can be made to -trigger any command (or interactive function, in Emacs Lisp terminology) -at all. Actually Emacs already comes with reasonable bindings for most -mouse events, so usually you won't have to do anything beyond installing -t-mouse. If you want to modify what Emacs does in response to mouse -events, please see @xref{Keymaps,,,elisp}. +Mouse events are appended to the list variable +@code{unread-command-events} where the Emacs main event loop will find +them. They can be made to trigger any command (or interactive function, +in Emacs Lisp terminology) at all. Actually Emacs already comes with +reasonable bindings for most mouse events, so usually you won't have to +do anything beyond installing @code{t-mouse}. If you want to modify +what Emacs does in response to mouse events, please see +@ref{Keymaps,,,elisp}. The scrollbar sits on the last column of the screen, though it is not visible. When you click on the last column, a scroll-bar action is taken. -If this annoys you, please let me know. +If this annoys you, again it can be turned off by changing the +appropriate Emacs keymap. -If you kill the @file{gpm} server, Emacs won't respond to mouse events +If you kill the @t{gpm} server, Emacs won't respond to mouse events any more. If the server is then restarted, you can invoke `@t{M-x t-mouse-run}' to restart mouse responsiveness in the editor. @@ -1743,7 +1761,7 @@ newwer, because previous kernels lack some screen handling capabilities required by the program. -The program uses the files @t{/dev/vcs*} to draw to the console screen. +The program uses the files @file{/dev/vcs*} to draw to the console screen. These are available only from kernel 1.1.81 onward. If you miss those device nodes, you should create them using @t{create_vcs} in the distribution directory. The tool won't run with kernels older than 1.1.81, @@ -1760,7 +1778,7 @@ @item -u Deny using user-specific configuration files. With this - option on, only @t{/etc/gpm-root.conf} will be used as a source + option on, only @file{/etc/gpm-root.conf} will be used as a source of configuration information. This option is intended for those system administrators who fear security could be broken by this daemon. Thigs should be sufficiently secure, but @@ -1773,13 +1791,14 @@ it was done with a compile-time option. @item -V @var{verbosity increment} - Raise the maximum level of messages that will be logged. Thus - a positive argument has the effect of making the program more + + Raise the maximum level of messages that will be logged. Thus a + positive argument has the effect of making the program more verbose. One can also give a negative argument to hush the - program; however, note that due to getopt(3) rules a negative + program; however, note that due to @code{getopt(3)} rules a negative argument must follow the option with no space betwixt (that is, - @t{-V-1} but not @t{-V -1}. The argument is optional and its - default value is 1. + @t{-V-1} but not @t{-V -1}. @xref{Program Arguments,,,libc}. + The argument is optional and its default value is 1. @end table @@ -1788,7 +1807,7 @@ the daemon. %M The actual configuration file is better introduced by looking at your -%M `@t{/etc/gpm-root.conf}. +%M @t{/etc/gpm-root.conf}. %M %MSKIP --- gpm-1.15.5/sample/Makefile.in Fri Aug 28 00:25:06 1998 +++ sample/Makefile.in Sat Sep 12 22:51:16 1998 @@ -1,10 +1,14 @@ # simple Makefile.in # Copyright (C) 1998 Ian Zimmerman -# $Id: Makefile.in,v 1.4 1998/08/28 06:46:40 itz Exp $ +# $Id: Makefile.in,v 1.10 1998/09/13 05:51:16 itz Exp $ # include standard stuff SHELL = /bin/sh VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = .. @@ -45,6 +49,9 @@ ### rules to automagically rerun autoconf and such +# RMEV_RELEASE +rmev.o: Makefile + Makefile: $(top_builddir)/config.status Makefile.in cd $(top_builddir) && $(SHELL) config.status @@ -54,7 +61,7 @@ ### maintainer portion --- don't touch unless you know what you're doing maintainer-clean: distclean - rm -f TAGS + -cd $(srcdir) && rm -i `ls TAGS 2>/dev/null` TAGS: rmev.c gpm-xterm.c gpm-xterm.h cd $(srcdir) && $(ETAGS) -o TAGS rmev.c gpm-xterm.c gpm-xterm.h --- gpm-1.15.5/sample/gpm-xterm.c Fri Aug 28 00:25:06 1998 +++ sample/gpm-xterm.c Tue Sep 1 22:04:48 1998 @@ -27,6 +27,8 @@ #include /* select(); */ #include /* timeval */ #include /* socket() */ +/* patch JD 11/08/1998 */ +#include /* strncpm (); */ #ifdef HAVE_NCURSES_H # include @@ -61,7 +63,9 @@ static Gpm_Event ev; static struct timeval to={0,0}, tv1={0,0}, tv2; static fd_set selSet; -static int prevchar=EOF, clicks=0; +/* JD patch 11/08/1998 */ +#define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ +static int nbprevchar=0, clicks=0, prevchar[MAXNBPREVCHAR]; static char mdata[4]; int c; #define GET(win) ((win) ? wgetch(win) : getch()) @@ -76,11 +80,9 @@ gpm_hflag=0; /* not generated by handler (default) */ - if ((c=prevchar)!=EOF) /* if ungetc() didn't suffice... */ - { - prevchar=EOF; - return c; - } +/* JD patch 11/08/1998 */ + if (nbprevchar) /* if there are some consumed char ... */ + return prevchar[--nbprevchar]; while(1) { @@ -99,14 +101,15 @@ if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) return c; if ((c=GET(win))!='[') - {ungetc(c,stdin); return 0x1B;} + {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ /* '[': go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) - {ungetc(c,stdin); return 0x1B;} + {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ if ((c=GET(win))!='M') - {ungetc(c,stdin);prevchar='['; return 0x1B;} +/* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/ + {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;} /* now, it surely is a mouse event */ for (c=0;c<3;c++) mdata[c]=GET(win); @@ -155,7 +158,8 @@ static int count; static struct timeval to={0,DELAY_MS*1000}, tv1={0,0}, tv2; static fd_set selSet; -static int prevchar=EOF, clicks=0; +/* patche par JD 11/08/1998 */ +static int nbprevchar=0, clicks=0, prevchar[MAXNBPREVCHAR]; static char mdata[4]; int c; /* Hmm... I must be sure it is unbuffered */ @@ -168,11 +172,9 @@ if (gpm_morekeys && gpm_handler) return (*gpm_handler)(&ev,gpm_data); gpm_hflag=0; - if ((c=prevchar)!=EOF) /* if ungetc() didn't suffice... */ - { - prevchar=EOF; - return c; - } +/* patche par JD 11/08/1998 */ + if (nbprevchar) /* if there are some consumed char ... */ + return prevchar[--nbprevchar]; while(1) { @@ -191,14 +193,19 @@ if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) return c; if ((c=fgetc(f))!='[') - {ungetc(c,stdin); return 0x1B;} +/* patche par JD 11/08/1998 */ + {prevchar[nbprevchar++]=c; return 0x1B;} +/* {ungetc(c,stdin); return 0x1B;} */ /* '[': go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) - {ungetc(c,f); return 0x1B;} +/* patche par JD 11/08/1998 */ + {prevchar[nbprevchar++]=c; return 0x1B;} +/* {ungetc(c,f); return 0x1B;} */ if ((c=fgetc(f))!='M') - {ungetc(c,f);prevchar='['; return 0x1B;} +/* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/ + {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;} /* now, it surely is a mouse event */ for (c=0;c<3;c++) mdata[c]=fgetc(f); --- gpm-1.15.5/sample/gpm-xterm.h Fri Aug 28 00:25:06 1998 +++ sample/gpm-xterm.h Wed Sep 2 00:13:26 1998 @@ -25,6 +25,7 @@ #define _GPM_XTERM_H_ /*....................................... Xtermish stuff */ + #define GPM_XTERM_ON \ printf("%c[?1001s",27), fflush(stdout), /* save old hilit tracking */ \ printf("%c[?1000h",27), fflush(stdout) /* enable mouse tracking */