From c6899b091023bd8acfac482f98c8cea89d740758 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 1 May 2020 23:00:42 +0200 Subject: WindowServer: Move child windows together with their parents When moving a window, we will now move any child windows by the same position delta as the parent. This makes ComboBox popup list windows follow the window they were opened by, which looks nice. :^) --- Servers/WindowServer/Window.cpp | 19 +++++++++++++++++++ Servers/WindowServer/Window.h | 12 +++--------- 2 files changed, 22 insertions(+), 9 deletions(-) (limited to 'Servers') diff --git a/Servers/WindowServer/Window.cpp b/Servers/WindowServer/Window.cpp index 84fcc92a22..cd28940dc7 100644 --- a/Servers/WindowServer/Window.cpp +++ b/Servers/WindowServer/Window.cpp @@ -142,6 +142,25 @@ void Window::set_rect(const Gfx::Rect& rect) m_frame.notify_window_rect_changed(old_rect, rect); } +void Window::set_rect_without_repaint(const Gfx::Rect& rect) +{ + ASSERT(!rect.is_empty()); + if (m_rect == rect) + return; + auto old_rect = m_rect; + m_rect = rect; + + if (old_rect.size() == m_rect.size()) { + auto delta = m_rect.location() - old_rect.location(); + for (auto& child_window : m_child_windows) { + if (child_window) + child_window->move_by(delta); + } + } + + m_frame.notify_window_rect_changed(old_rect, rect); +} + void Window::handle_mouse_event(const MouseEvent& event) { set_automatic_cursor_tracking_enabled(event.buttons() != 0); diff --git a/Servers/WindowServer/Window.h b/Servers/WindowServer/Window.h index 71e8d6bfc0..5705d09114 100644 --- a/Servers/WindowServer/Window.h +++ b/Servers/WindowServer/Window.h @@ -142,15 +142,7 @@ public: Gfx::Rect rect() const { return m_rect; } void set_rect(const Gfx::Rect&); void set_rect(int x, int y, int width, int height) { set_rect({ x, y, width, height }); } - void set_rect_without_repaint(const Gfx::Rect& rect) - { - ASSERT(!rect.is_empty()); - if (m_rect == rect) - return; - auto old_rect = m_rect; - m_rect = rect; - m_frame.notify_window_rect_changed(old_rect, rect); - } + void set_rect_without_repaint(const Gfx::Rect&); void set_taskbar_rect(const Gfx::Rect& rect) { m_taskbar_rect = rect; } const Gfx::Rect& taskbar_rect() const { return m_taskbar_rect; } @@ -158,6 +150,8 @@ public: void move_to(const Gfx::Point& position) { set_rect({ position, size() }); } void move_to(int x, int y) { move_to({ x, y }); } + void move_by(const Gfx::Point& delta) { set_position_without_repaint(position().translated(delta)); } + Gfx::Point position() const { return m_rect.location(); } void set_position(const Gfx::Point& position) { set_rect({ position.x(), position.y(), width(), height() }); } void set_position_without_repaint(const Gfx::Point& position) { set_rect_without_repaint({ position.x(), position.y(), width(), height() }); } -- cgit v1.2.3