[Bf-blender-cvs] [4357fb63db7] blender2.8: Keymap: event type filter w/ finding keymap items

Campbell Barton noreply at git.blender.org
Wed Dec 12 11:52:30 CET 2018


Commit: 4357fb63db77d8bee9b1a3d10fdf6abd55e4c798
Author: Campbell Barton
Date:   Wed Dec 12 21:39:55 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB4357fb63db77d8bee9b1a3d10fdf6abd55e4c798

Keymap: event type filter w/ finding keymap items

Now its possibly to ask for only keyboard/mouse/ndof events
when finding key map items.

===================================================================

M	release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
M	source/blender/editors/interface/interface_context_menu.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/makesrna/RNA_enum_types.h
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_wm_api.c
M	source/blender/windowmanager/WM_keymap.h
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_keymap.c
M	source/blender/windowmanager/wm_event_types.h

===================================================================

diff --git a/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py b/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
index 7f85faa4ba6..ddba25609ea 100644
--- a/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
+++ b/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
@@ -131,7 +131,6 @@ def generate(context, space_type):
     if use_release_confirm or use_tap_reset:
         kmi_toolbar = wm.keyconfigs.find_item_from_operator(
             idname="wm.toolbar",
-            is_hotkey=True,
         )[1]
         kmi_toolbar_type = None if not kmi_toolbar else kmi_toolbar.type
         if use_tap_reset and kmi_toolbar_type is not None:
@@ -151,7 +150,7 @@ def generate(context, space_type):
                 context='INVOKE_REGION_WIN',
                 # properties={"name": item.text},
                 properties=kmi_hack_properties,
-                is_hotkey=True,
+                include={'KEYBOARD'},
             )[1]
             if kmi_found:
                 use_tap_reset = False
@@ -184,7 +183,7 @@ def generate(context, space_type):
                 context='INVOKE_REGION_WIN',
                 # properties={"name": item.text},
                 properties=kmi_hack_properties,
-                is_hotkey=True,
+                include={'KEYBOARD'},
             )[1]
 
             if kmi_found is None:
@@ -205,7 +204,7 @@ def generate(context, space_type):
                             idname="paint.brush_select",
                             context='INVOKE_REGION_WIN',
                             properties=kmi_hack_brush_select_properties,
-                            is_hotkey=True,
+                            include={'KEYBOARD'},
                         )[1]
                     else:
                         print("Unsupported mode:", mode)
@@ -220,7 +219,7 @@ def generate(context, space_type):
             kmi_found = wm.keyconfigs.find_item_from_operator(
                 idname=item.operator,
                 context='INVOKE_REGION_WIN',
-                is_hotkey=True,
+                include={'KEYBOARD'},
             )[1]
         elif item.keymap is not None:
             km = keyconf.keymaps.get(item.keymap[0])
@@ -235,7 +234,7 @@ def generate(context, space_type):
                         idname=kmi_first.idname,
                         # properties=kmi_first.properties,  # prevents matches, don't use.
                         context='INVOKE_REGION_WIN',
-                        is_hotkey=True,
+                        include={'KEYBOARD'},
                     )[1]
                 else:
                     kmi_found = None
diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c
index bbc0f66605c..84460f9f149 100644
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@ -96,7 +96,10 @@ static uiBlock *menu_change_shortcut(bContext *C, ARegion *ar, void *arg)
 	uiStyle *style = UI_style_get_dpi();
 	IDProperty *prop = (but->opptr) ? but->opptr->data : NULL;
 
-	kmi = WM_key_event_operator(C, but->optype->idname, but->opcontext, prop, true, &km);
+	kmi = WM_key_event_operator(
+	        C, but->optype->idname, but->opcontext, prop,
+	        EVT_TYPE_MASK_HOTKEY_INCLUDE, EVT_TYPE_MASK_HOTKEY_EXCLUDE,
+	        &km);
 	BLI_assert(kmi != NULL);
 
 	RNA_pointer_create(&wm->id, &RNA_KeyMapItem, kmi, &ptr);
@@ -202,7 +205,10 @@ static void remove_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
 	wmKeyMapItem *kmi;
 	IDProperty *prop = (but->opptr) ? but->opptr->data : NULL;
 
-	kmi = WM_key_event_operator(C, but->optype->idname, but->opcontext, prop, true, &km);
+	kmi = WM_key_event_operator(
+	        C, but->optype->idname, but->opcontext, prop,
+	        EVT_TYPE_MASK_HOTKEY_INCLUDE, EVT_TYPE_MASK_HOTKEY_EXCLUDE,
+	        &km);
 	BLI_assert(kmi != NULL);
 
 	WM_keymap_remove_item(km, kmi);
@@ -708,7 +714,10 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but)
 		int w = uiLayoutGetWidth(layout);
 		wmKeyMap *km;
 		/* We want to know if this op has a shortcut, be it hotkey or not. */
