VisibleSurface.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "VisibleSurface.hh"
  2. #include "Display.hh"
  3. #include "RenderSettings.hh"
  4. #include "VideoSystem.hh"
  5. #include "FloatSetting.hh"
  6. #include "BooleanSetting.hh"
  7. #include "Event.hh"
  8. #include "EventDistributor.hh"
  9. #include "InputEventGenerator.hh"
  10. #include "one_of.hh"
  11. #include <cassert>
  12. namespace openmsx {
  13. VisibleSurface::VisibleSurface(
  14. Display& display_,
  15. RTScheduler& rtScheduler,
  16. EventDistributor& eventDistributor_,
  17. InputEventGenerator& inputEventGenerator_,
  18. CliComm& cliComm_,
  19. VideoSystem& videoSystem_)
  20. : RTSchedulable(rtScheduler)
  21. , display(display_)
  22. , eventDistributor(eventDistributor_)
  23. , inputEventGenerator(inputEventGenerator_)
  24. , cliComm(cliComm_)
  25. , videoSystem(videoSystem_)
  26. {
  27. auto& renderSettings = display.getRenderSettings();
  28. inputEventGenerator.getGrabInput().attach(*this);
  29. renderSettings.getPointerHideDelaySetting().attach(*this);
  30. renderSettings.getFullScreenSetting().attach(*this);
  31. eventDistributor.registerEventListener(
  32. OPENMSX_MOUSE_MOTION_EVENT, *this);
  33. eventDistributor.registerEventListener(
  34. OPENMSX_MOUSE_BUTTON_DOWN_EVENT, *this);
  35. eventDistributor.registerEventListener(
  36. OPENMSX_MOUSE_BUTTON_UP_EVENT, *this);
  37. updateCursor();
  38. }
  39. VisibleSurface::~VisibleSurface()
  40. {
  41. eventDistributor.unregisterEventListener(
  42. OPENMSX_MOUSE_MOTION_EVENT, *this);
  43. eventDistributor.unregisterEventListener(
  44. OPENMSX_MOUSE_BUTTON_DOWN_EVENT, *this);
  45. eventDistributor.unregisterEventListener(
  46. OPENMSX_MOUSE_BUTTON_UP_EVENT, *this);
  47. inputEventGenerator.getGrabInput().detach(*this);
  48. auto& renderSettings = display.getRenderSettings();
  49. renderSettings.getPointerHideDelaySetting().detach(*this);
  50. renderSettings.getFullScreenSetting().detach(*this);
  51. }
  52. void VisibleSurface::update(const Setting& /*setting*/)
  53. {
  54. updateCursor();
  55. }
  56. void VisibleSurface::executeRT()
  57. {
  58. // timer expired, hide cursor
  59. videoSystem.showCursor(false);
  60. inputEventGenerator.updateGrab(grab);
  61. }
  62. int VisibleSurface::signalEvent(const std::shared_ptr<const Event>& event)
  63. {
  64. assert(event->getType() == one_of(OPENMSX_MOUSE_MOTION_EVENT,
  65. OPENMSX_MOUSE_BUTTON_UP_EVENT,
  66. OPENMSX_MOUSE_BUTTON_DOWN_EVENT));
  67. (void)event;
  68. updateCursor();
  69. return 0;
  70. }
  71. void VisibleSurface::updateCursor()
  72. {
  73. cancelRT();
  74. auto& renderSettings = display.getRenderSettings();
  75. grab = renderSettings.getFullScreen() ||
  76. inputEventGenerator.getGrabInput().getBoolean();
  77. if (grab) {
  78. // always hide cursor in fullscreen or grabinput mode, but do it
  79. // after the derived class is constructed to avoid an SDL bug.
  80. scheduleRT(0);
  81. return;
  82. }
  83. inputEventGenerator.updateGrab(grab);
  84. float delay = renderSettings.getPointerHideDelay();
  85. if (delay == 0.0f) {
  86. videoSystem.showCursor(false);
  87. } else {
  88. videoSystem.showCursor(true);
  89. if (delay > 0.0f) {
  90. scheduleRT(int(delay * 1e6f)); // delay in s, schedule in us
  91. }
  92. }
  93. }
  94. } // namespace openmsx