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
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2020-10-22 03:53:40 +0300
committerCampbell Barton <ideasman42@gmail.com>2020-10-22 03:59:37 +0300
commit8da55990034e2d5b0a9910583706e4ea99d0f3ce (patch)
tree18c8d3ba058f89a17109443afbdfdac9764c0e29 /source
parent88660d67a4c5e88e7b7b7304b66e4d893affed91 (diff)
WM: warn when event's have repeat set for non keyboard events
Also add docs to event and keymap item flag.
Diffstat (limited to 'source')
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h13
-rw-r--r--source/blender/windowmanager/WM_types.h7
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c9
3 files changed, 28 insertions, 1 deletions
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. */