Skip to content

Commit

Permalink
Kernel: Disable VGA console in graphical mode
Browse files Browse the repository at this point in the history
  • Loading branch information
deoxxa authored and awesomekling committed Aug 18, 2019
1 parent 36e3e7b commit 879bc28
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
22 changes: 19 additions & 3 deletions Kernel/TTY/VirtualConsole.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,20 @@ void VirtualConsole::switch_to(unsigned index)
{
if ((int)index == s_active_console)
return;
dbgprintf("VC: Switch to %u (%p)\n", index, s_consoles[index]);
ASSERT(index < 6);
ASSERT(s_consoles[index]);

InterruptDisabler disabler;
if (s_active_console != -1)
s_consoles[s_active_console]->set_active(false);
if (s_active_console != -1) {
auto* active_console = s_consoles[s_active_console];
// We won't know how to switch away from a graphical console until we
// can set the video mode on our own. Just stop anyone from trying for
// now.
if (active_console->is_graphical())
return;
active_console->set_active(false);
}
dbgprintf("VC: Switch to %u (%p)\n", index, s_consoles[index]);
s_active_console = index;
s_consoles[s_active_console]->set_active(true);
Console::the().set_implementation(s_consoles[s_active_console]);
Expand Down Expand Up @@ -420,6 +428,10 @@ void VirtualConsole::put_character_at(unsigned row, unsigned column, u8 ch)

void VirtualConsole::on_char(u8 ch)
{
// ignore writes in graphical mode
if (m_graphical)
return;

switch (m_escape_state) {
case ExpectBracket:
if (ch == '[')
Expand Down Expand Up @@ -494,6 +506,10 @@ void VirtualConsole::on_char(u8 ch)

void VirtualConsole::on_key_pressed(KeyboardDevice::Event key)
{
// ignore keyboard in graphical mode
if (m_graphical)
return;

if (!key.is_press())
return;
if (key.ctrl()) {
Expand Down
4 changes: 4 additions & 0 deletions Kernel/TTY/VirtualConsole.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ class VirtualConsole final : public TTY
static void switch_to(unsigned);
static void initialize();

bool is_graphical() { return m_graphical; }
void set_graphical(bool graphical) { m_graphical = graphical; }

private:
// ^KeyboardClient
virtual void on_key_pressed(KeyboardDevice::Event) override;
Expand All @@ -43,6 +46,7 @@ class VirtualConsole final : public TTY
u8* m_buffer;
unsigned m_index;
bool m_active { false };
bool m_graphical { false };

void scroll_up();
void set_cursor(unsigned row, unsigned column);
Expand Down
5 changes: 5 additions & 0 deletions Kernel/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,11 @@ VFS* vfs;

int error;

// SystemServer will start WindowServer, which will be doing graphics.
// From this point on we don't want to touch the VGA text terminal or
// accept keyboard input.
tty0->set_graphical(true);

auto* system_server_process = Process::create_user_process("/bin/SystemServer", (uid_t)0, (gid_t)0, (pid_t)0, error, {}, {}, tty0);
if (error != 0) {
kprintf("init_stage2: error spawning SystemServer: %d\n", error);
Expand Down

0 comments on commit 879bc28

Please sign in to comment.