From 7967c80222a18db5da815201d0d58afdf8b0df18 Mon Sep 17 00:00:00 2001 From: Chyza Date: Fri, 13 Mar 2020 22:21:24 +0000 Subject: [PATCH] WindowServer: Resize maximised/tiled windows after resolution change Previously windows would either extend past the screen or stay at their previous smaller size in the corner, now they are resized to fit the new resolution. --- Servers/WindowServer/Window.cpp | 57 +++++++++++++++++--------- Servers/WindowServer/Window.h | 3 ++ Servers/WindowServer/WindowManager.cpp | 6 +++ 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/Servers/WindowServer/Window.cpp b/Servers/WindowServer/Window.cpp index 37b0cda034..d9aff659a1 100644 --- a/Servers/WindowServer/Window.cpp +++ b/Servers/WindowServer/Window.cpp @@ -385,33 +385,37 @@ void Window::set_fullscreen(bool fullscreen) set_rect(new_window_rect); } +Gfx::Rect Window::tiled_rect(WindowTileType tiled) const +{ + int frame_width = (m_frame.rect().width() - m_rect.width()) / 2; + switch (tiled) { + case WindowTileType::None: + return m_untiled_rect; + case WindowTileType::Left: + return Gfx::Rect(0, + WindowManager::the().maximized_window_rect(*this).y(), + Screen::the().width() / 2 - frame_width, + WindowManager::the().maximized_window_rect(*this).height()); + case WindowTileType::Right: + return Gfx::Rect(Screen::the().width() / 2 + frame_width, + WindowManager::the().maximized_window_rect(*this).y(), + Screen::the().width() / 2 - frame_width, + WindowManager::the().maximized_window_rect(*this).height()); + default : + ASSERT_NOT_REACHED(); + } +} + void Window::set_tiled(WindowTileType tiled) { if (m_tiled == tiled) return; + m_tiled = tiled; auto old_rect = m_rect; - - int frame_width = (m_frame.rect().width() - m_rect.width()) / 2; - switch (tiled) { - case WindowTileType::None: - set_rect(m_untiled_rect); - break; - case WindowTileType::Left: + if (tiled != WindowTileType::None) m_untiled_rect = m_rect; - set_rect(0, - WindowManager::the().maximized_window_rect(*this).y(), - Screen::the().width() / 2 - frame_width, - WindowManager::the().maximized_window_rect(*this).height()); - break; - case WindowTileType::Right: - m_untiled_rect = m_rect; - set_rect(Screen::the().width() / 2 + frame_width, - WindowManager::the().maximized_window_rect(*this).y(), - Screen::the().width() / 2 - frame_width, - WindowManager::the().maximized_window_rect(*this).height()); - break; - } + set_rect(tiled_rect(tiled)); Core::EventLoop::current().post_event(*this, make(old_rect, m_rect)); } @@ -420,4 +424,17 @@ void Window::detach_client(Badge) m_client = nullptr; } +void Window::recalculate_rect() +{ + if (!is_resizable()) + return; + + auto old_rect = m_rect; + if (m_tiled != WindowTileType::None) + set_rect(tiled_rect(m_tiled)); + else if (is_maximized()) + set_rect(WindowManager::the().maximized_window_rect(*this)); + Core::EventLoop::current().post_event(*this, make(old_rect, m_rect)); +} + } diff --git a/Servers/WindowServer/Window.h b/Servers/WindowServer/Window.h index 2d9e84bad1..31f05c76b8 100644 --- a/Servers/WindowServer/Window.h +++ b/Servers/WindowServer/Window.h @@ -218,6 +218,9 @@ public: void start_minimize_animation() { m_minimize_animation_step = 0; } void end_minimize_animation() { m_minimize_animation_step = -1; } + Gfx::Rect tiled_rect(WindowTileType) const; + void recalculate_rect(); + // For InlineLinkedList. // FIXME: Maybe make a ListHashSet and then WindowManager can just use that. Window* m_next { nullptr }; diff --git a/Servers/WindowServer/WindowManager.cpp b/Servers/WindowServer/WindowManager.cpp index 4cb6bdeb67..8af7132dc5 100644 --- a/Servers/WindowServer/WindowManager.cpp +++ b/Servers/WindowServer/WindowManager.cpp @@ -140,6 +140,12 @@ bool WindowManager::set_resolution(int width, int height) ClientConnection::for_each_client([&](ClientConnection& client) { client.notify_about_new_screen_rect(Screen::the().rect()); }); + if (success) { + for_each_window([](Window& window) { + window.recalculate_rect(); + return IterationDecision::Continue; + }); + } if (m_wm_config) { if (success) { dbg() << "Saving resolution: " << Gfx::Size(width, height) << " to config file at " << m_wm_config->file_name();