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.

drh 2025-03-18 13:42 trunk
Commit 3f30abc80ae4b19616793b1397f1e1d78627a0a75b2aa01187558b029c0ca0de
1 file changed +12 -3
+12 -3
--- src/terminal.c
+++ src/terminal.c
@@ -60,31 +60,40 @@
6060
memset(t, 0, sizeof(*t));
6161
6262
#if defined(TIOCGSIZE)
6363
{
6464
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
+ ){
6669
t->nColumns = ts.ts_cols;
6770
t->nLines = ts.ts_lines;
6871
return 1;
6972
}
7073
return 0;
7174
}
7275
#elif defined(TIOCGWINSZ)
7376
{
7477
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
+ ){
7682
t->nColumns = ws.ws_col;
7783
t->nLines = ws.ws_row;
7884
return 1;
7985
}
8086
return 0;
8187
}
8288
#elif defined(_WIN32)
8389
{
8490
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
+ ){
8695
t->nColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
8796
t->nLines = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
8897
return 1;
8998
}
9099
return 0;
91100
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button