=================================================================== ChangeSet@xxx, 2004-08-10 00:52:42-05:00, dtor_core@xxxxxxxxxxxxx Split repeater-handling code into separate data structures and functions. gpm.c | 59 +++++++++++++++++++++++++++++-------------------------- gpn.c | 27 ++++++++++++++++++------- headers/gpmInt.h | 12 ++++++----- startup.c | 25 +++-------------------- 4 files changed, 63 insertions(+), 60 deletions(-) =================================================================== diff -Nru a/src/gpm.c b/src/gpm.c --- a/src/gpm.c 2004-08-10 01:17:58 -05:00 +++ b/src/gpm.c 2004-08-10 01:17:58 -05:00 @@ -77,11 +77,10 @@ int opt_test=DEF_TEST; int opt_double=0; char *opt_special=NULL; /* special commands, like reboot or such */ -int opt_rawrep=0; -Gpm_Type *repeated_type=0; static int opt_resize=0; /* not really an option */ -int fifofd=-1; + +struct repeater repeater; int eventFlag=0; Gpm_Cinfo *cinfo[MAX_VC+1]; @@ -183,8 +182,8 @@ return NULL; } - if (!text_mode && fifofd != -1 && opt_rawrep) - write(fifofd, data, howmany); + if (!text_mode && repeater.fd != -1 && repeater.raw) + write(repeater.fd, data, howmany); if ((data[0]&(m_type->proto)[0]) != (m_type->proto)[1]) { if (m_type->getextra == 1) { @@ -206,8 +205,8 @@ if((i=m_type->packetlen-howmany)) /* still to get */ do { j = read(fd,edata-i,i); /* edata is pointer just after data */ - if (!text_mode && fifofd != -1 && opt_rawrep && j > 0) - write(fifofd, edata-i, j); + if (!text_mode && repeater.fd != -1 && repeater.raw && j > 0) + write(repeater.fd, edata - i, j); i -= j; } while (i && j); @@ -256,6 +255,28 @@ } } +static void handle_repeater(Gpm_Event *new_event, Gpm_Event *event) +{ + static struct timeval last; + struct timeval now; + + if (m_type->absolute) { + /* prepare the values from a absolute device for repeater mode */ + gettimeofday(&now, (struct timezone *)NULL); + if (((now.tv_sec - last.tv_sec) * 1000 + + (now.tv_usec - last.tv_usec) / 1000) > 250) { + event->dx = 0; + event->dy = 0; + } + last = now; + + event->dy = event->dy * ((console.max_x / console.max_y) + 1); + event->x = new_event->x; + event->y = new_event->y; + } + repeater.type->repeat_fun(event, repeater.fd); +} + /*------------------------------------------------------------------- * call getMouseData to get hardware device data, call mouse device's fun() * to retrieve the hardware independent event data, then optionally repeat @@ -349,26 +370,10 @@ /*....................................... we're a repeater, aren't we? */ if (!text_mode) { - if (fifofd != -1 && ! opt_rawrep) { - if (m_type->absolute) { /* hof Wed Feb 3 21:43:28 MET 1999 */ - /* prepare the values from a absolute device for repeater mode */ - static struct timeval rept1,rept2; - gettimeofday(&rept2, (struct timezone *)NULL); - if (((rept2.tv_sec -rept1.tv_sec) - *1000+(rept2.tv_usec-rept1.tv_usec)/1000)>250) { - event->dx=0; - event->dy=0; - } - rept1=rept2; - - event->dy = event->dy * ((console.max_x / console.max_y) + 1); - event->x=nEvent.x; - event->y=nEvent.y; - } - repeated_type->repeat_fun(event, fifofd); /* itz Jan 11 1999 */ - } + if (repeater.fd != -1 && !repeater.raw) + handle_repeater(&nEvent, event); return 0; /* no events nor information for clients */ - } /* first if of these three */ + } /*....................................... no, we arent a repeater, go on */ @@ -839,7 +844,7 @@ * but actually it only matters if you have events. */ text_mode = is_text_console(); - if (!text_mode && !option.repeater) { + if (!text_mode && !repeater.type && !repeater.raw) { close(mouse_table[i].fd); wait_text_console(); /* reopen, reinit (the function is only used if we have one mouse device) */ diff -Nru a/src/gpn.c b/src/gpn.c --- a/src/gpn.c 2004-08-10 01:17:58 -05:00 +++ b/src/gpn.c 2004-08-10 01:17:58 -05:00 @@ -128,6 +128,21 @@ return type; } +static void validate_repeater(char *type) +{ + if (strcmp(type, "raw") == 0) + repeater.raw = 1; + else { + repeater.raw = 0; + + if (!(repeater.type = find_mouse_by_name(type))) + exit(M_listTypes()); /* not found */ + + if (!repeater.type->repeat_fun) /* unsupported translation */ + gpm_report(GPM_PR_OOPS, GPM_MESS_NO_REPEAT, type); + } +} + /***************************************************************************** * Check the command line and / or set the appropriate variables * Can't believe it, today cmdline() really does what the name tries to say @@ -159,9 +174,9 @@ case 'l': console.charset = optarg; break; case 'm': add_mouse(GPM_ADD_DEVICE,optarg); opt_dev = optarg; break; /* GO AWAY!*/ - case 'M': opt_double++; option.repeater++; - if (option.repeater_type == 0) - option.repeater_type = "msc"; + case 'M': opt_double++; + if (!repeater.type && !repeater.raw) + repeater.type = find_mouse_by_name(DEF_REP_TYPE); which_mouse=mouse_table+2; break; case 'o': add_mouse(GPM_ADD_OPTIONS,optarg); gpm_report(GPM_PR_DEBUG,"options: %s",optarg); @@ -172,10 +187,8 @@ opt_scale=atoi(optarg); if(!opt_scale || opt_scale > 100) opt_scale=100; /* the maximum */ else opt_scale=100/opt_scale; break; - case 'R': - option.repeater++; - if (optarg) option.repeater_type = optarg; - else option.repeater_type = "msc"; break; + case 'R': validate_repeater((optarg) ? optarg : DEF_REP_TYPE); + break; case 's': opt_sample = atoi(optarg); break; case 'S': if (optarg) opt_special = optarg; else opt_special=""; break; diff -Nru a/src/headers/gpmInt.h b/src/headers/gpmInt.h --- a/src/headers/gpmInt.h 2004-08-10 01:17:58 -05:00 +++ b/src/headers/gpmInt.h 2004-08-10 01:17:58 -05:00 @@ -52,6 +52,7 @@ /* all the default values */ #define DEF_TYPE "ms" +#define DEF_REP_TYPE "msc" #define DEF_DEV NULL /* use the type-related one */ #define DEF_LUT "-a-zA-Z0-9_./\300-\326\330-\366\370-\377" #define DEF_SEQUENCE "123" /* how buttons are reordered */ @@ -188,17 +189,19 @@ extern int opt_kill; extern int opt_kernel, opt_explicittype; extern char *opt_special; -extern int opt_rawrep; -extern int fifofd; extern int opt_double; -extern Gpm_Type *repeated_type; extern Gpm_Type mice[]; /* where the hell are the descriptions...*/ extern Gpm_Cinfo *cinfo[MAX_VC+1]; /* new variables <CLEAN> */ /* structure prototypes */ +struct repeater { + int fd; + int raw; + Gpm_Type *type; +}; /* contains all mice */ struct micetab { @@ -211,8 +214,6 @@ struct options { int autodetect; /* -u [aUtodetect..'A' is not available] */ int no_mice; /* number of mice */ - int repeater; /* repeat data */ - char *repeater_type; /* repeat data as which mouse type */ int run_status; /* startup/daemon/debug */ char *progname; /* hopefully gpm ;) */ struct micetab *micelist; /* mice and their options */ @@ -220,6 +221,7 @@ /* global variables */ struct options option; /* one should be enough for us */ +extern struct repeater repeater; /* again, only one */ /* new variables </CLEAN> */ diff -Nru a/src/startup.c b/src/startup.c --- a/src/startup.c 2004-08-10 01:17:58 -05:00 +++ b/src/startup.c 2004-08-10 01:17:58 -05:00 @@ -72,8 +72,6 @@ /* basic2: are not necessary for oops()ing, if not root */ option.no_mice = 0; /* counts -m + -t */ option.micelist = NULL; /* no mice found yet */ - option.repeater = 0; /* repeat data */ - option.repeater_type = NULL; /* type of */ console.device = Gpm_get_console(); /* get consolename */ @@ -92,10 +90,10 @@ console_load_lut(); - if (option.repeater) { - if(mkfifo(GPM_NODE_FIFO,0666) && errno!=EEXIST) - gpm_report(GPM_PR_OOPS,GPM_MESS_CREATE_FIFO,GPM_NODE_FIFO); - if((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK)) < 0) + if (repeater.raw || repeater.type) { + if (mkfifo(GPM_NODE_FIFO, 0666) && errno != EEXIST) + gpm_report(GPM_PR_OOPS, GPM_MESS_CREATE_FIFO, GPM_NODE_FIFO); + if ((repeater.fd = open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK)) < 0) gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN, GPM_NODE_FIFO); } @@ -119,21 +117,6 @@ m_type = find_mouse_by_name(opt_type); if (!m_type) /* not found */ exit(M_listTypes()); - } - - /* Check repeater status */ - if (option.repeater) { - if (strcmp(option.repeater_type,"raw") == 0) - opt_rawrep = 1; - else { - /* look for the type */ - repeated_type = find_mouse_by_name(option.repeater_type); - - if(!repeated_type) exit(M_listTypes()); /* not found */ - - if (!(repeated_type->repeat_fun)) /* unsupported translation */ - gpm_report(GPM_PR_OOPS,GPM_MESS_NO_REPEAT,option.repeater_type); - } } if(option.run_status == GPM_RUN_STARTUP ) { /* else is debugging */ _______________________________________________ gpm mailing list gpm@xxxxxxxxxxxxxx http://lists.linux.it/listinfo/gpm