Ver Fonte

WindowServer+LibGUI: Make client/server greeting faster

Instead of doing a full IPC round-trip for the client and server to
greet each other upon connecting, the server now automatically sends
a "fast_greet" message when a client connects.

The client simply waits for that message to arrive before proceeding.
(Waiting is necessary since LibGUI relies on the palette information
included in the greeting.)
Andreas Kling há 4 anos atrás
pai
commit
ec8363aec3

+ 10 - 3
Userland/Libraries/LibGUI/WindowServerConnection.cpp

@@ -42,9 +42,16 @@ static void set_system_theme_from_anonymous_buffer(Core::AnonymousBuffer buffer)
 
 void WindowServerConnection::handshake()
 {
-    auto response = greet();
-    set_system_theme_from_anonymous_buffer(response.theme_buffer());
-    Desktop::the().did_receive_screen_rect({}, response.screen_rect());
+    // NOTE: WindowServer automatically sends a "fast_greet" message to us when we connect.
+    //       All we have to do is wait for it to arrive. This avoids a round-trip during application startup.
+    auto message = wait_for_specific_message<Messages::WindowClient::FastGreet>();
+    set_system_theme_from_anonymous_buffer(message->theme_buffer());
+    Desktop::the().did_receive_screen_rect({}, message->screen_rect());
+}
+
+void WindowServerConnection::fast_greet(Gfx::IntRect const&, Core::AnonymousBuffer const&)
+{
+    // NOTE: This message is handled in handshake().
 }
 
 void WindowServerConnection::update_system_theme(Core::AnonymousBuffer const& theme_buffer)

+ 1 - 0
Userland/Libraries/LibGUI/WindowServerConnection.h

@@ -27,6 +27,7 @@ public:
     static WindowServerConnection& the();
 
 private:
+    virtual void fast_greet(Gfx::IntRect const&, Core::AnonymousBuffer const&) override;
     virtual void paint(i32, Gfx::IntSize const&, Vector<Gfx::IntRect> const&) override;
     virtual void mouse_move(i32, Gfx::IntPoint const&, u32, u32, u32, i32, bool, Vector<String> const&) override;
     virtual void mouse_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override;

+ 2 - 5
Userland/Services/WindowServer/ClientConnection.cpp

@@ -53,6 +53,8 @@ ClientConnection::ClientConnection(NonnullRefPtr<Core::LocalSocket> client_socke
     if (!s_connections)
         s_connections = new HashMap<int, NonnullRefPtr<ClientConnection>>;
     s_connections->set(client_id, *this);
+
+    async_fast_greet(Screen::the().rect(), Gfx::current_system_theme_buffer());
 }
 
 ClientConnection::~ClientConnection()
@@ -681,11 +683,6 @@ void ClientConnection::start_window_resize(i32 window_id)
     WindowManager::the().start_window_resize(window, Screen::the().cursor_location(), MouseButton::Left);
 }
 
-Messages::WindowServer::GreetResponse ClientConnection::greet()
-{
-    return { Screen::the().rect(), Gfx::current_system_theme_buffer() };
-}
-
 Messages::WindowServer::StartDragResponse ClientConnection::start_drag(String const& text, HashMap<String, ByteBuffer> const& mime_data, Gfx::ShareableBitmap const& drag_bitmap)
 {
     auto& wm = WindowManager::the();

+ 0 - 1
Userland/Services/WindowServer/ClientConnection.h

@@ -88,7 +88,6 @@ private:
     void set_unresponsive(bool);
     void destroy_window(Window&, Vector<i32>& destroyed_window_ids);
 
-    virtual Messages::WindowServer::GreetResponse greet() override;
     virtual void create_menubar(i32) override;
     virtual void destroy_menubar(i32) override;
     virtual void create_menu(i32, String const&) override;

+ 2 - 0
Userland/Services/WindowServer/WindowClient.ipc

@@ -1,5 +1,7 @@
 endpoint WindowClient
 {
+    fast_greet(Gfx::IntRect screen_rect, Core::AnonymousBuffer theme_buffer) =|
+
     paint(i32 window_id, Gfx::IntSize window_size, Vector<Gfx::IntRect> rects) =|
     mouse_move(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta, bool is_drag, Vector<String> mime_types) =|
     mouse_down(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) =|

+ 0 - 2
Userland/Services/WindowServer/WindowServer.ipc

@@ -1,7 +1,5 @@
 endpoint WindowServer
 {
-    greet() => (Gfx::IntRect screen_rect, Core::AnonymousBuffer theme_buffer)
-
     create_menubar(i32 menubar_id) =|
     destroy_menubar(i32 menubar_id) =|