Commit: 3e62e9101ca5d19c6a604e662f78f740a91bbf26
Author: Campbell Barton
Date:   Fri Jun 9 05:57:42 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rB3e62e9101ca5d19c6a604e662f78f740a91bbf26

Fix for manipulator identifier string duplication

Also no need for static buffers

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

M       source/blender/makesrna/intern/rna_wm_manipulator.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c

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

diff --git a/source/blender/makesrna/intern/rna_wm_manipulator.c 
b/source/blender/makesrna/intern/rna_wm_manipulator.c
index f2cab031504..d134f4cd7af 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator.c
@@ -255,12 +255,14 @@ static void rna_Manipulator_color_hi_set(PointerRNA *ptr, 
const float *values)
 static void rna_Manipulator_unregister(struct Main *bmain, StructRNA *type);
 void manipulator_wrapper(wmManipulatorType *wgt, void *userdata);
 
-static char _manipulator_idname[OP_MAX_TYPENAME];
-
 static StructRNA *rna_Manipulator_register(
         Main *bmain, ReportList *reports, void *data, const char *identifier,
         StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc 
free)
 {
+       struct {
+               char idname[MAX_NAME];
+       } temp_buffers;
+
        wmManipulatorType dummywt = {NULL};
        wmManipulator dummymnp = {NULL};
        PointerRNA mnp_ptr;
@@ -270,19 +272,19 @@ static StructRNA *rna_Manipulator_register(
 
        /* setup dummy manipulator & manipulator type to store static 
properties in */
        dummymnp.type = &dummywt;
-       dummywt.idname = _manipulator_idname;
+       dummywt.idname = temp_buffers.idname;
        RNA_pointer_create(NULL, &RNA_Manipulator, &dummymnp, &mnp_ptr);
 
-       /* clear in case they are left unset */
-       _manipulator_idname[0] = '\0';
+       /* Clear so we can detect if it's left unset. */
+       temp_buffers.idname[0] = '\0';
 
        /* validate the python class */
        if (validate(&mnp_ptr, data, have_function) != 0)
                return NULL;
 
-       if (strlen(identifier) >= sizeof(_manipulator_idname)) {
+       if (strlen(identifier) >= sizeof(temp_buffers.idname)) {
                BKE_reportf(reports, RPT_ERROR, "Registering manipulator class: 
'%s' is too long, maximum length is %d",
-                           identifier, (int)sizeof(_manipulator_idname));
+                           identifier, (int)sizeof(temp_buffers.idname));
                return NULL;
        }
 
@@ -317,10 +319,13 @@ static StructRNA *rna_Manipulator_register(
                BLI_assert(i == ARRAY_SIZE(have_function));
        }
 
-       WM_manipulatortype_append_ptr(manipulator_wrapper, (void *)&dummywt);
-
        RNA_def_struct_duplicate_pointers(dummywt.ext.srna);
 
+       /* use duplicated string */
+       dummywt.idname = dummywt.ext.srna->identifier;
+
+       WM_manipulatortype_append_ptr(manipulator_wrapper, (void *)&dummywt);
+
        /* update while blender is running */
        WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
 
@@ -431,7 +436,7 @@ static int rna_ManipulatorGroup_has_reports_get(PointerRNA 
*ptr)
 
 #ifdef WITH_PYTHON
 
-static bool manipulatorgroup_poll(const bContext *C, wmManipulatorGroupType 
*wgt)
+static bool rna_manipulatorgroup_poll_cb(const bContext *C, 
wmManipulatorGroupType *wgt)
 {
 
        extern FunctionRNA rna_ManipulatorGroup_poll_func;
@@ -457,7 +462,7 @@ static bool manipulatorgroup_poll(const bContext *C, 
wmManipulatorGroupType *wgt
        return visible;
 }
 
-static void manipulatorgroup_setup(const bContext *C, wmManipulatorGroup 
*wgroup)
+static void rna_manipulatorgroup_setup_cb(const bContext *C, 
wmManipulatorGroup *wgroup)
 {
        extern FunctionRNA rna_ManipulatorGroup_setup_func;
 
@@ -475,7 +480,7 @@ static void manipulatorgroup_setup(const bContext *C, 
wmManipulatorGroup *wgroup
        RNA_parameter_list_free(&list);
 }
 
-static wmKeyMap *manipulatorgroup_setup_keymap(const wmManipulatorGroupType 
*wgt, wmKeyConfig *config)
+static wmKeyMap *rna_manipulatorgroup_setup_keymap_cb(const 
wmManipulatorGroupType *wgt, wmKeyConfig *config)
 {
        extern FunctionRNA rna_ManipulatorGroup_setup_keymap_func;
        const char *wgroupname = wgt->name;
@@ -503,13 +508,15 @@ static wmKeyMap *manipulatorgroup_setup_keymap(const 
wmManipulatorGroupType *wgt
 
 void manipulatorgroup_wrapper(wmManipulatorGroupType *wgt, void *userdata);
 
-static char _manipulatorgroup_name[MAX_NAME];
-static char _manipulatorgroup_idname[MAX_NAME];
-
 static StructRNA *rna_ManipulatorGroup_register(
         Main *bmain, ReportList *reports, void *data, const char *identifier,
         StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc 
free)
 {
+       struct {
+               char name[MAX_NAME];
+               char idname[MAX_NAME];
+       } temp_buffers;
+
        wmManipulatorGroupType dummywgt = {NULL};
        wmManipulatorGroup dummywg = {NULL};
        PointerRNA wgptr;
@@ -519,18 +526,21 @@ static StructRNA *rna_ManipulatorGroup_register(
 
        /* setup dummy manipulatorgroup & manipulatorgroup type to store static 
properties in */
        dummywg.type = &dummywgt;
-       dummywgt.name = _manipulatorgroup_name;
-       dummywgt.idname = _manipulatorgroup_idname;
+       dummywgt.name = temp_buffers.name;
+       dummywgt.idname = temp_buffers.idname;
 
        RNA_pointer_create(NULL, &RNA_ManipulatorGroup, &dummywg, &wgptr);
 
+       /* Clear so we can detect if it's left unset. */
+       temp_buffers.idname[0] = temp_buffers.name[0] = '\0';
+
        /* validate the python class */
        if (validate(&wgptr, data, have_function) != 0)
                return NULL;
 
-       if (strlen(identifier) >= sizeof(_manipulatorgroup_idname)) {
+       if (strlen(identifier) >= sizeof(temp_buffers.idname)) {
                BKE_reportf(reports, RPT_ERROR, "Registering manipulatorgroup 
class: '%s' is too long, maximum length is %d",
-                           identifier, (int)sizeof(_manipulatorgroup_idname));
+                           identifier, (int)sizeof(temp_buffers.idname));
                return NULL;
        }
 
@@ -547,19 +557,6 @@ static StructRNA *rna_ManipulatorGroup_register(
                return NULL;
        }
 
-       {
-               int idlen = strlen(_manipulatorgroup_idname) + 1;
-               int namelen = strlen(_manipulatorgroup_name) + 1;
-
-               char *ch;
-               ch = MEM_callocN(sizeof(char) * (idlen + namelen), 
"_manipulatorgroup_idname");
-               dummywgt.idname = ch;
-               memcpy(ch, _manipulatorgroup_idname, idlen);
-               ch += idlen;
-               dummywgt.name = ch;
-               memcpy(ch, _manipulatorgroup_name, namelen);
-       }
-
        /* check if we have registered this manipulatorgroup type before, and 
remove it */
        {
                wmManipulatorGroupType *wgt = 
WM_manipulatorgrouptype_find(wmaptype, dummywgt.idname);
@@ -578,16 +575,18 @@ static StructRNA *rna_ManipulatorGroup_register(
 
        /* We used to register widget group types like this, now we do it 
similar to
         * operator types. Thus we should be able to do the same as operator 
types now. */
-       dummywgt.poll = (have_function[0]) ? manipulatorgroup_poll : NULL;
-       dummywgt.setup_keymap = (have_function[1]) ? 
manipulatorgroup_setup_keymap : NULL;
-       dummywgt.setup = (have_function[2]) ? manipulatorgroup_setup : NULL;
+       dummywgt.poll = (have_function[0]) ? rna_manipulatorgroup_poll_cb : 
NULL;
+       dummywgt.setup_keymap = (have_function[1]) ? 
rna_manipulatorgroup_setup_keymap_cb : NULL;
+       dummywgt.setup = (have_function[2]) ? rna_manipulatorgroup_setup_cb : 
NULL;
+
+       RNA_def_struct_duplicate_pointers(dummywgt.ext.srna);
+       dummywgt.idname = dummywgt.ext.srna->identifier;
+       dummywgt.name = dummywgt.ext.srna->name;
 
        WM_manipulatorgrouptype_append_ptr(wmaptype, manipulatorgroup_wrapper, 
(void *)&dummywgt);
 
        /* TODO: WM_manipulatorgrouptype_init_runtime */
 
-       RNA_def_struct_duplicate_pointers(dummywgt.ext.srna);
-
        /* update while blender is running */
        WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
 
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index d8d3669bceb..d54f0aec13b 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -630,11 +630,6 @@ void WM_manipulatorgrouptype_init_runtime(
  */
 void WM_manipulatorgrouptype_free(wmManipulatorGroupType *wgt)
 {
-       if (wgt->ext.srna) {
-               /* Python operator, allocs own string. */
-               MEM_freeN((void *)wgt->idname);
-       }
-
        MEM_freeN(wgt);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to