Jelajahi Sumber

WindowServer/LibGUI: Enforce minimum window size

Linus Groh 5 tahun lalu
induk
melakukan
3474d7c88e

+ 4 - 4
Libraries/LibGUI/Window.cpp

@@ -167,13 +167,13 @@ void Window::set_rect(const Gfx::Rect& a_rect)
             m_main_widget->resize(m_rect_when_windowless.size());
             m_main_widget->resize(m_rect_when_windowless.size());
         return;
         return;
     }
     }
-    WindowServerConnection::the().send_sync<Messages::WindowServer::SetWindowRect>(m_window_id, a_rect);
-    if (m_back_bitmap && m_back_bitmap->size() != a_rect.size())
+    auto window_rect = WindowServerConnection::the().send_sync<Messages::WindowServer::SetWindowRect>(m_window_id, a_rect)->rect();
+    if (m_back_bitmap && m_back_bitmap->size() != window_rect.size())
         m_back_bitmap = nullptr;
         m_back_bitmap = nullptr;
-    if (m_front_bitmap && m_front_bitmap->size() != a_rect.size())
+    if (m_front_bitmap && m_front_bitmap->size() != window_rect.size())
         m_front_bitmap = nullptr;
         m_front_bitmap = nullptr;
     if (m_main_widget)
     if (m_main_widget)
-        m_main_widget->resize(a_rect.size());
+        m_main_widget->resize(window_rect.size());
 }
 }
 
 
 void Window::set_window_type(WindowType window_type)
 void Window::set_window_type(WindowType window_type)

+ 17 - 5
Servers/WindowServer/ClientConnection.cpp

@@ -50,6 +50,15 @@ namespace WindowServer {
 
 
 HashMap<int, NonnullRefPtr<ClientConnection>>* s_connections;
 HashMap<int, NonnullRefPtr<ClientConnection>>* s_connections;
 
 
+static Gfx::Rect normalize_window_rect(Gfx::Rect rect, WindowType window_type)
+{
+    auto min_size = 1;
+    if (window_type == WindowType::Normal)
+        min_size = 50;
+    Gfx::Rect normalized_rect = { rect.x(), rect.y(), max(rect.width(), min_size), max(rect.height(), min_size) };
+    return normalized_rect;
+}
+
 void ClientConnection::for_each_client(Function<void(ClientConnection&)> callback)
 void ClientConnection::for_each_client(Function<void(ClientConnection&)> callback)
 {
 {
     if (!s_connections)
     if (!s_connections)
@@ -388,9 +397,10 @@ OwnPtr<Messages::WindowServer::SetWindowRectResponse> ClientConnection::handle(c
         dbg() << "ClientConnection: Ignoring SetWindowRect request for fullscreen window";
         dbg() << "ClientConnection: Ignoring SetWindowRect request for fullscreen window";
         return nullptr;
         return nullptr;
     }
     }
-    window.set_rect(message.rect());
-    window.request_update(message.rect());
-    return make<Messages::WindowServer::SetWindowRectResponse>();
+    auto normalized_rect = normalize_window_rect(message.rect(), window.type());
+    window.set_rect(normalized_rect);
+    window.request_update(normalized_rect);
+    return make<Messages::WindowServer::SetWindowRectResponse>(normalized_rect);
 }
 }
 
 
 OwnPtr<Messages::WindowServer::GetWindowRectResponse> ClientConnection::handle(const Messages::WindowServer::GetWindowRect& message)
 OwnPtr<Messages::WindowServer::GetWindowRectResponse> ClientConnection::handle(const Messages::WindowServer::GetWindowRect& message)
@@ -444,8 +454,10 @@ OwnPtr<Messages::WindowServer::CreateWindowResponse> ClientConnection::handle(co
     auto window = Window::construct(*this, (WindowType)message.type(), window_id, message.modal(), message.minimizable(), message.resizable(), message.fullscreen());
     auto window = Window::construct(*this, (WindowType)message.type(), window_id, message.modal(), message.minimizable(), message.resizable(), message.fullscreen());
     window->set_has_alpha_channel(message.has_alpha_channel());
     window->set_has_alpha_channel(message.has_alpha_channel());
     window->set_title(message.title());
     window->set_title(message.title());
-    if (!message.fullscreen())
-        window->set_rect(message.rect());
+    if (!message.fullscreen()) {
+        auto normalized_rect = normalize_window_rect(message.rect(), window->type());
+        window->set_rect(normalized_rect);
+    }
     if (window->type() == WindowType::Desktop) {
     if (window->type() == WindowType::Desktop) {
         window->set_rect(WindowManager::the().desktop_rect());
         window->set_rect(WindowManager::the().desktop_rect());
         window->recalculate_rect();
         window->recalculate_rect();

+ 1 - 1
Servers/WindowServer/WindowServer.ipc

@@ -48,7 +48,7 @@ endpoint WindowServer = 2
     SetWindowTitle(i32 window_id, String title) => ()
     SetWindowTitle(i32 window_id, String title) => ()
     GetWindowTitle(i32 window_id) => (String title)
     GetWindowTitle(i32 window_id) => (String title)
 
 
-    SetWindowRect(i32 window_id, Gfx::Rect rect) => ()
+    SetWindowRect(i32 window_id, Gfx::Rect rect) => (Gfx::Rect rect)
     GetWindowRect(i32 window_id) => (Gfx::Rect rect)
     GetWindowRect(i32 window_id) => (Gfx::Rect rect)
 
 
     InvalidateRect(i32 window_id, Vector<Gfx::Rect> rects, bool ignore_occlusion) =|
     InvalidateRect(i32 window_id, Vector<Gfx::Rect> rects, bool ignore_occlusion) =|