From ef6d108b759711102a04ac5f9ab9dafffae473bc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 10 Mar 2022 20:47:28 +1100 Subject: Fix T96279: 'Emulate 3 button mouse' fails to emulate MMB Regression in 08d8eee006f7e2a7ac05ef691bbaee230cbfbe5a caused emulate-middle mouse to work once, clearing the modifier key. Now the modifier key from emulated mouse events is never stored in the windows event-state. --- source/blender/windowmanager/intern/wm_event_system.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'source/blender/windowmanager/intern/wm_event_system.c') diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 14a4a618bb0..47f1f36dceb 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -4775,7 +4775,9 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d /** * Update the event-state for any kind of event that supports #KM_PRESS / #KM_RELEASE. */ -static void wm_event_state_update_and_click_set(wmEvent *event, wmEvent *event_state) +static void wm_event_state_update_and_click_set(const GHOST_TEventType type, + wmEvent *event, + wmEvent *event_state) { BLI_assert(ISKEYBOARD_OR_BUTTON(event->type)); BLI_assert(ELEM(event->val, KM_PRESS, KM_RELEASE)); @@ -4788,7 +4790,12 @@ static void wm_event_state_update_and_click_set(wmEvent *event, wmEvent *event_s /* Copy to event state. */ event_state->val = event->val; event_state->type = event->type; - event_state->modifier = event->modifier; + /* It's important only to write into the `event_state` modifier for keyboard + * events because emulate MMB clears one of the modifiers in `event->modifier`, + * making the second press not behave as if the modifier is pressed, see T96279. */ + if (ELEM(type, GHOST_kEventKeyDown, GHOST_kEventKeyUp)) { + event_state->modifier = event->modifier; + } event_state->flag = (event->flag & event_state_flag_mask); /* NOTE: It's important that `keymodifier` is handled in the keyboard event handling logic * since the `event_state` and the `event` are not kept in sync. */ @@ -4962,7 +4969,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void wm_tablet_data_from_ghost(&bd->tablet, &event.tablet); wm_eventemulation(&event, false); - wm_event_state_update_and_click_set(&event, event_state); + wm_event_state_update_and_click_set(type, &event, event_state); /* Add to other window if event is there (not to both!). */ wmWindow *win_other = wm_event_cursor_other_windows(wm, win, &event); @@ -5082,7 +5089,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void } /* It's important `event.modifier` has been initialized first. */ - wm_event_state_update_and_click_set(&event, event_state); + wm_event_state_update_and_click_set(type, &event, event_state); /* If test_break set, it catches this. Do not set with modifier presses. * Exclude modifiers because MS-Windows uses these to bring up the task manager. @@ -5156,7 +5163,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void event.custom = 0; event.customdata = NULL; - wm_event_state_update_and_click_set(&event, event_state); + wm_event_state_update_and_click_set(type, &event, event_state); wm_event_add(win, &event); -- cgit v1.2.3