1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-20 18:05:07 +00:00

WindowServer: Don't de-maximize windows immediately (#756)

At least 5 pixels of dragging in some direction needed until a window
gets de-maximized.
This commit is contained in:
masi456 2019-11-10 18:28:01 +01:00 committed by Andreas Kling
parent 18348cebf1
commit 7e7451c427
2 changed files with 32 additions and 10 deletions

View file

@ -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;
}