Ver código fonte

WindowServer: Broadcast screen rect changes to all clients.

GUI clients can now obtain the screen rect via GDesktop::rect().
Andreas Kling 6 anos atrás
pai
commit
318db1e48e

+ 6 - 0
LibGUI/GDesktop.cpp

@@ -2,6 +2,7 @@
 #include <LibGUI/GEventLoop.h>
 #include <AK/Eternal.h>
 #include <string.h>
+#include <unistd.h>
 
 GDesktop& GDesktop::the()
 {
@@ -13,6 +14,11 @@ GDesktop::GDesktop()
 {
 }
 
+void GDesktop::did_receive_screen_rect(Badge<GEventLoop>, const Rect& rect)
+{
+    m_rect = rect;
+}
+
 bool GDesktop::set_wallpaper(const String& path)
 {
     WSAPI_ClientMessage message;

+ 6 - 0
LibGUI/GDesktop.h

@@ -1,8 +1,11 @@
 #pragma once
 
 #include <AK/AKString.h>
+#include <AK/Badge.h>
 #include <SharedGraphics/Rect.h>
 
+class GEventLoop;
+
 class GDesktop {
 public:
     static GDesktop& the();
@@ -11,6 +14,9 @@ public:
     String wallpaper() const;
     bool set_wallpaper(const String& path);
 
+    Rect rect() const { return m_rect; }
+    void did_receive_screen_rect(Badge<GEventLoop>, const Rect&);
+
 private:
     Rect m_rect;
 };

+ 7 - 0
LibGUI/GEventLoop.cpp

@@ -6,6 +6,7 @@
 #include <LibGUI/GAction.h>
 #include <LibGUI/GNotifier.h>
 #include <LibGUI/GMenu.h>
+#include <LibGUI/GDesktop.h>
 #include <LibC/unistd.h>
 #include <LibC/stdio.h>
 #include <LibC/fcntl.h>
@@ -339,6 +340,12 @@ void GEventLoop::process_unprocessed_messages()
     for (auto& event : unprocessed_events) {
         if (event.type == WSAPI_ServerMessage::Type::Greeting) {
             s_server_pid = event.greeting.server_pid;
+            GDesktop::the().did_receive_screen_rect(Badge<GEventLoop>(), event.greeting.screen_rect);
+            continue;
+        }
+
+        if (event.type == WSAPI_ServerMessage::Type::ScreenRectChanged) {
+            GDesktop::the().did_receive_screen_rect(Badge<GEventLoop>(), event.screen.rect);
             continue;
         }
 

+ 5 - 0
Servers/WindowServer/WSAPITypes.h

@@ -91,6 +91,7 @@ struct WSAPI_ServerMessage {
         DidSetWindowBackingStore,
         DidSetWallpaper,
         DidGetWallpaper,
+        ScreenRectChanged,
     };
     Type type { Invalid };
     int window_id { -1 };
@@ -101,7 +102,11 @@ struct WSAPI_ServerMessage {
     union {
         struct {
             int server_pid;
+            WSAPI_Rect screen_rect;
         } greeting;
+        struct {
+            WSAPI_Rect rect;
+        } screen;
         struct {
             WSAPI_Rect rect;
             WSAPI_Rect old_rect;

+ 10 - 0
Servers/WindowServer/WSClientConnection.cpp

@@ -7,6 +7,7 @@
 #include <WindowServer/WSWindowManager.h>
 #include <WindowServer/WSAPITypes.h>
 #include <WindowServer/WSClipboard.h>
+#include <WindowServer/WSScreen.h>
 #include <SharedBuffer.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
@@ -47,6 +48,7 @@ WSClientConnection::WSClientConnection(int fd)
     WSAPI_ServerMessage message;
     message.type = WSAPI_ServerMessage::Type::Greeting;
     message.greeting.server_pid = getpid();
+    message.greeting.screen_rect = WSScreen::the().rect();
     post_message(message);
 }
 
@@ -83,6 +85,14 @@ void WSClientConnection::post_message(const WSAPI_ServerMessage& message)
     ASSERT(nwritten == sizeof(message));
 }
 
+void WSClientConnection::notify_about_new_screen_rect(const Rect& rect)
+{
+    WSAPI_ServerMessage message;
+    message.type = WSAPI_ServerMessage::Type::ScreenRectChanged;
+    message.screen.rect = rect;
+    post_message(message);
+}
+
 void WSClientConnection::on_message(const WSMessage& message)
 {
     if (message.is_client_request()) {

+ 2 - 0
Servers/WindowServer/WSClientConnection.h

@@ -36,6 +36,8 @@ public:
     template<typename Matching, typename Callback> void for_each_window_matching(Matching, Callback);
     template<typename Callback> void for_each_window(Callback);
 
+    void notify_about_new_screen_rect(const Rect&);
+
 private:
     virtual void on_message(const WSMessage&) override;
 

+ 4 - 0
Servers/WindowServer/WSWindowManager.cpp

@@ -349,6 +349,10 @@ void WSWindowManager::set_resolution(int width, int height)
     m_buffers_are_flipped = false;
     invalidate();
     compose();
+
+    WSClientConnection::for_each_client([&] (WSClientConnection& client) {
+        client.notify_about_new_screen_rect(m_screen_rect);
+    });
 }
 
 template<typename Callback>