From 1928bd6409bd99e2706177415b59215755b4829f Mon Sep 17 00:00:00 2001 From: NHOrus Date: Tue, 11 Feb 2025 18:42:47 +0400 Subject: [PATCH 1/3] Avoid shadowing ncurses functions. This fails with GCC-15 and other compilers implementing C23 Added prefix gpm_ to raw() and noraw() used in two files because they are implemented in same two files, and are static. Same with scr_dump() and src_restore() in yacc source file --- src/prog/gpm-root.y | 10 +++++----- src/prog/hltest.c | 11 +++++------ src/prog/mouse-test.c | 24 ++++++++++++------------ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/prog/gpm-root.y b/src/prog/gpm-root.y index 76c896c..800e51b 100644 --- a/src/prog/gpm-root.y +++ b/src/prog/gpm-root.y @@ -941,7 +941,7 @@ static unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4}; static unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1; /*------------*/ -static inline void scr_dump(int fd, FILE *f, unsigned char *buffer, int vc) +static inline void gpm_scr_dump(int fd, FILE *f, unsigned char *buffer, int vc) { int dumpfd; char dumpname[20]; @@ -960,7 +960,7 @@ static inline void scr_dump(int fd, FILE *f, unsigned char *buffer, int vc) } /*------------*/ -static inline void scr_restore(int fd, FILE *f, unsigned char *buffer, int vc) +static inline void gpm_scr_restore(int fd, FILE *f, unsigned char *buffer, int vc) { int dumpfd; char dumpname[20]; @@ -1002,7 +1002,7 @@ Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) if (!new) return NULL; new->draw=draw; new->dump=dump=malloc(opt_buf); - scr_dump(fd,f,dump,console); + gpm_scr_dump(fd,f,dump,console); lines=dump[0]; columns=dump[1]; i=(columns*dump[3]+dump[2])*2+1; /* where to get it */ if (i<0) i=1; @@ -1060,7 +1060,7 @@ Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) for (i=0; iwidth; i++) PUTC(HORLINE,draw->bord,draw->back); PUTC(LRCORNER,draw->bord,draw->back); - scr_restore(fd,f,dump,console); + gpm_scr_restore(fd,f,dump,console); free(dump); #undef PUTC @@ -1077,7 +1077,7 @@ Posted *unpostmenu(int fd, FILE *f, Posted *which, int vc) { Posted *prev=which->prev; - scr_restore(fd,f,which->dump, vc); + gpm_scr_restore(fd,f,which->dump, vc); ioctl(fd,TCXONC,TCOON); /* activate the console */ free(which->dump); free(which); diff --git a/src/prog/hltest.c b/src/prog/hltest.c index cce0abc..a916873 100644 --- a/src/prog/hltest.c +++ b/src/prog/hltest.c @@ -80,7 +80,6 @@ int wid,hei,vcsize; unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4}; unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1; - static inline int scrdump(char *buf) { clear_sel_arg[0]=2; /* clear_selection */ @@ -99,7 +98,7 @@ static inline int scrrestore(char *buf) /* I don't like curses, so I'm doing low level stuff here */ -static void raw(void) +static void gpm_raw(void) { struct termios it; @@ -115,7 +114,7 @@ tcsetattr(fileno(stdin),TCSANOW,&it); } -static void noraw(void) +static void gpm_noraw(void) { struct termios it; @@ -136,7 +135,7 @@ void killed(int signo) { CLEAR; fprintf(stderr,"hltest: killed by signal %i\r\n",signo); - noraw(); + gpm_noraw(); exit(0); } @@ -525,7 +524,7 @@ int main(int argc, char **argv) gpm_roi_handler=xhandler; gpm_roi_data=NULL; - raw(); + gpm_raw(); newmsg(0,NULL); /* init data structures */ while((c=Gpm_Getchar())!=EOF) { char s[32]; @@ -538,6 +537,6 @@ int main(int argc, char **argv) newmsg(roi ? ((WinInfo *)roi->clientdata)->number : 0,s); } - noraw(); + gpm_noraw(); exit(0); } diff --git a/src/prog/mouse-test.c b/src/prog/mouse-test.c index d7d1027..0db3560 100644 --- a/src/prog/mouse-test.c +++ b/src/prog/mouse-test.c @@ -106,7 +106,7 @@ return 0; /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ -static void raw(void) +static void gpm_raw(void) { struct termios it; @@ -125,7 +125,7 @@ static void raw(void) /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ -static void noraw(void) +static void gpm_noraw(void) { struct termios it; @@ -144,7 +144,7 @@ static void noraw(void) void killed(int signo) { fprintf(stderr,"mouse-test: killed by signal %i\r\n",signo); - noraw(); + gpm_noraw(); exit(0); } @@ -196,7 +196,7 @@ int mousereopen(int oldfd, const char *name, Gpm_Type *type) int noneofthem(void) { - noraw(); + gpm_noraw(); printf("\n\nSomething went wrong, I didn't manage to detect your" "protocol\n\nFeel free to report your problems to the author\n"); exit(1); @@ -336,7 +336,7 @@ int main(int argc, char **argv) I_serial=mice->init; /* the first one has I_serial */ signal(SIGINT,killed); /* control-C kills us */ - raw(); + gpm_raw(); /*====================================== First of all, detect the device */ @@ -568,7 +568,7 @@ int main(int argc, char **argv) /* why checking and not using return value ??? */ CHECKFAIL(typecount); if (typecount==1) { - noraw(); + gpm_noraw(); printf("\n\n\nWell, it seems like your mouse is already detected:\n" "it is on the device \"%s\", and speaks the protocol \"%s\"\n", mousename,list->this->name); @@ -587,7 +587,7 @@ int main(int argc, char **argv) } while(i!='y' && i!='n'); if (i=='n') { - noraw(); + gpm_noraw(); printf("\nThen, you should use the \"bare\" protocol on \"%s\"\n", mousename); exit(0); @@ -634,7 +634,7 @@ int main(int argc, char **argv) for (pending=0,i=0;i 3) { - noraw(); + gpm_noraw(); printf("\nYour mouse seems to be a 'mman' one on \"%s\" (%i matches)\n", mousename,pending); exit(0); @@ -660,7 +660,7 @@ int main(int argc, char **argv) continue; } if (pending>3) { - noraw(); + gpm_noraw(); printf("\nYour mouse seems to be a '%s' one on \"%s\" (%i matches)\n", cur->this->name,mousename,pending); exit(0); @@ -695,7 +695,7 @@ int main(int argc, char **argv) for (pending=0,i=0;i3) { - noraw(); + gpm_noraw(); printf("\nYour mouse becomes a 3-buttons ('-t msc') one when\n" "gpm gets '-o %s' on it command line, and X gets\n" "%s in XF86Config\nThe device is \"%s\"", @@ -726,7 +726,7 @@ int main(int argc, char **argv) for (pending=0,i=0;i3) { - noraw(); + gpm_noraw(); printf("\nWorked. You should keep the button pressed every time the\n" "computer boots, and run gpm in '-R' mode in order to ignore\n" "such hassle when starting X\n\nStill better, but a better mouse\n" @@ -734,7 +734,7 @@ int main(int argc, char **argv) exit(0); } - noraw(); + gpm_noraw(); printf("\nI'm lost. Can't tell you how to use your middle button\n"); return 0; } From 361de4413b487d1dcd9a1a94b1bb9d5d9b7a2629 Mon Sep 17 00:00:00 2001 From: NHOrus Date: Tue, 11 Feb 2025 19:01:48 +0400 Subject: [PATCH 2/3] Fix function definition in yacc source file until valid C23. Fill empty argument lists with values. Add 0 as third argument for two-argument function, it will be ignored at call site. --- src/prog/gpm-root.y | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/prog/gpm-root.y b/src/prog/gpm-root.y index 800e51b..f06872c 100644 --- a/src/prog/gpm-root.y +++ b/src/prog/gpm-root.y @@ -128,7 +128,7 @@ typedef struct DrawItem { char *name; char *arg; /* a cmd string */ void *clientdata; /* a (Draw *) for menus or whatever */ - int (*fun)(); + int (*fun)(int, struct DrawItem *, int); struct DrawItem *next; } DrawItem; @@ -159,7 +159,7 @@ int yyerror(char *s); int yylex(void); DrawItem *cfg_cat(DrawItem *, DrawItem *); -DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail); +DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(int, DrawItem *, int), void *detail); /*===================================================================* @@ -195,7 +195,7 @@ int f_pipe(int mode, DrawItem *self, int uid); char *string; Draw *draw; DrawItem *item; - int (*fun)(); + int (*fun)(int, DrawItem *, int); } %token T_STRING @@ -284,7 +284,7 @@ struct tokenName tokenList[] = { struct funcName { char *name; int token; - int (*fun)(); + int (*fun)(int, DrawItem *, int); }; struct funcName funcList[] = { {"f.debug",T_FUNC,f_debug}, @@ -390,7 +390,7 @@ Draw *cfg_alloc(void) /*---------------------------------------------------------------------*/ /* malloc an empty DrawItem and fill it */ -DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail) +DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(int, DrawItem *, int), void *detail) { DrawItem *new=calloc(1,sizeof(DrawItem)); @@ -405,7 +405,7 @@ DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail) case 'F': /* a function without args */ new->fun=fun; - if (fun) fun(F_CREATE,new); + if (fun) fun(F_CREATE,new,0); break; case 'M': @@ -1047,7 +1047,7 @@ Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) } /* sides and items */ for (item=draw->menu; y++, item; item=item->next) { - if (item->fun) (*(item->fun))(F_POST,item); + if (item->fun) (*(item->fun))(F_POST,item,0); GOTO(x,y); PUTC(VERLINE,draw->bord,draw->back); for (i=0;ipad;i++) PUTC(' ',draw->fore,draw->back); PUTS(item->name,draw->fore,draw->back); i+=strlen(item->name); From 386e31b1eb01eb234b732e6c76c4e52969f04a72 Mon Sep 17 00:00:00 2001 From: NHOrus Date: Sat, 22 Feb 2025 01:12:32 +0400 Subject: [PATCH 3/3] Add incomplete type definition for WINDOW in Gpm_Wgetch() Window handle is an opaque pointer that Gpm_Wgetch() passes through straight to ncurses if it's not null and calls getch if it's null. Code doesn't care what's inside the handle as long as it agrees with curses definition. --- src/headers/gpm.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/headers/gpm.h b/src/headers/gpm.h index fe52e53..b944d4b 100644 --- a/src/headers/gpm.h +++ b/src/headers/gpm.h @@ -268,7 +268,14 @@ Gpm_Roi * Gpm_LowerRoi(Gpm_Roi *which, Gpm_Roi *after); /* libcurses.c */ /* #include Hmm... seems risky */ -extern int Gpm_Wgetch(); +/* Window handle is an opaque pointer that Gpm_Wgetch() + * passes through to ncurses if it's not null and calls getch + * if it's null. Code doesn't care what's inside the handle + * as long as it agrees with curses definition. +*/ +typedef struct _win_st WINDOW; + +extern int Gpm_Wgetch(WINDOW *); #define Gpm_Getch() (Gpm_Wgetch(NULL)) /* libxtra.c */