diff --git a/userspace/libraries/LibC/include/sys/ioctl.h b/userspace/libraries/LibC/include/sys/ioctl.h index d918ba8e..c1779eb5 100644 --- a/userspace/libraries/LibC/include/sys/ioctl.h +++ b/userspace/libraries/LibC/include/sys/ioctl.h @@ -42,15 +42,8 @@ __BEGIN_DECLS #define FIONREAD 40 /* get number of input bytes available */ #define FIONBIO 41 -struct winsize -{ - unsigned short ws_row; - unsigned short ws_col; - unsigned short ws_xpixel; /* unused by kernel */ - unsigned short ws_ypixel; /* unused by kernel */ -}; -#define TIOCGWINSZ 50 -#define TIOCSWINSZ 51 +#define TIOCGWINSZ 50 +#define TIOCSWINSZ 51 #define TCGETS 52 #define TCSETS 53 #define TCSETSW 54 diff --git a/userspace/libraries/LibC/include/termios.h b/userspace/libraries/LibC/include/termios.h index 6b19e1c7..1362aebc 100644 --- a/userspace/libraries/LibC/include/termios.h +++ b/userspace/libraries/LibC/include/termios.h @@ -1,7 +1,7 @@ #ifndef _TERMIOS_H #define _TERMIOS_H 1 -// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/termios.h.html +// https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/termios.h.html #include @@ -39,6 +39,14 @@ struct termios speed_t c_ispeed; }; +struct winsize +{ + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; /* unused by kernel */ + unsigned short ws_ypixel; /* unused by kernel */ +}; + #define BRKINT 0x001 #define ICRNL 0x002 #define IGNBRK 0x004 @@ -143,8 +151,10 @@ int tcflow(int fildes, int action); int tcflush(int fildes, int queue_selector); int tcgetattr(int fildes, struct termios* termios_p); pid_t tcgetsid(int fildes); +int tcgetwinsize(int fildes, struct winsize* winsize_p); int tcsendbreak(int fildes, int duration); int tcsetattr(int fildes, int optional_actions, const struct termios* termios_p); +int tcsetwinsize(int fildes, const struct winsize* winsize_p); __END_DECLS diff --git a/userspace/libraries/LibC/termios.cpp b/userspace/libraries/LibC/termios.cpp index 768bc050..7c3d31e2 100644 --- a/userspace/libraries/LibC/termios.cpp +++ b/userspace/libraries/LibC/termios.cpp @@ -117,3 +117,13 @@ int tcsendbreak(int fd, int duration) dwarnln("FIXME: tcsendbreak({}, {})", fd, duration); return -1; } + +int tcgetwinsize(int fildes, struct winsize* winsize_p) +{ + return ioctl(fildes, TIOCGWINSZ, winsize_p); +} + +int tcsetwinsize(int fildes, const struct winsize* winsize_p) +{ + return ioctl(fildes, TIOCSWINSZ, winsize_p); +} diff --git a/userspace/programs/Terminal/Terminal.cpp b/userspace/programs/Terminal/Terminal.cpp index e1bd317d..a5c0a117 100644 --- a/userspace/programs/Terminal/Terminal.cpp +++ b/userspace/programs/Terminal/Terminal.cpp @@ -9,8 +9,8 @@ #include #include #include -#include #include +#include #include #include @@ -141,14 +141,14 @@ void Terminal::run() m_cells_cols = cols(); { - winsize winsize { + const winsize winsize { .ws_row = static_cast(rows()), .ws_col = static_cast(cols()), .ws_xpixel = static_cast(m_window->width()), .ws_ypixel = static_cast(m_window->height()), }; - if (ioctl(m_shell_info.pts_master, TIOCSWINSZ, &winsize) == -1) - perror("ioctl"); + if (tcsetwinsize(m_shell_info.pts_master, &winsize) == -1) + perror("tcsetwinsize"); } { @@ -212,11 +212,8 @@ void Terminal::run() .ws_xpixel = static_cast(m_window->width()), .ws_ypixel = static_cast(m_window->height()), }; - if (ioctl(m_shell_info.pts_master, TIOCSWINSZ, &winsize) == -1) - { - perror("ioctl"); - return; - } + if (tcsetwinsize(m_shell_info.pts_master, &winsize) == -1) + perror("tcsetwinsize"); }); m_window->set_key_event_callback([&](LibGUI::EventPacket::KeyEvent::event_t event) { diff --git a/userspace/programs/ls/main.cpp b/userspace/programs/ls/main.cpp index 63249daf..bae20ecc 100644 --- a/userspace/programs/ls/main.cpp +++ b/userspace/programs/ls/main.cpp @@ -8,8 +8,8 @@ #include #include #include -#include #include +#include struct config_t { @@ -406,7 +406,7 @@ int main(int argc, const char* argv[]) else for (; i < argc; i++) MUST(files.emplace_back(BAN::StringView(argv[i]))); - g_stdout_terminal = isatty(STDOUT_FILENO) && ioctl(STDOUT_FILENO, TIOCGWINSZ, &g_terminal_size) == 0; + g_stdout_terminal = isatty(STDOUT_FILENO) && tcgetwinsize(STDOUT_FILENO, &g_terminal_size) == 0; int ret = 0; for (size_t i = 0; i < files.size(); i++)