Commit: e9c022b7d358ababa30d85bcc0bc91f7d9d098aa
Author: Campbell Barton
Date:   Fri Jun 9 04:20:49 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rBe9c022b7d358ababa30d85bcc0bc91f7d9d098aa

Using default keymap now works for RNA manipulators

All widget groups must now define a name and idname.

Also fix crash where keymap's wouldnt be initialized for runtime
registered types.

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

M       source/blender/editors/space_image/space_image.c
M       source/blender/editors/space_node/node_widgets.c
M       source/blender/editors/space_view3d/view3d_manipulators.c
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/makesrna/intern/rna_wm_manipulator.c
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.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c

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

diff --git a/source/blender/editors/space_image/space_image.c 
b/source/blender/editors/space_image/space_image.c
index 6032b276a1b..af8ed40149f 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -592,6 +592,7 @@ static int image_context(const bContext *C, const char 
*member, bContextDataResu
 static void IMAGE_WGT_manipulator2d(wmManipulatorGroupType *wgt)
 {
        wgt->name = "UV Transform Manipulator";
+       wgt->idname = "IMAGE_WGT_manipulator2d";
 
        wgt->poll = WIDGETGROUP_manipulator2d_poll;
        wgt->init = WIDGETGROUP_manipulator2d_init;
diff --git a/source/blender/editors/space_node/node_widgets.c 
b/source/blender/editors/space_node/node_widgets.c
index 0862499e567..7c056e5592c 100644
--- a/source/blender/editors/space_node/node_widgets.c
+++ b/source/blender/editors/space_node/node_widgets.c
@@ -108,6 +108,7 @@ static void WIDGETGROUP_node_transform_refresh(const 
bContext *C, wmManipulatorG
 void NODE_WGT_backdrop_transform(wmManipulatorGroupType *wgt)
 {
        wgt->name = "Backdrop Transform Widgets";
+       wgt->idname = "NODE_WGT_backdrop_transform";
 
        wgt->poll = WIDGETGROUP_node_transform_poll;
        wgt->init = WIDGETGROUP_node_transform_init;
diff --git a/source/blender/editors/space_view3d/view3d_manipulators.c 
b/source/blender/editors/space_view3d/view3d_manipulators.c
index b249936f6fe..5f0379ded80 100644
--- a/source/blender/editors/space_view3d/view3d_manipulators.c
+++ b/source/blender/editors/space_view3d/view3d_manipulators.c
@@ -110,6 +110,7 @@ static void WIDGETGROUP_lamp_refresh(const bContext *C, 
wmManipulatorGroup *wgro
 void VIEW3D_WGT_lamp(wmManipulatorGroupType *wgt)
 {
        wgt->name = "Lamp Widgets";
+       wgt->idname = "VIEW3D_WGT_lamp";
 
        wgt->poll = WIDGETGROUP_lamp_poll;
        wgt->init = WIDGETGROUP_lamp_init;
@@ -281,6 +282,7 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, 
wmManipulatorGroup *wg
 void VIEW3D_WGT_camera(wmManipulatorGroupType *wgt)
 {
        wgt->name = "Camera Widgets";
+       wgt->idname = "VIEW3D_WGT_camera";
 
        wgt->poll = WIDGETGROUP_camera_poll;
        wgt->init = WIDGETGROUP_camera_init;
@@ -348,6 +350,7 @@ static void WIDGETGROUP_forcefield_refresh(const bContext 
*C, wmManipulatorGroup
 void VIEW3D_WGT_force_field(wmManipulatorGroupType *wgt)
 {
        wgt->name = "Force Field Widgets";
+       wgt->idname = "VIEW3D_WGT_force_field";
 
        wgt->poll = WIDGETGROUP_forcefield_poll;
        wgt->init = WIDGETGROUP_forcefield_init;
@@ -548,6 +551,7 @@ static void WIDGETGROUP_armature_facemaps_refresh(const 
bContext *C, wmManipulat
 void VIEW3D_WGT_armature_facemaps(wmManipulatorGroupType *wgt)
 {
        wgt->name = "Face Map Widgets";
+       wgt->idname = "VIEW3D_WGT_armature_facemaps";
 
        wgt->poll = WIDGETGROUP_armature_facemaps_poll;
        wgt->init = WIDGETGROUP_armature_facemaps_init;
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index 1309e5bcf42..149f5086846 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1343,6 +1343,7 @@ static bool WIDGETGROUP_manipulator_poll(const struct 
bContext *C, struct wmMani
 void TRANSFORM_WGT_manipulator(wmManipulatorGroupType *wgt)
 {
        wgt->name = "Transform Manipulator";
+       wgt->idname = "TRANSFORM_WGT_manipulator";
 
        wgt->poll = WIDGETGROUP_manipulator_poll;
        wgt->init = WIDGETGROUP_manipulator_init;
diff --git a/source/blender/makesrna/intern/rna_wm_manipulator.c 
b/source/blender/makesrna/intern/rna_wm_manipulator.c
index a0b19cf3c78..e054d4ab2b2 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator.c
@@ -280,9 +280,9 @@ static StructRNA *rna_Manipulator_register(
        if (validate(&mnp_ptr, data, have_function) != 0)
                return NULL;
 
-       if (strlen(identifier) >= MAX_NAME) {
+       if (strlen(identifier) >= sizeof(_manipulator_idname)) {
                BKE_reportf(reports, RPT_ERROR, "Registering manipulator class: 
'%s' is too long, maximum length is %d",
-                           identifier, MAX_NAME);
+                           identifier, (int)sizeof(_manipulator_idname));
                return NULL;
        }
 
@@ -402,12 +402,23 @@ static int rna_ManipulatorGroup_name_length(PointerRNA 
*ptr)
        (void)wgroup;
 }
 
+/* just to work around 'const char *' warning and to ensure this is a python 
op */
+static void rna_ManipulatorGroup_bl_idname_set(PointerRNA *ptr, const char 
*value)
+{
+       wmManipulatorGroup *data = ptr->data;
+       char *str = (char *)data->type->idname;
+       if (!str[0])
+               BLI_strncpy(str, value, MAX_NAME);    /* utf8 already ensured */
+       else
+               assert(!"setting the bl_idname on a non-builtin operator");
+}
+
 static void rna_ManipulatorGroup_bl_label_set(PointerRNA *ptr, const char 
*value)
 {
        wmManipulatorGroup *data = ptr->data;
-       const char *str = data->type->name;
-       if (!str)
-               str = value;
+       char *str = (char *)data->type->name;
+       if (!str[0])
+               BLI_strncpy(str, value, MAX_NAME);    /* utf8 already ensured */
        else
                assert(!"setting the bl_label on a non-builtin operator");
 }
@@ -492,6 +503,9 @@ static wmKeyMap *manipulatorgroup_keymap_init(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)
@@ -501,21 +515,22 @@ static StructRNA *rna_ManipulatorGroup_register(
        PointerRNA wgptr;
 
        /* Two sets of functions. */
-#define GROUP_FN_LEN 3
-#define MANIP_FN_LEN 7
-       int have_function[GROUP_FN_LEN + MANIP_FN_LEN];
+       int have_function[3];
 
        /* setup dummy manipulatorgroup & manipulatorgroup type to store static 
properties in */
        dummywg.type = &dummywgt;
+       dummywgt.name = _manipulatorgroup_name;
+       dummywgt.idname = _manipulatorgroup_idname;
+
        RNA_pointer_create(NULL, &RNA_ManipulatorGroup, &dummywg, &wgptr);
 
        /* validate the python class */
        if (validate(&wgptr, data, have_function) != 0)
                return NULL;
 
-       if (strlen(identifier) >= sizeof(dummywgt.idname)) {
+       if (strlen(identifier) >= sizeof(_manipulatorgroup_idname)) {
                BKE_reportf(reports, RPT_ERROR, "Registering manipulatorgroup 
class: '%s' is too long, maximum length is %d",
-                           identifier, (int)sizeof(dummywgt.idname));
+                           identifier, (int)sizeof(_manipulatorgroup_idname));
                return NULL;
        }
 
@@ -532,6 +547,19 @@ 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);
@@ -566,9 +594,6 @@ static StructRNA *rna_ManipulatorGroup_register(
        WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
 
        return dummywgt.ext.srna;
-
-#undef GROUP_FN_LEN
-#undef MANIP_FN_LEN
 }
 
 static void rna_ManipulatorGroup_unregister(struct Main *bmain, StructRNA 
*type)
@@ -821,13 +846,14 @@ static void rna_def_manipulatorgroup(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->idname");
-       /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
+       RNA_def_property_string_maxlength(prop, MAX_NAME);
+       RNA_def_property_string_funcs(prop, NULL, NULL, 
"rna_ManipulatorGroup_bl_idname_set");
        RNA_def_property_flag(prop, PROP_REGISTER);
        RNA_def_struct_name_property(srna, prop);
 
        prop = RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->name");
-       RNA_def_property_string_maxlength(prop, 64); /* else it uses the 
pointer size! */
+       RNA_def_property_string_maxlength(prop, MAX_NAME); /* else it uses the 
pointer size! */
        RNA_def_property_string_funcs(prop, NULL, NULL, 
"rna_ManipulatorGroup_bl_label_set");
        /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
        RNA_def_property_flag(prop, PROP_REGISTER);
@@ -864,8 +890,10 @@ static void rna_def_manipulatorgroup(BlenderRNA *brna)
 
        /* keymap_init */
        func = RNA_def_function(srna, "init_keymap", NULL);
-       RNA_def_function_ui_description(func, "Initialize keymaps for this 
manipulator group");
-       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER);
+       RNA_def_function_ui_description(
+               func,
+               "Initialize keymaps for this manipulator group, use fallback 
keymap when not present");
+       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
        parm = RNA_def_pointer(func, "keyconf", "KeyConfig", "", "");
        RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
        parm = RNA_def_property(func, "manipulator_group", PROP_STRING, 
PROP_NONE);
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h 
b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 07242306191..031d0eea148 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -113,6 +113,7 @@ struct wmManipulatorGroupType 
*WM_manipulatorgrouptype_append_ptr_runtime(
 void WM_manipulatorgrouptype_init_runtime(
         const struct Main *bmain, struct wmManipulatorMapType *mmaptype,
         struct wmManipulatorGroupType *wgt);
+void WM_manipulatorgrouptype_free(struct wmManipulatorGroupType *wgt);
 void WM_manipulatorgrouptype_remove_ptr(
         struct bContext *C, struct Main *bmain, struct wmManipulatorGroupType 
*mgroup);
 
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h 
b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 257e6133c57..033fe1b9773 100644
--- a/source/blender/windowmanager/manipulator

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to