diff --git a/Libraries/LibDraw/Point.h b/Libraries/LibDraw/Point.h index e8516ce6c8..bca61f067b 100644 --- a/Libraries/LibDraw/Point.h +++ b/Libraries/LibDraw/Point.h @@ -110,6 +110,16 @@ public: set_y(value); } + // Returns pixels moved from other in either direction + int pixels_moved(const Point &other) const + { + auto pixels_moved = max( + abs(other.x() - x()), + abs(other.y() - y()) + ); + return pixels_moved; + } + private: int m_x { 0 }; int m_y { 0 }; diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index c2e2893a0c..420277b5bb 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -419,11 +419,6 @@ void WSWindowManager::start_window_drag(WSWindow& window, const WSMouseEvent& ev move_to_front_and_make_active(window); m_drag_window = window.make_weak_ptr(); m_drag_origin = event.position(); - if (window.is_maximized()) { - auto width_before_resize = window.width(); - window.set_maximized(false); - window.move_to(m_drag_origin.x() - (window.width() * ((float)m_drag_origin.x() / width_before_resize)), m_drag_origin.y()); - } m_drag_window_origin = window.position(); invalidate(window); } @@ -489,14 +484,31 @@ bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow* return true; } if (event.type() == WSEvent::MouseMove) { + #ifdef DRAG_DEBUG dbg() << "[WM] Dragging, origin: " << m_drag_origin << ", now: " << event.position(); + if (m_drag_window->is_maximized()) { + dbg() << " [!] The window is still maximized. Not dragging yet."; + } #endif - Point pos = m_drag_window_origin.translated(event.position() - m_drag_origin); - m_drag_window->set_position_without_repaint(pos); - if (m_drag_window->rect().contains(event.position())) - hovered_window = m_drag_window; - return true; + if (m_drag_window->is_maximized()) { + auto pixels_moved_from_start = event.position().pixels_moved(m_drag_origin); + // dbg() << "[WM] " << pixels_moved_from_start << " moved since start of drag"; + if (pixels_moved_from_start > 5) { + // dbg() << "[WM] de-maximizing window"; + m_drag_origin = event.position(); + auto width_before_resize = m_drag_window->width(); + m_drag_window->set_maximized(false); + m_drag_window->move_to(m_drag_origin.x() - (m_drag_window->width() * ((float)m_drag_origin.x() / width_before_resize)), m_drag_origin.y()); + m_drag_window_origin = m_drag_window->position(); + } + } else { + Point pos = m_drag_window_origin.translated(event.position() - m_drag_origin); + m_drag_window->set_position_without_repaint(pos); + if (m_drag_window->rect().contains(event.position())) + hovered_window = m_drag_window; + return true; + } } return false; }