Merge pull request #42772 from bruvzg/macos_inertia

[macOS] Suppress momentum scrolling after key press.
This commit is contained in:
Rémi Verschelde 2020-10-20 15:10:56 +02:00 committed by GitHub
commit 181082589a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -63,6 +63,8 @@
#define DS_OSX ((DisplayServerOSX *)(DisplayServerOSX::get_singleton())) #define DS_OSX ((DisplayServerOSX *)(DisplayServerOSX::get_singleton()))
static bool ignore_momentum_scroll = false;
static void _get_key_modifier_state(unsigned int p_osx_state, Ref<InputEventWithModifiers> r_state) { static void _get_key_modifier_state(unsigned int p_osx_state, Ref<InputEventWithModifiers> r_state) {
r_state->set_shift((p_osx_state & NSEventModifierFlagShift)); r_state->set_shift((p_osx_state & NSEventModifierFlagShift));
r_state->set_control((p_osx_state & NSEventModifierFlagControl)); r_state->set_control((p_osx_state & NSEventModifierFlagControl));
@ -1304,6 +1306,8 @@ static int remapKey(unsigned int key, unsigned int state) {
ERR_FAIL_COND(!DS_OSX->windows.has(window_id)); ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id]; DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
ignore_momentum_scroll = true;
// Ignore all input if IME input is in progress // Ignore all input if IME input is in progress
if (!imeInputEventInProgress) { if (!imeInputEventInProgress) {
NSString *characters = [event characters]; NSString *characters = [event characters];
@ -1348,6 +1352,8 @@ static int remapKey(unsigned int key, unsigned int state) {
} }
- (void)flagsChanged:(NSEvent *)event { - (void)flagsChanged:(NSEvent *)event {
ignore_momentum_scroll = true;
// Ignore all input if IME input is in progress // Ignore all input if IME input is in progress
if (!imeInputEventInProgress) { if (!imeInputEventInProgress) {
DisplayServerOSX::KeyEvent ke; DisplayServerOSX::KeyEvent ke;
@ -1507,6 +1513,14 @@ inline void sendPanEvent(DisplayServer::WindowID window_id, double dx, double dy
deltaY *= 0.03; deltaY *= 0.03;
} }
if ([event momentumPhase] != NSEventPhaseNone) {
if (ignore_momentum_scroll) {
return;
}
} else {
ignore_momentum_scroll = false;
}
if ([event phase] != NSEventPhaseNone || [event momentumPhase] != NSEventPhaseNone) { if ([event phase] != NSEventPhaseNone || [event momentumPhase] != NSEventPhaseNone) {
sendPanEvent(window_id, deltaX, deltaY, [event modifierFlags]); sendPanEvent(window_id, deltaX, deltaY, [event modifierFlags]);
} else { } else {