diff --git a/Userland/Libraries/LibGUI/Widget.cpp b/Userland/Libraries/LibGUI/Widget.cpp index 3496d3b0a4..a0cb514a30 100644 --- a/Userland/Libraries/LibGUI/Widget.cpp +++ b/Userland/Libraries/LibGUI/Widget.cpp @@ -616,6 +616,22 @@ void Widget::update(const Gfx::IntRect& rect) window->update(bound_by_widget.translated(window_relative_rect().location())); } +void Widget::repaint() +{ + if (rect().is_empty()) + return; + repaint(rect()); +} + +void Widget::repaint(Gfx::IntRect const& rect) +{ + auto* window = this->window(); + if (!window) + return; + update(rect); + window->flush_pending_paints_immediately(); +} + Gfx::IntRect Widget::window_relative_rect() const { auto rect = relative_rect(); diff --git a/Userland/Libraries/LibGUI/Widget.h b/Userland/Libraries/LibGUI/Widget.h index d8de4d6ff5..29ae0f0079 100644 --- a/Userland/Libraries/LibGUI/Widget.h +++ b/Userland/Libraries/LibGUI/Widget.h @@ -136,9 +136,14 @@ public: Gfx::IntRect rect() const { return { 0, 0, width(), height() }; } Gfx::IntSize size() const { return m_relative_rect.size(); } + // Invalidate the widget (or an area thereof), causing a repaint to happen soon. void update(); void update(const Gfx::IntRect&); + // Repaint the widget (or an area thereof) immediately. + void repaint(); + void repaint(Gfx::IntRect const&); + bool is_focused() const; void set_focus(bool, FocusSource = FocusSource::Programmatic); diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index 5dd3eb1ea9..5dbd41b5ea 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -1204,4 +1204,14 @@ void Window::set_modified(bool modified) WindowServerConnection::the().async_set_window_modified(m_window_id, modified); } +void Window::flush_pending_paints_immediately() +{ + if (!m_window_id) + return; + if (m_pending_paint_event_rects.is_empty()) + return; + MultiPaintEvent paint_event(move(m_pending_paint_event_rects), size()); + handle_multi_paint_event(paint_event); +} + } diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index e472873215..119a5529b7 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -202,6 +202,8 @@ public: Menu& add_menu(String name); + void flush_pending_paints_immediately(); + protected: Window(Core::Object* parent = nullptr); virtual void wm_event(WMEvent&);