Skip to content

Commit 0d3cc80

Browse files
committed
Discard events received while out focus
1 parent e0d9edc commit 0d3cc80

File tree

1 file changed

+9
-16
lines changed

1 file changed

+9
-16
lines changed

Packages/com.unity.inputsystem/InputSystem/InputManager.cs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,6 +2244,8 @@ internal struct AvailableDevice
22442244
private bool m_NativeBeforeUpdateHooked;
22452245
private bool m_HaveDevicesWithStateCallbackReceivers;
22462246
private bool m_HasFocus;
2247+
private bool m_DiscardOutOfFocusEvents;
2248+
private double m_FocusRegainedTime;
22472249
private InputEventStream m_InputEventStream;
22482250

22492251
// We want to sync devices when the editor comes back into focus. Unfortunately, there's no
@@ -3032,6 +3034,8 @@ internal void OnFocusChanged(bool focus)
30323034
}
30333035
else
30343036
{
3037+
m_DiscardOutOfFocusEvents = true;
3038+
m_FocusRegainedTime = m_Runtime.currentTime;
30353039
// On focus gain, reenable and sync devices.
30363040
for (var i = 0; i < m_DevicesCount; ++i)
30373041
{
@@ -3319,23 +3323,10 @@ private unsafe void OnUpdate(InputUpdateType updateType, ref InputEventBuffer ev
33193323
}
33203324
#endif
33213325

3322-
// In the editor, we discard all input events that occur in-between exiting edit mode and having
3323-
// entered play mode as otherwise we'll spill a bunch of UI events that have occurred while the
3324-
// UI was sort of neither in this mode nor in that mode. This would usually lead to the game receiving
3325-
// an accumulation of spurious inputs right in one of its first updates.
3326-
//
3327-
// NOTE: There's a chance the solution here will prove inadequate on the long run. We may do things
3328-
// here such as throwing partial touches away and then letting the rest of a touch go through.
3329-
// Could be that ultimately we need to issue a full reset of all devices at the beginning of
3330-
// play mode in the editor.
3326+
33313327
#if UNITY_EDITOR
3332-
if ((currentEventType == StateEvent.Type ||
3333-
currentEventType == DeltaStateEvent.Type) &&
3334-
(updateType & InputUpdateType.Editor) == 0 &&
3335-
InputSystem.s_SystemObject.exitEditModeTime > 0 &&
3336-
currentEventTimeInternal >= InputSystem.s_SystemObject.exitEditModeTime &&
3337-
(currentEventTimeInternal < InputSystem.s_SystemObject.enterPlayModeTime ||
3338-
InputSystem.s_SystemObject.enterPlayModeTime == 0))
3328+
// Skip events that should be discarded based on timing or focus state
3329+
if (ShouldDiscardEvent(currentEventType, currentEventTimeInternal, updateType))
33393330
{
33403331
m_InputEventStream.Advance(false);
33413332
continue;
@@ -3678,6 +3669,8 @@ private unsafe void OnUpdate(InputUpdateType updateType, ref InputEventBuffer ev
36783669
break;
36793670
}
36803671

3672+
m_DiscardOutOfFocusEvents = false;
3673+
36813674
m_Metrics.totalEventProcessingTime +=
36823675
((double)(Stopwatch.GetTimestamp() - processingStartTime)) / Stopwatch.Frequency;
36833676
m_Metrics.totalEventLagTime += totalEventLag;

0 commit comments

Comments
 (0)