Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <campbell@blender.org>2022-03-10 12:47:28 +0300
committerCampbell Barton <campbell@blender.org>2022-03-10 12:50:58 +0300
commitef6d108b759711102a04ac5f9ab9dafffae473bc (patch)
treeaa12e314c69fcf51249ac5dd06f3a1d4cc1b362b /source/blender/windowmanager/intern/wm_event_system.c
parentb33d38ebd90b90e6c9d13f3f2cf002873272639e (diff)
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.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c17
1 files changed, 12 insertions, 5 deletions
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);