diff options
Diffstat (limited to 'src/btop_tools.cpp')
-rw-r--r-- | src/btop_tools.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/btop_tools.cpp b/src/btop_tools.cpp index e17edf8..e6ecbd8 100644 --- a/src/btop_tools.cpp +++ b/src/btop_tools.cpp @@ -26,9 +26,10 @@ tab-size = 4 #include <utility> #include <ranges> -#include <unistd.h> -#include <termios.h> +#include <fcntl.h> #include <sys/ioctl.h> +#include <termios.h> +#include <unistd.h> #include "unordered_map" #include "widechar_width.hpp" @@ -85,12 +86,27 @@ namespace Term { } bool refresh(bool only_check) { - struct winsize w; - if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) < 0) return false; - if (width != w.ws_col or height != w.ws_row) { + // Query dimensions of '/dev/tty' of the 'STDOUT_FILENO' isn't avaiable. + // This variable is set in those cases to avoid calls to ioctl + constinit static bool uses_dev_tty = false; + struct winsize wsize {}; + if (uses_dev_tty || ioctl(STDOUT_FILENO, TIOCGWINSZ, &wsize) < 0 || (wsize.ws_col == 0 && wsize.ws_row == 0)) { + Logger::error(R"(Couldn't determine terminal size of "STDOUT_FILENO"!)"); + auto dev_tty = open("/dev/tty", O_RDONLY); + if (dev_tty != -1) { + ioctl(dev_tty, TIOCGWINSZ, &wsize); + close(dev_tty); + } + else { + Logger::error(R"(Couldn't determine terminal size of "/dev/tty"!)"); + return false; + } + uses_dev_tty = true; + } + if (width != wsize.ws_col or height != wsize.ws_row) { if (not only_check) { - width = w.ws_col; - height = w.ws_row; + width = wsize.ws_col; + height = wsize.ws_row; } return true; } |