aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2013-11-07 09:04:50 -0600
committerRob Landley <rob@landley.net>2013-11-07 09:04:50 -0600
commit10bdaa42275810fa2828a7e6235a219779e1d85b (patch)
treecd2c6baff0c25e2f23fb6ddeb8f9690033104294
parent938b830abadd2a9dd4260bea3636e188f925959e (diff)
downloadtoybox-10bdaa42275810fa2828a7e6235a219779e1d85b.tar.gz
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
(If you set $COLUMNS but not $ROWS, we assume you're happy with the 80x25 default for the other.)
-rw-r--r--lib/lib.c16
-rw-r--r--lib/lib.h2
2 files changed, 11 insertions, 7 deletions
diff --git a/lib/lib.c b/lib/lib.c
index fe18b3e1..de8c7be0 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -482,15 +482,16 @@ void crc_init(unsigned int *crc_table, int little_endian)
}
// Quick and dirty query size of terminal, doesn't do ANSI probe fallback.
-// set *x=0 and *y=0 before calling to detect failure to set either, or
-// x=80 y=25 to provide defaults
+// set x=80 y=25 before calling to provide defaults. Returns 0 if couldn't
+// determine size.
-void terminal_size(unsigned *xx, unsigned *yy)
+int terminal_size(unsigned *xx, unsigned *yy)
{
struct winsize ws;
- unsigned i, x = xx ? *xx : 0, y = yy ? *yy : 0;
+ unsigned i, x = 0, y = 0;
char *s;
+ // stdin, stdout, stderr
for (i=0; i<3; i++) {
memset(&ws, 0, sizeof(ws));
if (!ioctl(i, TIOCGWINSZ, &ws)) {
@@ -505,8 +506,11 @@ void terminal_size(unsigned *xx, unsigned *yy)
s = getenv("ROWS");
if (s) sscanf(s, "%u", &y);
- if (xx) *xx = x;
- if (yy) *yy = y;
+ // Never return 0 for either value, leave it at default instead.
+ if (xx && x) *xx = x;
+ if (yy && y) *yy = y;
+
+ return x || y;
}
int yesno(char *prompt, int def)
diff --git a/lib/lib.h b/lib/lib.h
index ef688a32..94884156 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -156,7 +156,7 @@ int copy_tempfile(int fdin, char *name, char **tempname);
void delete_tempfile(int fdin, int fdout, char **tempname);
void replace_tempfile(int fdin, int fdout, char **tempname);
void crc_init(unsigned int *crc_table, int little_endian);
-void terminal_size(unsigned *x, unsigned *y);
+int terminal_size(unsigned *x, unsigned *y);
int yesno(char *prompt, int def);
void names_to_pid(char **names, int (*callback)(pid_t pid, char *name));