24 , eventDistributor(eventDistributor_)
25 , msxEventDistributor(msxEventDistributor_)
26 , prevEmu(EmuTime::zero())
27 , prevReal(Timer::getTime())
29 commandController,
"inputdelay",
30 "delay input to avoid key-skips", 0.0, 0.0, 10.0)
80int EventDelay::signalEvent(
const Event& event)
82 toBeScheduledEvents.push_back(event);
92 auto realDuration = curRealTime - prevReal;
93 prevReal = curRealTime;
94 auto emuDuration = curEmu - prevEmu;
97 double factor = emuDuration.toDouble() / narrow_cast<double>(realDuration);
119 std::vector<Event> toBeRescheduledEvents;
122 EmuTime time = curEmu + extraDelay;
123 for (
auto&
e : toBeScheduledEvents) {
126 const auto& keyEvent = get_event<KeyEvent>(
e);
127 int maskedKeyCode = int(keyEvent.getKeyCode()) & int(Keys::K_MASK);
128 auto it =
ranges::find(nonMatchedKeyPresses, maskedKeyCode,
129 [](
const auto& p) {
return p.first; });
131 if (it ==
end(nonMatchedKeyPresses)) {
132 nonMatchedKeyPresses.emplace_back(maskedKeyCode,
e);
137 if (it !=
end(nonMatchedKeyPresses)) {
138 const auto& timedPressEvent = get_event<TimedEvent>(it->second);
139 const auto& timedReleaseEvent = get_event<TimedEvent>(
e);
140 auto pressRealTime = timedPressEvent.getRealTime();
141 auto releaseRealTime = timedReleaseEvent.getRealTime();
142 auto deltaTime = releaseRealTime - pressRealTime;
143 if (deltaTime <= 2000000 / 50) {
149 toBeRescheduledEvents.push_back(newKeyupEvent);
157 scheduledEvents.push_back(
e);
158 const auto& sdlEvent = get_event<SdlEvent>(
e);
159 uint32_t eventSdlTime = sdlEvent.getCommonSdlEvent().timestamp;
160 uint32_t sdlNow = SDL_GetTicks();
161 auto sdlOffset = int32_t(sdlNow - eventSdlTime);
162 assert(sdlOffset >= 0);
163 auto offset = 1000 * int64_t(sdlOffset);
164 EmuDuration emuOffset(factor * narrow_cast<double>(offset));
165 auto schedTime = (emuOffset < extraDelay)
168 assert(curEmu <= schedTime);
171 toBeScheduledEvents.clear();
174 append(toBeScheduledEvents, std::move(toBeRescheduledEvents));
178void EventDelay::executeUntil(EmuTime::param time)
181 auto event = std::move(scheduledEvents.front());
182 scheduledEvents.pop_front();
184 }
catch (MSXException&) {
193 for (
auto&
e : scheduledEvents) {
196 scheduledEvents.clear();
198 for (
auto&
e : toBeScheduledEvents) {
201 toBeScheduledEvents.clear();
void sync(EmuTime::param curEmu)
EventDelay(Scheduler &scheduler, CommandController &commandController, EventDistributor &eventDistributor, MSXEventDistributor &msxEventDistributor, ReverseManager &reverseManager)
void unregisterEventListener(EventType type, EventListener &listener)
Unregisters a previously registered event listener.
void registerEventListener(EventType type, EventListener &listener, Priority priority=OTHER)
Registers a given object to receive certain events.
double getDouble() const noexcept
void distributeEvent(const Event &event, EmuTime::param time)
Deliver the event to all registered listeners.
void registerEventDelay(EventDelay &eventDelay_)
Every class that wants to get scheduled at some point must inherit from this class.
void setSyncPoint(EmuTime::param timestamp)
EmuTime::param getCurrentTime() const
Convenience method: This is the same as getScheduler().getCurrentTime().
uint64_t getTime()
Get current (real) time in us.
This file implemented 3 utility functions:
std::variant< KeyUpEvent, KeyDownEvent, MouseMotionEvent, MouseButtonUpEvent, MouseButtonDownEvent, MouseWheelEvent, JoystickAxisMotionEvent, JoystickHatEvent, JoystickButtonUpEvent, JoystickButtonDownEvent, OsdControlReleaseEvent, OsdControlPressEvent, WindowEvent, TextEvent, FileDropEvent, QuitEvent, FinishFrameEvent, CliCommandEvent, GroupEvent, BootEvent, FrameDrawnEvent, BreakEvent, SwitchRendererEvent, TakeReverseSnapshotEvent, AfterTimedEvent, MachineLoadedEvent, MachineActivatedEvent, MachineDeactivatedEvent, MidiInReaderEvent, MidiInWindowsEvent, MidiInCoreMidiEvent, MidiInCoreMidiVirtualEvent, MidiInALSAEvent, Rs232TesterEvent, ImGuiDelayedActionEvent, ImGuiActiveEvent > Event
EventType getType(const Event &event)
auto find(InputRange &&range, const T &value)
void move_pop_back(VECTOR &v, typename VECTOR::iterator it)
Erase the pointed to element from the given vector.
constexpr auto end(const zstring_view &x)