Przeglądaj źródła

Kernel+WindowServer: Move setting tty graphical mode to Userspace

This will allow using the console tty and WindowServer regardless of
your kernel command line. Also this fixes a bug where, when booting in
text mode, the console was in graphical mode, and would not accept
input.
Peter Elliott 3 lat temu
rodzic
commit
12c7b954e1

+ 2 - 0
Base/etc/SystemServer.ini

@@ -86,6 +86,8 @@ SocketPermissions=660
 Priority=high
 KeepAlive=true
 User=window
+# Ensure windowserver has a controlling TTY.
+StdIO=/dev/tty0
 
 [InspectorServer]
 Socket=/tmp/portal/inspector,/tmp/portal/inspectables

+ 0 - 3
Kernel/init.cpp

@@ -377,9 +377,6 @@ void init_stage2(void*)
     // NOTE: Everything marked UNMAP_AFTER_INIT becomes inaccessible after this point.
     MM.unmap_text_after_init();
 
-    // FIXME: It would be nicer to set the mode from userspace.
-    // FIXME: It would be smarter to not hardcode that the first tty is the only graphical one
-    ConsoleManagement::the().first_tty()->set_graphical(GraphicsManagement::the().framebuffer_devices_exist());
     RefPtr<Thread> thread;
     auto userspace_init = kernel_command_line().userspace_init();
     auto init_args = kernel_command_line().userspace_init_args();

+ 10 - 2
Userland/Services/WindowServer/main.cpp

@@ -21,7 +21,7 @@
 
 ErrorOr<int> serenity_main(Main::Arguments)
 {
-    TRY(Core::System::pledge("stdio video thread sendfd recvfd accept rpath wpath cpath unix proc sigaction exec"));
+    TRY(Core::System::pledge("stdio video thread sendfd recvfd accept rpath wpath cpath unix proc sigaction exec tty"));
     TRY(Core::System::unveil("/res", "r"));
     TRY(Core::System::unveil("/tmp", "cw"));
     TRY(Core::System::unveil("/etc/WindowServer.ini", "rwc"));
@@ -34,7 +34,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
     act.sa_flags = SA_NOCLDWAIT;
     act.sa_handler = SIG_IGN;
     TRY(Core::System::sigaction(SIGCHLD, &act, nullptr));
-    TRY(Core::System::pledge("stdio video thread sendfd recvfd accept rpath wpath cpath unix proc exec"));
+    TRY(Core::System::pledge("stdio video thread sendfd recvfd accept rpath wpath cpath unix proc exec tty"));
 
     auto wm_config = TRY(Core::ConfigFile::open("/etc/WindowServer.ini"));
     auto theme_name = wm_config->read_entry("Theme", "Name", "Default");
@@ -50,6 +50,14 @@ ErrorOr<int> serenity_main(Main::Arguments)
     Gfx::FontDatabase::set_default_font_query(default_font_query);
     Gfx::FontDatabase::set_fixed_width_font_query(fixed_width_font_query);
 
+    {
+        // FIXME: Map switched tty from screens.
+        // FIXME: Gracefully cleanup the TTY graphics mode.
+        int tty_fd = TRY(Core::System::open("/dev/tty", O_RDWR));
+        TRY(Core::System::ioctl(tty_fd, KDSETMODE, KD_GRAPHICS));
+        TRY(Core::System::close(tty_fd));
+    }
+
     WindowServer::EventLoop loop;
 
     TRY(Core::System::pledge("stdio video thread sendfd recvfd accept rpath wpath cpath proc exec"));