Compare commits

...

2 Commits

Author SHA1 Message Date
Bananymous 6f8f99f42c Terminal: Set terminal size with TIOCSWINSZ when starting
This actually fixes the very broken vim port
2024-12-21 03:23:21 +02:00
Bananymous 69137cddab Kernel: Implement TIOCSWINSZ for pseudo terminals
I have no idea how I had forgotten this
2024-12-21 03:22:48 +02:00
3 changed files with 38 additions and 0 deletions

View File

@ -30,6 +30,8 @@ namespace Kernel
bool can_write_impl() const override { SpinLockGuard _(m_buffer_lock); return m_buffer_size < m_buffer->size(); }
bool has_error_impl() const override { return false; }
BAN::ErrorOr<long> ioctl_impl(int, void*) override;
private:
PseudoTerminalMaster(BAN::UniqPtr<VirtualRange>, mode_t, uid_t, gid_t);
~PseudoTerminalMaster();
@ -61,6 +63,8 @@ namespace Kernel
protected:
void putchar_impl(uint8_t ch) override;
BAN::ErrorOr<long> ioctl_impl(int, void*) override;
private:
PseudoTerminalSlave(BAN::String&& name, uint32_t number, mode_t, uid_t, gid_t);
~PseudoTerminalSlave();

View File

@ -4,6 +4,7 @@
#include <BAN/ScopeGuard.h>
#include <sys/ioctl.h>
#include <sys/sysmacros.h>
namespace Kernel
@ -139,6 +140,14 @@ namespace Kernel
return buffer.size();
}
BAN::ErrorOr<long> PseudoTerminalMaster::ioctl_impl(int request, void* argument)
{
auto slave = m_slave.lock();
if (!slave)
return BAN::Error::from_errno(ENODEV);
return slave->ioctl(request, argument);
}
PseudoTerminalSlave::PseudoTerminalSlave(BAN::String&& name, uint32_t number, mode_t mode, uid_t uid, gid_t gid)
: TTY(mode, uid, gid)
, m_name(BAN::move(name))
@ -163,4 +172,20 @@ namespace Kernel
master->putchar(ch);
}
BAN::ErrorOr<long> PseudoTerminalSlave::ioctl_impl(int request, void* argument)
{
switch (request)
{
case TIOCSWINSZ:
{
const auto* winsize = static_cast<struct winsize*>(argument);
m_width = winsize->ws_col;
m_height = winsize->ws_row;
return 0;
}
}
return TTY::ioctl_impl(request, argument);
}
}

View File

@ -6,6 +6,7 @@
#include <ctype.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <unistd.h>
@ -119,6 +120,14 @@ void Terminal::run()
m_font = MUST(LibFont::Font::load("/usr/share/fonts/lat0-16.psfu"_sv));
{
winsize winsize;
winsize.ws_col = cols();
winsize.ws_row = rows();
if (ioctl(m_shell_info.pts_master, TIOCSWINSZ, &winsize) == -1)
perror("ioctl");
}
{
timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);