From 2c4f022eddb11b0fd4e164a6fdae169b008f2371 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Thu, 4 Jul 2019 01:50:02 -0400 Subject: [PATCH] Add bt_common_get_term_size() Using ioctl() instead of the `COLUMNS` environment variable because `COLUMNS` is in fact a shell variable which is not exported. The function is not supported on Windows yet. Signed-off-by: Philippe Proulx Change-Id: I84942830f0392ff1aca3e1aff54fffc534ddda05 Reviewed-on: https://review.lttng.org/c/babeltrace/+/1621 Tested-by: jenkins Reviewed-by: Francis Deslauriers --- src/common/common.c | 33 +++++++++++++++++++++++++++++++++ src/common/common.h | 7 +++++++ 2 files changed, 40 insertions(+) diff --git a/src/common/common.c b/src/common/common.c index aef36b28..ed1d1c27 100644 --- a/src/common/common.c +++ b/src/common/common.c @@ -46,6 +46,7 @@ #ifndef __MINGW32__ #include +#include #endif #define SYSTEM_PLUGIN_PATH INSTALL_LIBDIR "/babeltrace2/plugins" @@ -1791,3 +1792,35 @@ end: return folded; } + +#ifdef __MINGW32__ +BT_HIDDEN +int bt_common_get_term_size(unsigned int *width, unsigned int *height) +{ + /* Not supported on Windows yet */ + return -1; +} +#else /* __MINGW32__ */ +BT_HIDDEN +int bt_common_get_term_size(unsigned int *width, unsigned int *height) +{ + int ret = 0; + struct winsize winsize; + + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) < 0) { + ret = -1; + goto end; + } + + if (width) { + *width = (unsigned int) winsize.ws_col; + } + + if (height) { + *height = (unsigned int) winsize.ws_row; + } + +end: + return ret; +} +#endif /* __MINGW32__ */ diff --git a/src/common/common.h b/src/common/common.h index 0f2736f0..1b952913 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -348,6 +348,13 @@ BT_HIDDEN GString *bt_common_fold(const char *str, unsigned int total_length, unsigned int indent); +/* + * Writes the terminal's width to `*width`, its height to `*height`, + * and returns 0 on success, or returns -1 on error. + */ +BT_HIDDEN +int bt_common_get_term_size(unsigned int *width, unsigned int *height); + /* * Wraps read() function to handle EINTR and partial reads. * On success, it returns `count` received as parameter. On error, it returns a -- 2.34.1