-		wmKeyMapItem *kmi = WM_key_event_operator(C, but->optype->idname, but->opcontext, prop, false, &km);
+		wmKeyMapItem *kmi = WM_key_event_operator(
+		        C, but->optype->idname, but->opcontext, prop,
+		        EVT_TYPE_MASK_ALL, 0,
+		        &km);
 
 		/* We do have a shortcut, but only keyboard ones are editable that way... */
 		if (kmi) {
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 5ab23ed3893..3a3259e8d1f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -3830,8 +3830,7 @@ static int ui_do_but_HOTKEYEVT(
 		ED_region_tag_redraw(data->region);
 
 		if (event->val == KM_PRESS) {
-			if (ISHOTKEY(event->type)) {
-
+			if (ISHOTKEY(event->type) && (event->type != ESCKEY)) {
 				if (WM_key_event_string(event->type, false)[0])
 					ui_but_value_set(but, event->type);
 				else
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 6504cf8914b..f2eaa9d075f 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -116,6 +116,7 @@ extern const EnumPropertyItem rna_enum_motionpath_bake_location_items[];
 
 extern const EnumPropertyItem rna_enum_event_value_items[];
 extern const EnumPropertyItem rna_enum_event_type_items[];
+extern const EnumPropertyItem rna_enum_event_type_mask_items[];
 extern const EnumPropertyItem rna_enum_operator_return_items[];
 extern const EnumPropertyItem rna_enum_operator_property_tags[];
 
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 77a10e6dbbc..77b9d639fa7 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -406,6 +406,21 @@ const EnumPropertyItem rna_enum_keymap_propvalue_items[] = {
 	{0, NULL, 0, NULL, NULL}
 };
 
+
+/* Mask event types used in keymap items. */
+const EnumPropertyItem rna_enum_event_type_mask_items[] = {
+	{EVT_TYPE_MASK_KEYBOARD_MODIFIER, "KEYBOARD_MODIFIER", 0, "Keyboard Modifier", ""},
+	{EVT_TYPE_MASK_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""},
+	{EVT_TYPE_MASK_MOUSE_WHEEL, "MOUSE_WHEEL", 0, "Mouse Wheel", ""},
+	{EVT_TYPE_MASK_MOUSE_GESTURE, "MOUSE_GESTURE", 0, "Mouse Gesture", ""},
+	{EVT_TYPE_MASK_MOUSE_BUTTON, "MOUSE_BUTTON", 0, "Mouse Button", ""},
+	{EVT_TYPE_MASK_MOUSE, "MOUSE", 0, "Mouse", ""},
+	{EVT_TYPE_MASK_NDOF, "NDOF", 0, "NDOF", ""},
+	{EVT_TYPE_MASK_TWEAK, "TWEAK", 0, "Tweak", ""},
+	{EVT_TYPE_MASK_ACTIONZONE, "ACTIONZONE", 0, "Action Zone", ""},
+	{0, NULL, 0, NULL, NULL}
+};
+
 #if 0
 static const EnumPropertyItem keymap_modifiers_items[] = {
 	{KM_ANY, "ANY", 0, "Any", ""},
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 92a396c22b9..f698f71ad24 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -44,6 +44,7 @@
 #include "UI_interface.h"
 
 #include "wm_cursors.h"
+#include "wm_event_types.h"
 
 #include "rna_internal.h"  /* own include */
 
@@ -371,14 +372,15 @@ static PointerRNA rna_KeyConfig_find_item_from_operator(
         const char *idname,
         int opcontext,
         PointerRNA *properties,
-        bool is_hotkey,
+        int include_mask, int exclude_mask,
         PointerRNA *km_ptr)
 {
 	char idname_bl[OP_MAX_TYPENAME];
 	WM_operator_bl_idname(idname_bl, idname);
 
 	wmKeyMap *km = NULL;
-	wmKeyMapItem *kmi = WM_key_event_operator(C, idname_bl, opcontext, properties->data, (bool)is_hotkey, &km);
+	wmKeyMapItem *kmi = WM_key_event_operator(
+	        C, idname_bl, opcontext, properties->data, include_mask, exclude_mask, &km);
 	PointerRNA kmi_ptr;
 	RNA_pointer_create(&wm->id, &RNA_KeyMap, km, km_ptr);
 	RNA_pointer_create(&wm->id, &RNA_KeyMapItem, kmi, &kmi_ptr);
@@ -972,7 +974,8 @@ void RNA_api_keyconfigs(StructRNA *srna)
 	RNA_def_property_enum_items(parm, rna_enum_operator_context_items);
 	parm = RNA_def_pointer(func, "properties", "OperatorProperties", "", "");
 	RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
-	RNA_def_boolean(func, "is_hotkey", 0, "Hotkey", "Event is not a modifier");
+	RNA_def_enum_flag(func, "include", rna_enum_event_type_mask_items, EVT_TYPE_MASK_ALL, "Include", "");
+	RNA_def_enum_flag(func, "exclude", rna_enum_event_type_mask_items, 0, "Exclude", "");
 	parm = RNA_def_pointer(func, "keymap", "KeyMap", "", "");
 	RNA_def_parameter_flags(parm, 0, PARM_RNAPTR | PARM_OUTPUT);
 	parm = RNA_def_pointer(func, "item", "KeyMapItem", "", "");
diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h
index 7f7612cea35..8f31685e453 100644
--- a/source/blender/windowmanager/WM_keymap.h
+++ b/source/blender/windowmanager/WM_keymap.h
@@ -144,8 +144,8 @@ int WM_keymap_item_raw_to_string(
         const short val, const short type, const bool compact,
         char *result, const int result_len);
 wmKeyMapItem *WM_key_event_operator(
-        const struct bContext *C, const char *opname, int opcontext,
-        struct IDProperty *properties, const bool is_hotkey,
+        const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties,
+        const short include_mask, const short exclude_mask,
         struct wmKeyMap **r_keymap);
 char *WM_key_event_operator_string(
         const struct bContext *C, const char *opname, int opcontext,
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 58773bd4283..81544c2de62 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3534,6 +3534,54 @@ bool WM_event_is_modal_tweak_exit(const wmEvent *event, int tweak_event)
 	return 0;
 }
 
+bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask mask)
+{
+	/* Keyboard. */
+	if (mask & EVT_TYPE_MASK_KEYBOARD) {
+		if (ISKEY

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list