From a671a5ba7e6bde918304e77cd9692827cb0072ff Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Sat, 23 Jan 2021 02:20:15 +0100 Subject: [PATCH] WindowServer: Prevent moving a window to inaccessible region This is based on a comment by @tomuta on #4644, and should prevent all future instances of bugs like #4644. Disadvantage: The current implementation may generate a lot of WM_WindowRectChanged events for a listener while bouncing occurs. Feel free to improve this. --- Userland/Services/WindowServer/WindowManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 6d9f9dbd1e..ac66601bf1 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -559,6 +559,8 @@ bool WindowManager::process_ongoing_window_move(MouseEvent& event, Window*& hove } else if (m_move_window->tiled() == WindowTileType::None) { Gfx::IntPoint pos = m_move_window_origin.translated(event.position() - m_move_origin); m_move_window->set_position_without_repaint(pos); + // "Bounce back" the window it it would end up too far outside the screen: + m_move_window->normalize_rect(); } else if (pixels_moved_from_start > 5) { m_move_window->set_untiled(event.position()); m_move_origin = event.position();