From 6c2fa0ee0ab813918de3a478946a5bc5d66fda56 Mon Sep 17 00:00:00 2001 From: Jami Kettunen Date: Sat, 4 Jan 2020 15:24:38 +0200 Subject: [PATCH] WindowServer: Maximize a window if it is dragged to top of the screen --- Servers/WindowServer/WSWindowManager.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index 6b770c32a3..66a6033a1e 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -580,24 +580,34 @@ bool WSWindowManager::process_ongoing_window_move(WSMouseEvent& event, WSWindow* #endif + const int maximization_deadzone = 2; + if (m_move_window->is_maximized()) { auto pixels_moved_from_start = event.position().pixels_moved(m_move_origin); // dbg() << "[WM] " << pixels_moved_from_start << " moved since start of window move"; if (pixels_moved_from_start > 5) { // dbg() << "[WM] de-maximizing window"; m_move_origin = event.position(); + if (m_move_origin.y() <= maximization_deadzone) + return true; auto width_before_resize = m_move_window->width(); m_move_window->set_maximized(false); m_move_window->move_to(m_move_origin.x() - (m_move_window->width() * ((float)m_move_origin.x() / width_before_resize)), m_move_origin.y()); m_move_window_origin = m_move_window->position(); } } else { + bool is_resizable = m_move_window->is_resizable(); auto pixels_moved_from_start = event.position().pixels_moved(m_move_origin); const int tiling_deadzone = 5; - if (m_move_window->is_resizable() && event.x() <= tiling_deadzone) { + if (is_resizable && event.y() <= maximization_deadzone) { + m_move_window->set_tiled(WindowTileType::None); + m_move_window->set_maximized(true); + return true; + } + if (is_resizable && event.x() <= tiling_deadzone) { m_move_window->set_tiled(WindowTileType::Left); - } else if (m_move_window->is_resizable() && event.x() >= WSScreen::the().width() - tiling_deadzone) { + } else if (is_resizable && event.x() >= WSScreen::the().width() - tiling_deadzone) { m_move_window->set_tiled(WindowTileType::Right); } else if (pixels_moved_from_start > 5 || m_move_window->tiled() == WindowTileType::None) { m_move_window->set_tiled(WindowTileType::None);