Fossil SCM
Enhance the internal terminal_get_size() interface so that it finds the terminal size if *any* of stdin, stdout, or stderr are connected to a terminal.
Commit
3f30abc80ae4b19616793b1397f1e1d78627a0a75b2aa01187558b029c0ca0de
Parent
52a2be128ca2fef…
1 file changed
+12
-3
+12
-3
| --- src/terminal.c | ||
| +++ src/terminal.c | ||
| @@ -60,31 +60,40 @@ | ||
| 60 | 60 | memset(t, 0, sizeof(*t)); |
| 61 | 61 | |
| 62 | 62 | #if defined(TIOCGSIZE) |
| 63 | 63 | { |
| 64 | 64 | struct ttysize ts; |
| 65 | - if( ioctl(STDIN_FILENO, TIOCGSIZE, &ts)!=-1 ){ | |
| 65 | + if( ioctl(STDIN_FILENO, TIOCGSIZE, &ts)>=0 | |
| 66 | + || ioctl(STDOUT_FILENO, TIOCGSIZE, &ts)>=0 | |
| 67 | + || ioctl(STDERR_FILENO, TIOCGSIZE, &ts)>=0 | |
| 68 | + ){ | |
| 66 | 69 | t->nColumns = ts.ts_cols; |
| 67 | 70 | t->nLines = ts.ts_lines; |
| 68 | 71 | return 1; |
| 69 | 72 | } |
| 70 | 73 | return 0; |
| 71 | 74 | } |
| 72 | 75 | #elif defined(TIOCGWINSZ) |
| 73 | 76 | { |
| 74 | 77 | struct winsize ws; |
| 75 | - if( ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)!=-1 ){ | |
| 78 | + if( ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)>=0 | |
| 79 | + || ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)>=0 | |
| 80 | + || ioctl(STDERR_FILENO, TIOCGWINSZ, &ws)>=0 | |
| 81 | + ){ | |
| 76 | 82 | t->nColumns = ws.ws_col; |
| 77 | 83 | t->nLines = ws.ws_row; |
| 78 | 84 | return 1; |
| 79 | 85 | } |
| 80 | 86 | return 0; |
| 81 | 87 | } |
| 82 | 88 | #elif defined(_WIN32) |
| 83 | 89 | { |
| 84 | 90 | CONSOLE_SCREEN_BUFFER_INFO csbi; |
| 85 | - if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) ){ | |
| 91 | + if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) | |
| 92 | + || GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbi) | |
| 93 | + || GetConsoleScreenBufferInfo(GetStdHandle(STD_INPUT_HANDLE), &csbi) | |
| 94 | + ){ | |
| 86 | 95 | t->nColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; |
| 87 | 96 | t->nLines = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; |
| 88 | 97 | return 1; |
| 89 | 98 | } |
| 90 | 99 | return 0; |
| 91 | 100 |
| --- src/terminal.c | |
| +++ src/terminal.c | |
| @@ -60,31 +60,40 @@ | |
| 60 | memset(t, 0, sizeof(*t)); |
| 61 | |
| 62 | #if defined(TIOCGSIZE) |
| 63 | { |
| 64 | struct ttysize ts; |
| 65 | if( ioctl(STDIN_FILENO, TIOCGSIZE, &ts)!=-1 ){ |
| 66 | t->nColumns = ts.ts_cols; |
| 67 | t->nLines = ts.ts_lines; |
| 68 | return 1; |
| 69 | } |
| 70 | return 0; |
| 71 | } |
| 72 | #elif defined(TIOCGWINSZ) |
| 73 | { |
| 74 | struct winsize ws; |
| 75 | if( ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)!=-1 ){ |
| 76 | t->nColumns = ws.ws_col; |
| 77 | t->nLines = ws.ws_row; |
| 78 | return 1; |
| 79 | } |
| 80 | return 0; |
| 81 | } |
| 82 | #elif defined(_WIN32) |
| 83 | { |
| 84 | CONSOLE_SCREEN_BUFFER_INFO csbi; |
| 85 | if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) ){ |
| 86 | t->nColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; |
| 87 | t->nLines = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; |
| 88 | return 1; |
| 89 | } |
| 90 | return 0; |
| 91 |
| --- src/terminal.c | |
| +++ src/terminal.c | |
| @@ -60,31 +60,40 @@ | |
| 60 | memset(t, 0, sizeof(*t)); |
| 61 | |
| 62 | #if defined(TIOCGSIZE) |
| 63 | { |
| 64 | struct ttysize ts; |
| 65 | if( ioctl(STDIN_FILENO, TIOCGSIZE, &ts)>=0 |
| 66 | || ioctl(STDOUT_FILENO, TIOCGSIZE, &ts)>=0 |
| 67 | || ioctl(STDERR_FILENO, TIOCGSIZE, &ts)>=0 |
| 68 | ){ |
| 69 | t->nColumns = ts.ts_cols; |
| 70 | t->nLines = ts.ts_lines; |
| 71 | return 1; |
| 72 | } |
| 73 | return 0; |
| 74 | } |
| 75 | #elif defined(TIOCGWINSZ) |
| 76 | { |
| 77 | struct winsize ws; |
| 78 | if( ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)>=0 |
| 79 | || ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)>=0 |
| 80 | || ioctl(STDERR_FILENO, TIOCGWINSZ, &ws)>=0 |
| 81 | ){ |
| 82 | t->nColumns = ws.ws_col; |
| 83 | t->nLines = ws.ws_row; |
| 84 | return 1; |
| 85 | } |
| 86 | return 0; |
| 87 | } |
| 88 | #elif defined(_WIN32) |
| 89 | { |
| 90 | CONSOLE_SCREEN_BUFFER_INFO csbi; |
| 91 | if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) |
| 92 | || GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbi) |
| 93 | || GetConsoleScreenBufferInfo(GetStdHandle(STD_INPUT_HANDLE), &csbi) |
| 94 | ){ |
| 95 | t->nColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; |
| 96 | t->nLines = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; |
| 97 | return 1; |
| 98 | } |
| 99 | return 0; |
| 100 |