Screensaver.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * Copyright (c) 2022, Jelle Raaijmakers <jelle@gmta.nl>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibDesktop/Screensaver.h>
  7. #include <LibGUI/Icon.h>
  8. namespace Desktop {
  9. static constexpr int mouse_max_distance_move = 10;
  10. static constexpr int mouse_tracking_delay_milliseconds = 750;
  11. ErrorOr<NonnullRefPtr<GUI::Window>> Screensaver::create_window(StringView title, StringView icon)
  12. {
  13. auto window = GUI::Window::construct();
  14. window->set_double_buffering_enabled(false);
  15. window->set_frameless(true);
  16. window->set_fullscreen(true);
  17. window->set_minimizable(false);
  18. window->set_resizable(false);
  19. window->set_title(title);
  20. auto app_icon = TRY(GUI::Icon::try_create_default_icon(icon));
  21. window->set_icon(app_icon.bitmap_for_size(16));
  22. return window;
  23. }
  24. void Screensaver::keydown_event(GUI::KeyEvent&)
  25. {
  26. trigger_exit();
  27. }
  28. void Screensaver::mousedown_event(GUI::MouseEvent&)
  29. {
  30. trigger_exit();
  31. }
  32. void Screensaver::mousemove_event(GUI::MouseEvent& event)
  33. {
  34. auto now = MonotonicTime::now();
  35. if ((now - m_start_time).to_milliseconds() < mouse_tracking_delay_milliseconds)
  36. return;
  37. if (!m_mouse_origin.has_value())
  38. m_mouse_origin = event.position();
  39. else if (event.position().distance_from(m_mouse_origin.value()) > mouse_max_distance_move)
  40. trigger_exit();
  41. }
  42. void Screensaver::trigger_exit()
  43. {
  44. if (on_screensaver_exit)
  45. on_screensaver_exit();
  46. }
  47. }