[Bf-blender-cvs] [50e88740c48] blender2.8: Fix PyManipulators having keymaps registered twice

Campbell Barton noreply at git.blender.org
Tue Jul 25 12:05:29 CEST 2017


Commit: 50e88740c481a18bde50c710d0406d4d878d65cd
Author: Campbell Barton
Date:   Tue Jul 25 19:59:38 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB50e88740c481a18bde50c710d0406d4d878d65cd

Fix PyManipulators having keymaps registered twice

Manipulators which are registered before UI initialized would have their
keymaps initalized twice (duplicate keymap items).

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

M	source/blender/windowmanager/manipulators/WM_manipulator_api.h
M	source/blender/windowmanager/manipulators/WM_manipulator_types.h
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_group_type.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c

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

diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index fbc4791ecd4..97d52556c9c 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -232,6 +232,9 @@ struct wmManipulatorGroupTypeRef *WM_manipulatormaptype_group_link_ptr(
         struct wmManipulatorMapType *mmap_type,
         struct wmManipulatorGroupType *wgt);
 
+void WM_manipulatormaptype_group_init_runtime_keymap(
+        const struct Main *bmain,
+        struct wmManipulatorGroupType *wgt);
 void WM_manipulatormaptype_group_init_runtime(
         const struct Main *bmain, struct wmManipulatorMapType *mmap_type,
         struct wmManipulatorGroupType *wgt);
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index b1b6c5b1c0f..e2d8346524f 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -327,6 +327,10 @@ enum eManipulatorMapTypeUpdateFlags {
 	/* A new type has been added, needs to be initialized for all views. */
 	WM_MANIPULATORMAPTYPE_UPDATE_INIT = (1 << 0),
 	WM_MANIPULATORMAPTYPE_UPDATE_REMOVE = (1 << 1),
+
+	/* Needed because keymap may be registered before and after window initialization.
+	 * So we need to keep track of keymap initialization separately. */
+	WM_MANIPULATORMAPTYPE_KEYMAP_INIT = (1 << 2),
 };
 
 /**
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
index c61392b500c..53b0561c127 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
@@ -567,13 +567,18 @@ wmManipulatorGroupTypeRef *WM_manipulatormaptype_group_link_ptr(
 	return wgt_ref;
 }
 
-void WM_manipulatormaptype_group_init_runtime(
-        const Main *bmain, wmManipulatorMapType *mmap_type,
+void WM_manipulatormaptype_group_init_runtime_keymap(
+        const Main *bmain,
         wmManipulatorGroupType *wgt)
 {
 	/* init keymap - on startup there's an extra call to init keymaps for 'permanent' manipulator-groups */
 	wm_manipulatorgrouptype_setup_keymap(wgt, ((wmWindowManager *)bmain->wm.first)->defaultconf);
+}
 
+void WM_manipulatormaptype_group_init_runtime(
+        const Main *bmain, wmManipulatorMapType *mmap_type,
+        wmManipulatorGroupType *wgt)
+{
 	/* now create a manipulator for all existing areas */
 	for (bScreen *sc = bmain->screen.first; sc; sc = sc->id.next) {
 		for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {
@@ -646,8 +651,13 @@ void WM_manipulatormaptype_group_unlink(
 void wm_manipulatorgrouptype_setup_keymap(
         wmManipulatorGroupType *wgt, wmKeyConfig *keyconf)
 {
-	wgt->keymap = wgt->setup_keymap(wgt, keyconf);
-	wgt->keyconf = keyconf;
+	/* Use flag since setup_keymap may return NULL,
+	 * in that case we better not keep calling it. */
+	if (wgt->type_update_flag & WM_MANIPULATORMAPTYPE_KEYMAP_INIT) {
+		wgt->keymap = wgt->setup_keymap(wgt, keyconf);
+		wgt->keyconf = keyconf;
+		wgt->type_update_flag &= ~WM_MANIPULATORMAPTYPE_KEYMAP_INIT;
+	}
 }
 
 /** \} */ /* wmManipulatorGroupType */
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group_type.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group_type.c
index c8da527e48f..534bcdbd7f0 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group_type.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group_type.c
@@ -83,6 +83,8 @@ static wmManipulatorGroupType *wm_manipulatorgrouptype_append__begin(void)
 {
 	wmManipulatorGroupType *wgt = MEM_callocN(sizeof(wmManipulatorGroupType), "manipulatorgrouptype");
 
+	wgt->type_update_flag |= WM_MANIPULATORMAPTYPE_KEYMAP_INIT;
+
 	return wgt;
 }
 static void wm_manipulatorgrouptype_append__end(wmManipulatorGroupType *wgt)
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
index aea989d2cac..6ef5e6df946 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
@@ -878,8 +878,8 @@ void WM_manipulatorconfig_update_tag_init(
         wmManipulatorMapType *mmap_type, wmManipulatorGroupType *wgt)
 {
 	/* tag for update on next use */
-	mmap_type->type_update_flag |= WM_MANIPULATORMAPTYPE_UPDATE_INIT;
-	wgt->type_update_flag |= WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+	mmap_type->type_update_flag |= (WM_MANIPULATORMAPTYPE_UPDATE_INIT | WM_MANIPULATORMAPTYPE_KEYMAP_INIT);
+	wgt->type_update_flag |= (WM_MANIPULATORMAPTYPE_UPDATE_INIT | WM_MANIPULATORMAPTYPE_KEYMAP_INIT);
 
 	wm_mmap_type_update_flag |= WM_MANIPULATORMAPTYPE_GLOBAL_UPDATE_INIT;
 }
@@ -931,14 +931,22 @@ void WM_manipulatorconfig_update(struct Main *bmain)
 		     mmap_type;
 		     mmap_type = mmap_type->next)
 		{
-			if (mmap_type->type_update_flag & WM_MANIPULATORMAPTYPE_UPDATE_INIT) {
-				mmap_type->type_update_flag &= ~WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+			const uchar type_update_all = WM_MANIPULATORMAPTYPE_UPDATE_INIT | WM_MANIPULATORMAPTYPE_KEYMAP_INIT;
+			if (mmap_type->type_update_flag & type_update_all) {
+				mmap_type->type_update_flag &= ~type_update_all;
 				for (wmManipulatorGroupTypeRef *wgt_ref = mmap_type->grouptype_refs.first;
 				     wgt_ref;
 				     wgt_ref = wgt_ref->next)
 				{
-					wgt_ref->type->type_update_flag &= ~WM_MANIPULATORMAPTYPE_UPDATE_INIT;
-					WM_manipulatormaptype_group_init_runtime(bmain, mmap_type, wgt_ref->type);
+					if (wgt_ref->type->type_update_flag & WM_MANIPULATORMAPTYPE_KEYMAP_INIT) {
+						wgt_ref->type->type_update_flag &= ~WM_MANIPULATORMAPTYPE_KEYMAP_INIT;
+						WM_manipulatormaptype_group_init_runtime_keymap(bmain, wgt_ref->type);
+					}
+
+					if (wgt_ref->type->type_update_flag & WM_MANIPULATORMAPTYPE_UPDATE_INIT) {
+						wgt_ref->type->type_update_flag &= ~WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+						WM_manipulatormaptype_group_init_runtime(bmain, mmap_type, wgt_ref->type);
+					}
 				}
 			}
 		}




More information about the Bf-blender-cvs mailing list