From 5a40c7970d8185fcf322575de9fed69d4cdedd93 Mon Sep 17 00:00:00 2001 From: Craig Small Date: Sat, 2 Jul 2016 16:07:56 +1000 Subject: [PATCH] watch: truncate command in non-8 bit mode When the screen width is not long enough to display the entire command, watch puts three dots ... like elipses at the end of the truncated line. It's been like that for years, perhaps noone uses non 8-bit watch? References: commit 367b8bb616c6d52513b594ccb936d322a3f8b6c1 Signed-off-by: Craig Small --- watch.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/watch.c b/watch.c index 39ec16a2..c87eeb52 100644 --- a/watch.c +++ b/watch.c @@ -364,7 +364,7 @@ wint_t my_getwc(FILE * s) #endif /* WITH_WATCH8BIT */ #ifdef WITH_WATCH8BIT -static void output_header(wchar_t *restrict wcommand, int wcommand_columns, int wcommand_characters, double interval) +static void output_header(wchar_t *restrict wcommand, int wcommand_characters, double interval) #else static void output_header(char *restrict command, double interval) #endif /* WITH_WATCH8BIT */ @@ -374,6 +374,7 @@ static void output_header(char *restrict command, double interval) char *header; char *right_header; char hostname[HOST_NAME_MAX + 1]; + int command_columns = 0; /* not including final \0 */ gethostname(hostname, sizeof(hostname)); @@ -407,10 +408,11 @@ static void output_header(char *restrict command, double interval) mvaddstr(0, width - rhlen - 4, "... "); } else { #ifdef WITH_WATCH8BIT - if (width < rhlen + hlen + wcommand_columns) { + command_columns = wcswidth(wcommand, -1); + if (width < rhlen + hlen + command_columns) { /* print truncated */ int available = width - rhlen - hlen; - int in_use = wcommand_columns; + int in_use = command_columns; int wcomm_len = wcommand_characters; while (available - 4 < in_use) { wcomm_len--; @@ -422,7 +424,14 @@ static void output_header(char *restrict command, double interval) mvaddwstr(0, hlen, wcommand); } #else - mvaddnstr(0, hlen, command, width - rhlen - hlen); + command_columns = strlen(command); + if (width < rhlen + hlen + command_columns) { + /* print truncated */ + mvaddnstr(0, hlen, command, width - rhlen - hlen - 4); + mvaddstr(0, width - rhlen - 4, "... "); + } else { + mvaddnstr(0, hlen, command, width - rhlen - hlen); + } #endif /* WITH_WATCH8BIT */ } } @@ -661,7 +670,6 @@ int main(int argc, char *argv[]) * keeping only */ #ifdef WITH_WATCH8BIT wchar_t *wcommand = NULL; - int wcommand_columns = 0; /* not including final \0 */ int wcommand_characters = 0; /* not including final \0 */ #endif /* WITH_WATCH8BIT */ @@ -773,7 +781,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } mbstowcs(wcommand, command, wcommand_characters + 1); - wcommand_columns = wcswidth(wcommand, -1); #endif /* WITH_WATCH8BIT */ get_terminal_size();