From 0ea1fd2d54771f9d24cca196a0ff26064aedc3ef Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 7 Jun 2021 09:35:07 +0200 Subject: [PATCH] Magnifier: Use a GUI::DisplayLink to drive the screen captures This ensures that we don't try to update more often than the screen is updated. It also avoids doing synchronous IPC in paint_event(). --- .../Applications/Magnifier/MagnifierWidget.cpp | 16 ++++++++++------ .../Applications/Magnifier/MagnifierWidget.h | 4 +++- Userland/Applications/Magnifier/main.cpp | 1 - 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Userland/Applications/Magnifier/MagnifierWidget.cpp b/Userland/Applications/Magnifier/MagnifierWidget.cpp index 8f6834f04c..ef45843241 100644 --- a/Userland/Applications/Magnifier/MagnifierWidget.cpp +++ b/Userland/Applications/Magnifier/MagnifierWidget.cpp @@ -5,6 +5,7 @@ */ #include "MagnifierWidget.h" +#include #include #include #include @@ -12,6 +13,7 @@ MagnifierWidget::MagnifierWidget() { + GUI::DisplayLink::register_callback([this](auto) { sync(); }); } MagnifierWidget::~MagnifierWidget() @@ -35,10 +37,15 @@ void MagnifierWidget::set_scale_factor(int scale_factor) update(); } -void MagnifierWidget::timer_event(Core::TimerEvent&) +void MagnifierWidget::sync() { m_mouse_position = GUI::WindowServerConnection::the().get_global_cursor_position(); m_desktop_display_scale = GUI::WindowServerConnection::the().get_desktop_display_scale(); + + // Grab and paint our screenshot. + Gfx::IntSize region_size { size().width() / m_scale_factor, size().height() / m_scale_factor }; + Gfx::Rect region { (m_mouse_position.x() * m_desktop_display_scale) - (region_size.width() / 2), (m_mouse_position.y() * m_desktop_display_scale) - (region_size.height() / 2), region_size.width(), region_size.height() }; + m_grabbed_bitmap = GUI::WindowServerConnection::the().get_screen_bitmap(region).bitmap(); update(); } @@ -46,9 +53,6 @@ void MagnifierWidget::paint_event(GUI::PaintEvent&) { GUI::Painter painter(*this); - // Grab and paint our screenshot. - Gfx::IntSize region_size { size().width() / m_scale_factor, size().height() / m_scale_factor }; - Gfx::Rect region { (m_mouse_position.x() * m_desktop_display_scale) - (region_size.width() / 2), (m_mouse_position.y() * m_desktop_display_scale) - (region_size.height() / 2), region_size.width(), region_size.height() }; - auto map = GUI::WindowServerConnection::the().get_screen_bitmap(region); - painter.draw_scaled_bitmap(rect(), *map.bitmap(), map.bitmap()->rect()); + if (m_grabbed_bitmap) + painter.draw_scaled_bitmap(rect(), *m_grabbed_bitmap, m_grabbed_bitmap->rect()); } diff --git a/Userland/Applications/Magnifier/MagnifierWidget.h b/Userland/Applications/Magnifier/MagnifierWidget.h index 2fea077fd1..ba6d0b2c10 100644 --- a/Userland/Applications/Magnifier/MagnifierWidget.h +++ b/Userland/Applications/Magnifier/MagnifierWidget.h @@ -19,10 +19,12 @@ public: void track_cursor_globally(); private: - virtual void timer_event(Core::TimerEvent&) override; virtual void paint_event(GUI::PaintEvent&) override; + void sync(); + Gfx::IntPoint m_mouse_position; int m_scale_factor { 2 }; int m_desktop_display_scale { 1 }; + RefPtr m_grabbed_bitmap; }; diff --git a/Userland/Applications/Magnifier/main.cpp b/Userland/Applications/Magnifier/main.cpp index 00d8c3934f..4b82ded331 100644 --- a/Userland/Applications/Magnifier/main.cpp +++ b/Userland/Applications/Magnifier/main.cpp @@ -84,7 +84,6 @@ int main(int argc, char** argv) window->show(); magnifier.track_cursor_globally(); - magnifier.start_timer(16); return app->exec(); }