MagnifierWidget.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /*
  2. * Copyright (c) 2021, Valtteri Koskivuori <vkoskiv@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "MagnifierWidget.h"
  7. #include <LibGUI/DisplayLink.h>
  8. #include <LibGUI/Painter.h>
  9. #include <LibGUI/Window.h>
  10. #include <LibGUI/WindowServerConnection.h>
  11. #include <LibGfx/Rect.h>
  12. MagnifierWidget::MagnifierWidget()
  13. {
  14. GUI::DisplayLink::register_callback([this](auto) { sync(); });
  15. }
  16. MagnifierWidget::~MagnifierWidget()
  17. {
  18. }
  19. void MagnifierWidget::set_scale_factor(int scale_factor)
  20. {
  21. VERIFY(scale_factor == 2 || scale_factor == 4);
  22. m_scale_factor = scale_factor;
  23. update();
  24. }
  25. void MagnifierWidget::sync()
  26. {
  27. auto size = frame_inner_rect().size();
  28. Gfx::IntSize grab_size { size.width() / m_scale_factor, size.height() / m_scale_factor };
  29. m_grabbed_bitmap = GUI::WindowServerConnection::the().get_screen_bitmap_around_cursor(grab_size).bitmap();
  30. update();
  31. }
  32. void MagnifierWidget::paint_event(GUI::PaintEvent& event)
  33. {
  34. GUI::Frame::paint_event(event);
  35. GUI::Painter painter(*this);
  36. if (m_grabbed_bitmap)
  37. painter.draw_scaled_bitmap(frame_inner_rect(), *m_grabbed_bitmap, m_grabbed_bitmap->rect());
  38. }