Hi, Some patches for sandy:
1: fix mouse scroll down, also: - add a comment in the README how to enable mouse scrolling. This is a limitation in ncurses. - read count can be 0 (not an error), this is reproducable if you scroll down with the mouse with ncurses and --disable-mouse-ext. 2: minor cleanup 3: fix cast, wgetch() returns int ... so the check was always false. 4: fix possible out-of-bounds if size of fgcolors > bgcolors + the color initialization was also wrong? 5: fix uninitialized variables Also available at: http://www.codemadness.nl/downloads/patches/sandy/ Kind regards, Hiltjo
From caeab9bd19a920f940dbcf0cfdc0350d86f4b7e6 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma <hil...@codemadness.org> Date: Thu, 24 Jul 2014 16:40:06 +0000 Subject: [PATCH 1/5] fix mouse scroll down - add a comment in the README how to enable mouse scrolling. This is a limitation in ncurses. - read count can be 0 (not an error), this is reproducable if you scroll down with the mouse with ncurses and --disable-mouse-ext. --- README | 4 ++++ config.def.h | 4 +++- sandy.c | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README b/README index 67967ba..1112f4c 100644 --- a/README +++ b/README @@ -40,3 +40,7 @@ Name In case you are wondering, sandy was the smartest pet ferret. She died of cancer though. We were sad and started coding this editor. + +Known issues +------------ +Mouse scroll down works if ncurses is compiled with --enable-ext-mouse. diff --git a/config.def.h b/config.def.h index 9469130..fa80e52 100644 --- a/config.def.h +++ b/config.def.h @@ -266,7 +266,9 @@ static const Click clks[] = { {BUTTON3_CLICKED, { TRUE , FALSE }, { t_sel, 0, 0 }, f_pipero, { .v = TOSEL } }, {BUTTON2_CLICKED, { FALSE, FALSE }, { t_rw, 0, 0 }, f_pipenull, { .v = FROMSEL } }, {BUTTON4_CLICKED, { FALSE, FALSE }, { 0, 0, 0 }, f_move, { .m = m_prevscr } }, -/*{BUTTON5_CLICKED, { FALSE, FALSE }, { 0, 0, 0 }, f_move, { .m = m_nextscr } },*/ +#ifdef BUTTON5_CLICKED +{BUTTON5_CLICKED, { FALSE, FALSE }, { 0, 0, 0 }, f_move, { .m = m_nextscr } }, +#endif /* ^^ NCurses is a sad old library.... it does not include button 5 nor * cursor movement in its mouse declaration by default */ {BUTTON1_DOUBLE_CLICKED, { TRUE , TRUE }, { 0, 0, 0 }, f_extsel, { .i = ExtWord } }, diff --git a/sandy.c b/sandy.c index ba4a39f..32acff5 100644 --- a/sandy.c +++ b/sandy.c @@ -1371,8 +1371,9 @@ i_pipetext(const char *cmd) { } if(FD_ISSET(perr[0], &fdI) && nerr > 0) { /* Blatant TODO: take last line of stderr and copy as tmptitle */ + ebuf[0] = '\0'; nerr = read(perr[0], ebuf, BUFSIZ); - if(nerr != 0) + if(nerr == -1) tmptitle = "WARNING! command reported an error!!!"; if(nerr < 0) break; -- 2.0.2
From 4271b0f6c744fc41f68ba92140ce3741866ee8aa Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma <hil...@codemadness.org> Date: Sun, 27 Jul 2014 13:45:10 +0000 Subject: [PATCH 2/5] minor cleanup --- sandy.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sandy.c b/sandy.c index 32acff5..98f4b5d 100644 --- a/sandy.c +++ b/sandy.c @@ -582,7 +582,8 @@ f_select(const Arg * arg) { /* Spawn (char **)arg->v */ void f_spawn(const Arg * arg) { - int pid = -1; + pid_t pid = -1; + reset_shell_mode(); if((pid = fork()) == 0) { /* setsid() used to be called here, but it does not look as a good idea @@ -1278,11 +1279,12 @@ i_multiply(void (*func)(const Arg * arg), const Arg arg) { void i_pipetext(const char *cmd) { struct timeval tv; - int pin[2], pout[2], perr[2], pid = -1, nr = 1, nerr = 1, nw, written; + int pin[2], pout[2], perr[2], nr = 1, nerr = 1, nw, written; int iw = 0, closed = 0, exstatus; char *buf = NULL, *ebuf = NULL, *s = NULL; Filepos auxp; fd_set fdI, fdO; + pid_t pid = -1; if(!cmd || cmd[0] == '\0') return; @@ -1347,7 +1349,7 @@ i_pipetext(const char *cmd) { FD_SET(perr[0], &fdI); tv.tv_sec = 5; tv.tv_usec = 0; - nw = s ? strlen(s) : 0; + nw = strlen(s); while(select(FD_SETSIZE, &fdI, &fdO, NULL, &tv) > 0 && (nw > 0 || nr > 0)) { fflush(NULL); @@ -1934,9 +1936,9 @@ i_update(void) { setenv(envs[EnvOffset], buf, 1); /* Update title */ - if(tmptitle) + if(tmptitle) { snprintf(title, sizeof(title), "%s", tmptitle); - else { + } else { statusflags &= ~S_Warned; /* Reset warning */ snprintf(buf, 4, "%ld%%", (100 * ncur) / nlst); snprintf(title, BUFSIZ, "%s%s [%s]%s%s%s%s %ld,%d %s", -- 2.0.2
From a8e31876767c751d1f21a07cf0e55239f1554bd7 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma <hil...@codemadness.org> Date: Sun, 27 Jul 2014 13:45:49 +0000 Subject: [PATCH 3/5] fix cast, wgetch() returns int ... so the check was always false. --- sandy.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sandy.c b/sandy.c index 98f4b5d..fbe7ad8 100644 --- a/sandy.c +++ b/sandy.c @@ -1014,7 +1014,7 @@ i_dokeys(const Key bindings[], unsigned int length_bindings) { /* Main editing loop */ void i_edit(void) { - int i; + int i, tch; fd_set fds; Filepos oldsel, oldcur; @@ -1073,9 +1073,12 @@ i_edit(void) { if(c[0] == 0x1B || (isutf8 && !ISASCII(c[0]))) { /* Multi-byte char or escape sequence */ wtimeout(textwin, 1); - for(i = 1; i < (c[0] == 0x1B ? 6 : UTF8LEN(c[0])); i++) - if((c[i] = wgetch(textwin)) == ERR) + for(i = 1; i < (c[0] == 0x1B ? 6 : UTF8LEN(c[0])); i++) { + tch = wgetch(textwin); + c[i] = (char)tch; + if(tch == ERR) break; + } for(; i < 7; i++) c[i] = '\0'; wtimeout(textwin, 0); -- 2.0.2
From cca2b5575b295e19043d93e92dbead15c5935d71 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma <hil...@codemadness.org> Date: Sun, 27 Jul 2014 13:47:58 +0000 Subject: [PATCH 4/5] fix possible out-of-bounds if size of fgcolors > bgcolors + the color initialization was also wrong? --- sandy.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sandy.c b/sandy.c index fbe7ad8..0efe201 100644 --- a/sandy.c +++ b/sandy.c @@ -1649,10 +1649,10 @@ i_setup(void) { if(fgcolors[i] > 7) init_color(fgcolors[i], fgcolors[i] >> 8, (fgcolors[i] >> 4) & 0xF, fgcolors[i] & 0xFF); - if(bgcolors[i] > 7) - init_color(bgcolors[i], bgcolors[i] >> 8, (bgcolors[i] >> 4) & 0xF, - bgcolors[i] & 0xFF); + if(bgcolors[j] > 7) + init_color(bgcolors[j], bgcolors[j] >> 8, (bgcolors[j] >> 4) & 0xF, + bgcolors[j] & 0xFF); init_pair((i * LastBG) + j, fgcolors[i], bgcolors[j]); textattrs[i][j] = COLOR_PAIR((i * LastBG) + j) | colorattrs[i]; } -- 2.0.2
From 8aac4b5d8b4f4ebee675d21efe0fdcbe6fe8a3cd Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma <hil...@codemadness.org> Date: Sun, 27 Jul 2014 13:49:25 +0000 Subject: [PATCH 5/5] fix uninitialized variables --- sandy.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sandy.c b/sandy.c index 0efe201..d08b683 100644 --- a/sandy.c +++ b/sandy.c @@ -1755,10 +1755,10 @@ i_termwininit(void) { void i_update(void) { int iline, irow, ixrow, ivchar, i, ifg, ibg, vlines; - size_t ichar; - int cursor_r, cursor_c; + int cursor_r = 0, cursor_c = 0; int lines3; /* How many lines fit on screen */ - long int nscr, ncur, nlst; /* Line number for scrline, fcur.l and lstline */ + long int nscr, ncur = 1, nlst = 1; /* Line number for scrline, fcur.l and lstline */ + size_t ichar; bool selection; regmatch_t match[SYN_COLORS][1]; Line *l; -- 2.0.2