Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 18cd182

Browse files
committed
Synthesize key events for shift key on pointer events.
1 parent ac1fec6 commit 18cd182

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

lib/web_ui/lib/src/engine/keyboard_binding.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,35 @@ class KeyboardBinding {
152152
_converter = KeyboardConverter(_onKeyData, onMacOs: operatingSystem == OperatingSystem.macOs);
153153
}
154154

155+
// Synthesize shift key up or down event only when the known pressing state is different.
156+
void synthesizeShiftKeyIfNeeded(ui.KeyEventType type) {
157+
// TODO(bleroux): should we take care of shift left AND shift right?
158+
final int physicalShift = kWebToPhysicalKey['ShiftLeft']!;
159+
final bool alreadyPressed = _converter._pressingRecords.containsKey(physicalShift);
160+
final bool synthesizeDown = type == ui.KeyEventType.down && !alreadyPressed;
161+
final bool synthesizeUp = type == ui.KeyEventType.up && alreadyPressed;
162+
if (synthesizeDown || synthesizeUp) {
163+
_converter.performDispatchKeyData(_shiftLeftKeyData(type));
164+
// Update pressing state
165+
if (synthesizeDown) {
166+
_converter._pressingRecords[physicalShift] = _kLogicalShiftLeft;
167+
} else {
168+
_converter._pressingRecords.remove(physicalShift);
169+
}
170+
}
171+
}
172+
173+
ui.KeyData _shiftLeftKeyData(ui.KeyEventType type) {
174+
return ui.KeyData(
175+
timeStamp: Duration.zero,
176+
type: type,
177+
physical: kWebToPhysicalKey['ShiftLeft']!,
178+
logical: _kLogicalShiftLeft,
179+
character: null,
180+
synthesized: true,
181+
);
182+
}
183+
155184
void _reset() {
156185
_clearListeners();
157186
_converter.dispose();

lib/web_ui/lib/src/engine/pointer_binding.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:math' as math;
66

77
import 'package:meta/meta.dart';
8+
import 'package:ui/src/engine/keyboard_binding.dart';
89
import 'package:ui/ui.dart' as ui;
910

1011
import '../engine.dart' show registerHotRestartListener;
@@ -609,9 +610,19 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin {
609610
}, useCapture: useCapture);
610611
}
611612

613+
void _checkModifiersState(DomEvent event) {
614+
// TODO(bleroux): add support for 'Meta', 'Ctrl' and 'Alt'
615+
final DomPointerEvent pointerEvent = event as DomPointerEvent;
616+
final bool shiftPressed = pointerEvent.getModifierState('Shift');
617+
KeyboardBinding.instance!.synthesizeShiftKeyIfNeeded(
618+
shiftPressed ? ui.KeyEventType.down : ui.KeyEventType.up,
619+
);
620+
}
621+
612622
@override
613623
void setup() {
614624
_addPointerEventListener(glassPaneElement, 'pointerdown', (DomPointerEvent event) {
625+
_checkModifiersState(event);
615626
final int device = _getPointerId(event);
616627
final List<ui.PointerData> pointerData = <ui.PointerData>[];
617628
final _ButtonSanitizer sanitizer = _ensureSanitizer(device);
@@ -630,6 +641,7 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin {
630641
});
631642

632643
_addPointerEventListener(domWindow, 'pointermove', (DomPointerEvent event) {
644+
_checkModifiersState(event);
633645
final int device = _getPointerId(event);
634646
final _ButtonSanitizer sanitizer = _ensureSanitizer(device);
635647
final List<ui.PointerData> pointerData = <ui.PointerData>[];
@@ -657,6 +669,7 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin {
657669
}, useCapture: false);
658670

659671
_addPointerEventListener(domWindow, 'pointerup', (DomPointerEvent event) {
672+
_checkModifiersState(event);
660673
final int device = _getPointerId(event);
661674
if (_hasSanitizer(device)) {
662675
final List<ui.PointerData> pointerData = <ui.PointerData>[];

0 commit comments

Comments
 (0)