From 8da55990034e2d5b0a9910583706e4ea99d0f3ce Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 22 Oct 2020 11:53:40 +1100 Subject: WM: warn when event's have repeat set for non keyboard events Also add docs to event and keymap item flag. --- source/blender/makesdna/DNA_windowmanager_types.h | 13 +++++++++++++ source/blender/windowmanager/WM_types.h | 7 ++++++- source/blender/windowmanager/intern/wm_event_system.c | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 3f7e3e61d56..4b4e17b38bd 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -383,6 +383,19 @@ enum { KMI_EXPANDED = (1 << 1), KMI_USER_MODIFIED = (1 << 2), KMI_UPDATE = (1 << 3), + /** + * When set, ignore events with #wmEvent.is_repeat enabled. + * + * \note this flag isn't cleared when editing/loading the key-map items, + * so it may be set in cases which don't make sense (modifier-keys or mouse-motion for example). + * + * Knowing if an event may repeat is something set at the operating-systems event handling level + * so rely on #wmEvent.is_repeat being false non keyboard events instead of checking if this + * flag makes sense. + * + * Only used when: `ISKEYBOARD(kmi->type) || (kmi->type == KM_TEXTINPUT)` + * as mouse, 3d-mouse, timer... etc never repeat. + */ KMI_REPEAT_IGNORE = (1 << 4), }; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 1b693160e56..a8d24205268 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -559,7 +559,12 @@ typedef struct wmEvent { /** From ghost, fallback if utf8 isn't set. */ char ascii; - /** Generated by auto-repeat. */ + /** + * Generated by auto-repeat, note that this must only ever be set for keyboard events + * where `ISKEYBOARD(event->type) == true`. + * + * See #KMI_REPEAT_IGNORE for details on how key-map handling uses this. + */ char is_repeat; /** Previous state, used for double click and the 'click'. */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index faec579a7c3..8eb9a3b0650 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -155,6 +155,15 @@ wmEvent *WM_event_add_simulate(wmWindow *win, const wmEvent *event_to_add) void wm_event_free(wmEvent *event) { +#ifndef NDEBUG + /* Don't use assert here because it's fairly harmless in most cases, + * more an issue of correctness, something we should avoid in general. */ + if (event->is_repeat && !ISKEYBOARD(event->type)) { + printf("%s: 'is_repeat=true' for non-keyboard event, this should not happen.\n", __func__); + WM_event_print(event); + } +#endif + if (event->customdata) { if (event->customdatafree) { /* Note: pointer to listbase struct elsewhere. */ -- cgit v1.2.3