diff options
author | etaIneLp <etaIneLp@gmail.com> | 2021-01-30 13:57:27 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-01-30 22:59:16 +0100 |
commit | e625ae1130c95ddb5b7de7d65f9cdbabde431920 (patch) | |
tree | fc2dcf1326fc2b7350d42855799421c7672bb1ca /Userland | |
parent | c0e88b971052c6b700e87f7c183eb743b0de992f (diff) | |
download | serenity-e625ae1130c95ddb5b7de7d65f9cdbabde431920.zip |
WindowManager: Restore a window's geometry when untiling it
Specifically, when untiling it using the Super-{Left,Right} shortcuts
Fixes #5182
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Services/WindowServer/Window.cpp | 12 | ||||
-rw-r--r-- | Userland/Services/WindowServer/Window.h | 2 | ||||
-rw-r--r-- | Userland/Services/WindowServer/WindowManager.cpp | 8 |
3 files changed, 15 insertions, 7 deletions
diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index 19fcdd68dc..50a37ddc4a 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -702,7 +702,7 @@ Gfx::IntRect Window::tiled_rect(WindowTileType tiled) const } } -bool Window::set_untiled(const Gfx::IntPoint& fixed_point) +bool Window::set_untiled(Optional<Gfx::IntPoint> fixed_point) { if (m_tiled == WindowTileType::None) return false; @@ -710,9 +710,13 @@ bool Window::set_untiled(const Gfx::IntPoint& fixed_point) m_tiled = WindowTileType::None; - auto new_rect = Gfx::IntRect(m_rect); - new_rect.set_size_around(m_untiled_rect.size(), fixed_point); - set_rect(new_rect); + if (fixed_point.has_value()) { + auto new_rect = Gfx::IntRect(m_rect); + new_rect.set_size_around(m_untiled_rect.size(), fixed_point.value()); + set_rect(new_rect); + } else { + set_rect(m_untiled_rect); + } Core::EventLoop::current().post_event(*this, make<ResizeEvent>(m_rect)); diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index 4a40ec76eb..ed7f4ca946 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -110,7 +110,7 @@ public: WindowTileType tiled() const { return m_tiled; } void set_tiled(WindowTileType); - bool set_untiled(const Gfx::IntPoint& fixed_point); + bool set_untiled(Optional<Gfx::IntPoint> fixed_point = {}); bool is_occluded() const { return m_occluded; } void set_occluded(bool); diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 5457c42de7..257dc65cec 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -1133,8 +1133,10 @@ void WindowManager::event(Core::Event& event) return; } if (key_event.key() == Key_Left) { + if (m_active_input_window->tiled() == WindowTileType::Left) + return; if (m_active_input_window->tiled() != WindowTileType::None) { - m_active_input_window->set_tiled(WindowTileType::None); + m_active_input_window->set_untiled(); return; } if (m_active_input_window->is_maximized()) @@ -1143,8 +1145,10 @@ void WindowManager::event(Core::Event& event) return; } if (key_event.key() == Key_Right) { + if (m_active_input_window->tiled() == WindowTileType::Right) + return; if (m_active_input_window->tiled() != WindowTileType::None) { - m_active_input_window->set_tiled(WindowTileType::None); + m_active_input_window->set_untiled(); return; } if (m_active_input_window->is_maximized()) |