when batch is true in DelegateInputHandler, filter simultaneous keydown/keyup
This commit is contained in:
@@ -60,32 +60,38 @@ class DelegateInputHandler implements InputHandler {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
Future<void> process() async {
|
Future<void> process() async {
|
||||||
|
|
||||||
_processing = true;
|
_processing = true;
|
||||||
|
|
||||||
final delegate = delegates.first;
|
final delegate = delegates.first;
|
||||||
final keyUp = <LogicalKey, KeyEvent>{};
|
|
||||||
final keyDown = <LogicalKey, KeyEvent>{};
|
|
||||||
|
|
||||||
for (final event in _events) {
|
late final Map<LogicalKey, KeyEvent> keyDown;
|
||||||
if (event is KeyEvent) {
|
// if batch is true, we treat any tick containing keydown/keyup for the same key as a keydown
|
||||||
switch (event.type) {
|
if (batch) {
|
||||||
case KeyEventType.up:
|
late final Map<LogicalKey, KeyEvent> keyUp = {};
|
||||||
keyUp[event.logicalKey] = event;
|
keyDown = {};
|
||||||
case KeyEventType.down:
|
|
||||||
keyDown[event.logicalKey] = event;
|
for (final event in _events) {
|
||||||
|
if (event is KeyEvent) {
|
||||||
|
switch (event.type) {
|
||||||
|
case KeyEventType.up:
|
||||||
|
keyUp[event.logicalKey] = event;
|
||||||
|
case KeyEventType.down:
|
||||||
|
keyDown[event.logicalKey] = event;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
for (final key in keyUp.keys) {
|
||||||
for (final key in keyUp.keys) {
|
_events.remove(keyDown[key]);
|
||||||
_events.remove(keyDown[key]);
|
_events.remove(keyUp[key]);
|
||||||
_events.remove(keyUp[key]);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await delegate.handle(_events.sublist(0));
|
await delegate.handle(_events.sublist(0));
|
||||||
|
|
||||||
_events.clear();
|
_events.clear();
|
||||||
_events.addAll(keyDown.values);
|
if (batch) {
|
||||||
|
_events.addAll(keyDown.values);
|
||||||
|
}
|
||||||
|
|
||||||
_processing = false;
|
_processing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user