diff --git a/Kernel/TTY/TTY.cpp b/Kernel/TTY/TTY.cpp index 841e73720f..77bb9ed645 100644 --- a/Kernel/TTY/TTY.cpp +++ b/Kernel/TTY/TTY.cpp @@ -562,6 +562,19 @@ ErrorOr TTY::ioctl(OpenFileDescription&, unsigned request, Userspace(arg.ptr()); + if (mode != KD_TEXT && mode != KD_GRAPHICS) + return EINVAL; + + set_graphical(mode == KD_GRAPHICS); + return {}; + } + case KDGETMODE: { + auto mode_ptr = static_ptr_cast(arg); + int mode = (is_graphical()) ? KD_GRAPHICS : KD_TEXT; + return copy_to_user(mode_ptr, &mode); + } } return EINVAL; } diff --git a/Kernel/TTY/TTY.h b/Kernel/TTY/TTY.h index 881fe90523..76a811373a 100644 --- a/Kernel/TTY/TTY.h +++ b/Kernel/TTY/TTY.h @@ -48,6 +48,9 @@ public: virtual ErrorOr> pseudo_name() const = 0; + virtual bool is_graphical() const { return false; } + virtual void set_graphical(bool) { } + protected: virtual ErrorOr on_tty_write(UserOrKernelBuffer const&, size_t) = 0; void set_size(unsigned short columns, unsigned short rows); diff --git a/Kernel/TTY/VirtualConsole.h b/Kernel/TTY/VirtualConsole.h index 615ad4cf16..13a8add281 100644 --- a/Kernel/TTY/VirtualConsole.h +++ b/Kernel/TTY/VirtualConsole.h @@ -78,8 +78,9 @@ public: void refresh_after_resolution_change(); - bool is_graphical() { return m_graphical; } - void set_graphical(bool graphical); + // ^TTY + virtual bool is_graphical() const override { return m_graphical; } + virtual void set_graphical(bool graphical) override; void emit_char(char); diff --git a/Userland/Libraries/LibC/sys/ioctl_numbers.h b/Userland/Libraries/LibC/sys/ioctl_numbers.h index 2a97ea41ab..a1a314e378 100644 --- a/Userland/Libraries/LibC/sys/ioctl_numbers.h +++ b/Userland/Libraries/LibC/sys/ioctl_numbers.h @@ -74,6 +74,11 @@ struct FBFlushRects { struct FBRect const* rects; }; +enum ConsoleModes { + KD_TEXT = 0x00, + KD_GRAPHICS = 0x01, +}; + __END_DECLS enum IOCtlNumber { @@ -132,6 +137,8 @@ enum IOCtlNumber { VIRGL_IOCTL_CREATE_RESOURCE, VIRGL_IOCTL_SUBMIT_CMD, VIRGL_IOCTL_TRANSFER_DATA, + KDSETMODE, + KDGETMODE, }; #define TIOCGPGRP TIOCGPGRP @@ -184,3 +191,5 @@ enum IOCtlNumber { #define VIRGL_IOCTL_CREATE_RESOURCE VIRGL_IOCTL_CREATE_RESOURCE #define VIRGL_IOCTL_SUBMIT_CMD VIRGL_IOCTL_SUBMIT_CMD #define VIRGL_IOCTL_TRANSFER_DATA VIRGL_IOCTL_TRANSFER_DATA +#define KDSETMODE KDSETMODE +#define KDGETMODE KDGETMODE