Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 31b485f

Browse files
committed
Fix \watch's interaction with libedit on ^C.
When you hit ^C, the terminal driver in Unix-like systems echoes "^C" as well as sending an interrupt signal (depending on stty settings). At least libedit (but maybe also libreadline) is then confused about the current cursor location, and corrupts the display if you try to scroll back. Fix, by moving to a new line before the next prompt is displayed. Back-patch to all supported released. Author: Pavel Stehule <pavel.stehule@gmail.com> Reported-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/3278793.1626198638%40sss.pgh.pa.us
1 parent 6763b25 commit 31b485f

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

src/bin/psql/command.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5169,6 +5169,18 @@ do_watch(PQExpBuffer query_buf, double sleep)
51695169
pclose(pagerpipe);
51705170
restore_sigpipe_trap();
51715171
}
5172+
else
5173+
{
5174+
/*
5175+
* If the terminal driver echoed "^C", libedit/libreadline might be
5176+
* confused about the cursor position. Therefore, inject a newline
5177+
* before the next prompt is displayed. We only do this when not
5178+
* using a pager, because pagers are expected to restore the screen to
5179+
* a sane state on exit.
5180+
*/
5181+
fprintf(stdout, "\n");
5182+
fflush(stdout);
5183+
}
51725184

51735185
#ifdef HAVE_POSIX_DECL_SIGWAIT
51745186
/* Disable the interval timer. */

0 commit comments

Comments
 (0)