1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 16:15:08 +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

@ -110,6 +110,16 @@ public:
set_y(value); 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: private:
int m_x { 0 }; int m_x { 0 };
int m_y { 0 }; int m_y { 0 };

View file

@ -419,11 +419,6 @@ void WSWindowManager::start_window_drag(WSWindow& window, const WSMouseEvent& ev
move_to_front_and_make_active(window); move_to_front_and_make_active(window);
m_drag_window = window.make_weak_ptr(); m_drag_window = window.make_weak_ptr();
m_drag_origin = event.position(); 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(); m_drag_window_origin = window.position();
invalidate(window); invalidate(window);
} }
@ -489,14 +484,31 @@ bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow*
return true; return true;
} }
if (event.type() == WSEvent::MouseMove) { if (event.type() == WSEvent::MouseMove) {
#ifdef DRAG_DEBUG #ifdef DRAG_DEBUG
dbg() << "[WM] Dragging, origin: " << m_drag_origin << ", now: " << event.position(); 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 #endif
Point pos = m_drag_window_origin.translated(event.position() - m_drag_origin); if (m_drag_window->is_maximized()) {
m_drag_window->set_position_without_repaint(pos); auto pixels_moved_from_start = event.position().pixels_moved(m_drag_origin);
if (m_drag_window->rect().contains(event.position())) // dbg() << "[WM] " << pixels_moved_from_start << " moved since start of drag";
hovered_window = m_drag_window; if (pixels_moved_from_start > 5) {
return true; // 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; return false;
} }