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 <ideasman42@gmail.com>2019-10-27 20:53:44 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-10-27 20:59:35 +0300
commitdd904f67614b51c3ade54d07f273944b5abab5b9 (patch)
tree122fdc5889a5859f0363848cc0b6bc642e8afd73 /source/blender/windowmanager
parentae55523013642f2897e840f30ad62c74d31df3e0 (diff)
WM: add utility to lookup a keymap item from an event
Useful for modal operators to be able to match events against regular keymaps.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h4
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c23
2 files changed, 20 insertions, 7 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index f8b6b5171da..f7abfaf565e 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -243,6 +243,10 @@ void WM_event_set_keymap_handler_post_callback(struct wmEventHandler_Keymap *han
wmKeyMap *WM_event_get_keymap_from_handler(wmWindowManager *wm,
struct wmEventHandler_Keymap *handler);
+wmKeyMapItem *WM_event_match_keymap_item(struct bContext *C,
+ wmKeyMap *keymap,
+ const struct wmEvent *event);
+
typedef int (*wmUIHandlerFunc)(struct bContext *C, const struct wmEvent *event, void *userdata);
typedef void (*wmUIHandlerRemoveFunc)(struct bContext *C, void *userdata);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 1dd37dd2843..f52e958c4ca 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -5002,6 +5002,19 @@ wmKeyMap *WM_event_get_keymap_from_handler(wmWindowManager *wm, wmEventHandler_K
return keymap;
}
+wmKeyMapItem *WM_event_match_keymap_item(bContext *C, wmKeyMap *keymap, const wmEvent *event)
+{
+ for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
+ if (wm_eventmatch(event, kmi)) {
+ wmOperatorType *ot = WM_operatortype_find(kmi->idname, 0);
+ if (WM_operator_poll_context(C, ot, WM_OP_INVOKE_DEFAULT)) {
+ return kmi;
+ }
+ }
+ }
+ return NULL;
+}
+
static wmKeyMapItem *wm_kmi_from_event(bContext *C,
wmWindowManager *wm,
ListBase *handlers,
@@ -5017,13 +5030,9 @@ static wmKeyMapItem *wm_kmi_from_event(bContext *C,
wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
wmKeyMap *keymap = WM_event_get_keymap_from_handler(wm, handler);
if (keymap && WM_keymap_poll(C, keymap)) {
- for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
- if (wm_eventmatch(event, kmi)) {
- wmOperatorType *ot = WM_operatortype_find(kmi->idname, 0);
- if (WM_operator_poll_context(C, ot, WM_OP_INVOKE_DEFAULT)) {
- return kmi;
- }
- }
+ wmKeyMapItem *kmi = WM_event_match_keymap_item(C, keymap, event);
+ if (kmi != NULL) {
+ return kmi;
}
}
}