On Mon, 13 Jan 2014, Gregor Best wrote:
> On Mon, Jan 13, 2014 at 05:04:28PM +0000, Stuart Henderson wrote:
> > If anyone is interested in looking at a signal problem in top,
> > here's a small but annoying bug..
> > 
> > - run top in an xterm
> > - resize the window
> > - try to use an interactive command that takes an argument, e.g. "s"
> > or "g" (doesn't happen with commands like "S" or "H" that work immediately)
> > 
> > Often, pressing the command key just refreshes the screen, it takes
> > multiple attempts for the command to take effect (sometimes just a
> > couple, sometimes loads of attempts).
> > [...]
> 
> The patch below seems to fix that for me. resizeterm() does a 
> putchar(KEY_RESIZE), part of which then gets interpreted as a command 
> parameter in rundisplay().

I think you meant "ungetch(KEY_RESIZE)", but that pointed me at the 
getnstr() manpage, which notes that it returns KEY_RESIZE if there was a 
pending resize event.  Changing readline() to loop on getnstr() while it 
returns that, resetting the cursor position each time, seems to fix the 
problem in my testing.


Philip Guenther


Index: display.c
===================================================================
RCS file: /cvs/src/usr.bin/top/display.c,v
retrieving revision 1.46
diff -u -p -r1.46 display.c
--- display.c   28 Nov 2013 18:24:55 -0000      1.46
+++ display.c   13 Jan 2014 20:37:38 -0000
@@ -641,9 +641,12 @@ readline(char *buffer, int size)
        /* allow room for null terminator */
        size -= 1;
 
-       if (smart_terminal)
-               getnstr(buffer, size);
-       else
+       if (smart_terminal) {
+               int y, x;
+               getyx(stdscr, y, x);
+               while (getnstr(buffer, size) == KEY_RESIZE)
+                       move(y, x);
+       } else
                return readlinedumb(buffer, size);
 
        cnt = strlen(buffer);

Reply via email to