From 46d6347035357fb6ec49e21326e358e2e54557c8 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Wed, 17 Aug 2022 19:08:18 -0400 Subject: [PATCH] LibGUI+WindowServer: Initialize minimum window size to zero And remove unnecessary workarounds to the old limit of {50, 50} and the cautious but arbitrary limit of {1, 1} for other WindowTypes. Null rects are already the default when calculating minimum window size and are the least restrictive but valid value. Also returns early during minimum size calculations for frameless windows, and verifies against negative minimum sizes and failure to disable widget min size before setting a minimum window size. Layout automatically overrides this setting each relayout otherwise. --- Userland/Libraries/LibGUI/Window.cpp | 18 +++++++--------- Userland/Libraries/LibGUI/Window.h | 3 +-- .../WindowServer/ConnectionFromClient.cpp | 3 +++ Userland/Services/WindowServer/Window.cpp | 21 ++----------------- Userland/Services/WindowServer/Window.h | 2 +- 5 files changed, 14 insertions(+), 33 deletions(-) diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index 7857419ad4d..c5bbf06075b 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -70,7 +70,7 @@ Window::Window(Core::Object* parent) , m_menubar(Menubar::construct()) { all_windows->set(this); - m_rect_when_windowless = { -5000, -5000, 140, 140 }; + m_rect_when_windowless = { -5000, -5000, 0, 0 }; m_title_when_windowless = "GUI::Window"; register_property( @@ -289,7 +289,8 @@ Gfx::IntSize Window::minimum_size() const void Window::set_minimum_size(Gfx::IntSize const& size) { - m_minimum_size_modified = true; + VERIFY(size.width() >= 0 && size.height() >= 0); + VERIFY(!is_obeying_widget_min_size()); m_minimum_size_when_windowless = size; if (is_visible()) @@ -311,14 +312,6 @@ void Window::center_within(Window const& other) void Window::set_window_type(WindowType window_type) { m_window_type = window_type; - - if (!m_minimum_size_modified) { - // Apply minimum size defaults. - if (m_window_type == WindowType::Normal || m_window_type == WindowType::ToolWindow) - m_minimum_size_when_windowless = { 50, 50 }; - else - m_minimum_size_when_windowless = { 1, 1 }; - } } void Window::make_window_manager(unsigned event_mask) @@ -1044,7 +1037,10 @@ void Window::update_min_size() main_widget()->do_layout(); if (m_obey_widget_min_size) { auto min_size = main_widget()->effective_min_size(); - set_minimum_size(MUST(min_size.width().shrink_value()), MUST(min_size.height().shrink_value())); + Gfx::IntSize size = { MUST(min_size.width().shrink_value()), MUST(min_size.height().shrink_value()) }; + m_minimum_size_when_windowless = size; + if (is_visible()) + ConnectionToWindowServer::the().async_set_window_minimum_size(m_window_id, size); } } } diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index f26cbceb6e2..fed8d00d225 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -278,8 +278,7 @@ private: WeakPtr m_automatic_cursor_tracking_widget; WeakPtr m_hovered_widget; Gfx::IntRect m_rect_when_windowless; - Gfx::IntSize m_minimum_size_when_windowless { 50, 50 }; - bool m_minimum_size_modified { false }; + Gfx::IntSize m_minimum_size_when_windowless { 0, 0 }; String m_title_when_windowless; Vector m_pending_paint_event_rects; Gfx::IntSize m_size_increment; diff --git a/Userland/Services/WindowServer/ConnectionFromClient.cpp b/Userland/Services/WindowServer/ConnectionFromClient.cpp index 4a451e9fb30..13aed5f3de0 100644 --- a/Userland/Services/WindowServer/ConnectionFromClient.cpp +++ b/Userland/Services/WindowServer/ConnectionFromClient.cpp @@ -470,6 +470,9 @@ Messages::WindowServer::GetWindowRectResponse ConnectionFromClient::get_window_r static Gfx::IntSize calculate_minimum_size_for_window(Window const& window) { + if (window.is_frameless()) + return { 0, 0 }; + // NOTE: Windows with a title bar have a minimum size enforced by the system, // because we want to always keep their title buttons accessible. if (window.type() == WindowType::Normal || window.type() == WindowType::ToolWindow) { diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index 5990f364a3e..cabcfdface3 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -19,8 +19,6 @@ namespace WindowServer { -static constexpr Gfx::IntSize s_default_normal_minimum_size = { 50, 50 }; - static String default_window_icon_path() { return "/res/icons/16x16/window.png"; @@ -88,10 +86,6 @@ Window::Window(Core::Object& parent, WindowType type) , m_icon(default_window_icon()) , m_frame(*this) { - // Set default minimum size for Normal windows - if (m_type == WindowType::Normal) - m_minimum_size = s_default_normal_minimum_size; - WindowManager::the().add_window(*this); frame().window_was_constructed({}); } @@ -112,10 +106,6 @@ Window::Window(ConnectionFromClient& client, WindowType window_type, int window_ , m_icon(default_window_icon()) , m_frame(*this) { - // Set default minimum size for Normal windows - if (m_type == WindowType::Normal) - m_minimum_size = s_default_normal_minimum_size; - if (parent_window) set_parent_window(*parent_window); WindowManager::the().add_window(*this); @@ -169,7 +159,7 @@ void Window::set_rect(Gfx::IntRect const& rect) void Window::set_rect_without_repaint(Gfx::IntRect const& rect) { - VERIFY(!rect.is_empty()); + VERIFY(rect.width() >= 0 && rect.height() >= 0); if (m_rect == rect) return; auto old_rect = m_rect; @@ -248,16 +238,9 @@ void Window::nudge_into_desktop(Screen* target_screen, bool force_titlebar_visib void Window::set_minimum_size(Gfx::IntSize const& size) { - if (size.is_null()) - return; - + VERIFY(size.width() >= 0 && size.height() >= 0); if (m_minimum_size == size) return; - - // Disallow setting minimum zero widths or heights. - if (size.width() == 0 || size.height() == 0) - return; - m_minimum_size = size; } diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index 79ec348edc9..d6a5e44748a 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -450,7 +450,7 @@ private: float m_alpha_hit_threshold { 0.0f }; Gfx::IntSize m_size_increment; Gfx::IntSize m_base_size; - Gfx::IntSize m_minimum_size { 1, 1 }; + Gfx::IntSize m_minimum_size { 0, 0 }; NonnullRefPtr m_icon; RefPtr m_cursor; RefPtr m_cursor_override;