svn merge -r40034:40051 https://svn.blender.org/svnroot/bf-blender/trunk/blender
authorCampbell Barton <ideasman42@gmail.com>
Fri, 9 Sep 2011 02:29:44 +0000 (02:29 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 9 Sep 2011 02:29:44 +0000 (02:29 +0000)
23 files changed:
build_files/scons/config/linuxcross-config.py
doc/python_api/rst/info_best_practice.rst [new file with mode: 0644]
doc/python_api/rst/info_quickstart.rst
doc/python_api/rst/info_tips_and_tricks.rst
doc/python_api/sphinx_doc_gen.py
release/scripts/modules/bpy_types.py
release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/blenlib/BLI_utildefines.h
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_templates.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/modifiers/intern/MOD_weightvg_util.c
source/blender/modifiers/intern/MOD_weightvg_util.h
source/blender/modifiers/intern/MOD_weightvgedit.c
source/blender/modifiers/intern/MOD_weightvgmix.c
source/blender/modifiers/intern/MOD_weightvgproximity.c
source/blender/python/intern/bpy_rna.c
source/blender/windowmanager/intern/wm_keymap.c

index 1bdf735f4581d8276c5a2554b7b2593b04ca6643..8057d478c31acf9f9c26ee8f64c299afd33ad599 100644 (file)
@@ -127,6 +127,7 @@ WITH_BF_BINRELOC = False
 WITH_BF_FFMPEG = True  # -DWITH_FFMPEG
 BF_FFMPEG = LIBDIR + '/ffmpeg'
 BF_FFMPEG_LIB = 'avformat-53 avcodec-53 avdevice-53 avutil-51 swscale-2'
+BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll'
 BF_FFMPEG_INC = '${BF_FFMPEG}/include'
 BF_FFMPEG_LIBPATH = '${BF_FFMPEG}/lib'
 BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll'
diff --git a/doc/python_api/rst/info_best_practice.rst b/doc/python_api/rst/info_best_practice.rst
new file mode 100644 (file)
index 0000000..2fbc636
--- /dev/null
@@ -0,0 +1,65 @@
+*************
+Best Practice
+*************
+
+
+TODO: Intro text
+
+
+Style Conventions
+=================
+
+For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects.
+
+Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender.
+
+This style guide is known as pep8 and can be found `here <http://www.python.org/dev/peps/pep-0008>`_
+
+A brief listing of pep8 criteria.
+
+* camel caps for class names: MyClass
+
+* all lower case underscore separated module names: my_module
+
+* indentation of 4 spaces (no tabs)
+
+* spaces around operators. ``1 + 1``, not ``1+1``
+
+* only use explicit imports, (no importing '*')
+
+* don't use single line: ``if val: body``, separate onto 2 lines instead.
+
+
+As well as pep8 we have other conventions used for blender python scripts.
+
+* Use single quotes for enums, and double quotes for strings.
+
+  Both are of course strings but in our internal API enums are unique items from a limited set. eg.
+
+  .. code-block:: python
+
+     bpy.context.scene.render.file_format = 'PNG'
+     bpy.context.scene.render.filepath = "//render_out"
+
+* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
+
+Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script.
+
+``# <pep8 compliant>``
+
+To enable line length checks use this instead.
+
+``# <pep8-80 compliant>``
+
+
+User Interface Layout
+=====================
+
+TODO: Thomas
+
+
+Script Efficiency
+=================
+
+TODO: Campbell
+
index 751e5e1ec6191d47730620dcd5f1c0b2d9e6f2ca..e7f2900b212560ab9e79468132b736a2668be1f7 100644 (file)
@@ -420,49 +420,3 @@ Using Low-Level Functions:
    fcu_z.keyframe_points[0].co = 10.0, 0.0
    fcu_z.keyframe_points[1].co = 20.0, 1.0
 
-
-Style Conventions
-=================
-
-For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects.
-
-Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender.
-
-This style guide is known as pep8 and can be found `here <http://www.python.org/dev/peps/pep-0008>`_
-
-A brief listing of pep8 criteria.
-
-* camel caps for class names: MyClass
-
-* all lower case underscore separated module names: my_module
-
-* indentation of 4 spaces (no tabs)
-
-* spaces around operators. ``1 + 1``, not ``1+1``
-
-* only use explicit imports, (no importing '*')
-
-* don't use single line: ``if val: body``, separate onto 2 lines instead.
-
-
-As well as pep8 we have other conventions used for blender python scripts.
-
-* Use single quotes for enums, and double quotes for strings.
-
-  Both are of course strings but in our internal API enums are unique items from a limited set. eg.
-
-  .. code-block:: python
-
-     bpy.context.scene.render.file_format = 'PNG'
-     bpy.context.scene.render.filepath = "//render_out"
-
-* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
-
-Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script.
-
-``# <pep8 compliant>``
-
-To enable line length checks use this instead.
-
-``# <pep8-80 compliant>``
-
index 007665080569de400c7172c447491d187dd8d60a..bd3ed196193d36898a9ff675a260d6cb57fe6b02 100644 (file)
@@ -31,6 +31,7 @@ Blenders text editor is fine for small changes and writing tests but its not ful
 
 Editing a text file externally and having the same text open in blender does work but isn't that optimal so here are 2 ways you can easily use an external file from blender.
 
+Using the following examples you'll still need textblock in blender to execute, but reference an external file rather then including it directly.
 
 Executing External Scripts
 --------------------------
@@ -163,7 +164,7 @@ In the middle of a script you may want to inspect some variables, run some funct
 .. code-block:: python
 
    import code
-   code.interact(locals=locals())
+   code.interact(local=locals())
 
 
 If you want to access both global and local variables do this...
@@ -173,14 +174,14 @@ If you want to access both global and local variables do this...
    import code
    namespace = globals().copy()
    namespace.update(locals())
-   code.interact(locals=namespace)
+   code.interact(local=namespace)
 
 
 The next example is an equivalent single line version of the script above which is easier to paste into you're code:
 
 .. code-block:: python
 
-   __import__('code').interact(locals={k: v for ns in (globals(), locals()) for k, v in ns.items()})
+   __import__('code').interact(local={k: v for ns in (globals(), locals()) for k, v in ns.items()})
 
 
 `code.interact` can be added at any line in the script and will pause the script an launch an interactive interpreter in the terminal, when you're done you can quit the interpreter and the script will continue execution.
index a7657fad4322f3ee58ab345bb099744b103fc921..ac2a498efc2df2334aaae90ef350bcbaa5152dfb 100644 (file)
@@ -103,6 +103,7 @@ sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out
 INFO_DOCS = (
     ("info_quickstart.rst", "Blender/Python Quickstart: new to blender/scripting and want to get you're feet wet?"),
     ("info_overview.rst", "Blender/Python API Overview: a more complete explanation of python integration"),
+    ("info_best_practice.rst", "Best Practice: Conventions to follow for writing good scripts"),
     ("info_tips_and_tricks.rst", "Tips and Tricks: Hints to help you while writeing scripts for blender"),
     ("info_gotcha.rst", "Gotcha's: some of the problems you may come up against when writing scripts"),
     )
index 1446e45e5f0cfeed6c67cbf77dfcde108e8ad5ef..6ab2cfd25bc30457ff87a3bbf83beff8d892d7b3 100644 (file)
@@ -353,10 +353,7 @@ class Mesh(bpy_types.ID):
 
     @property
     def edge_keys(self):
-        return list({edge_key
-                     for face in self.faces
-                     for edge_key in face.edge_keys
-                     })
+        return [ed.key for ed in self.edges]
 
 
 class MeshEdge(StructRNA):
index c600debe93566b88390a872790919faa15397e5a..b49f9adc4cf501ad0c09805fefd83ab08229c332 100644 (file)
@@ -612,32 +612,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         layout.label(text="Settings can be found inside the Physics context")
 
     def UV_PROJECT(self, layout, ob, md):
-        if ob.type == 'MESH':
-            split = layout.split()
+        split = layout.split()
 
-            col = split.column()
-            col.label(text="Image:")
-            col.prop(md, "image", text="")
+        col = split.column()
+        col.label(text="Image:")
+        col.prop(md, "image", text="")
 
-            col = split.column()
-            col.label(text="UV Layer:")
-            col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
+        col = split.column()
+        col.label(text="UV Layer:")
+        col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
 
-            split = layout.split()
-            col = split.column()
-            col.prop(md, "use_image_override")
-            col.prop(md, "projector_count", text="Projectors")
-            for proj in md.projectors:
-                col.prop(proj, "object", text="")
+        split = layout.split()
+        col = split.column()
+        col.prop(md, "use_image_override")
+        col.prop(md, "projector_count", text="Projectors")
+        for proj in md.projectors:
+            col.prop(proj, "object", text="")
 
-            col = split.column()
-            sub = col.column(align=True)
-            sub.prop(md, "aspect_x", text="Aspect X")
-            sub.prop(md, "aspect_y", text="Aspect Y")
+        col = split.column()
+        sub = col.column(align=True)
+        sub.prop(md, "aspect_x", text="Aspect X")
+        sub.prop(md, "aspect_y", text="Aspect Y")
 
-            sub = col.column(align=True)
-            sub.prop(md, "scale_x", text="Scale X")
-            sub.prop(md, "scale_y", text="Scale Y")
+        sub = col.column(align=True)
+        sub.prop(md, "scale_x", text="Scale X")
+        sub.prop(md, "scale_y", text="Scale Y")
 
     def WARP(self, layout, ob, md):
         use_falloff = (md.falloff_type != 'NONE')
@@ -744,7 +743,6 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
     @staticmethod
     def vertex_weight_mask(layout, ob, md):
         layout.label(text="Influence/Mask Options:")
-        row = layout.row()
 
         split = layout.split(percentage=0.4)
         split.label(text="Global Influence:")
@@ -761,9 +759,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             split.template_ID(md, "mask_texture", new="texture.new")
             if md.mask_texture:
                 split = layout.split()
+                
                 col = split.column()
                 col.label(text="Texture Coordinates:")
                 col.prop(md, "mask_tex_mapping", text="")
+                
                 col = split.column()
                 col.label(text="Use Channel:")
                 col.prop(md, "mask_tex_use_channel", text="")
@@ -774,88 +774,85 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
                     layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
 
     def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
-        if ob.type == 'MESH':
-            split = layout.split()
-            col = split.column()
-            col.label(text="Vertex Group:")
-            col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        split = layout.split()
+        col = split.column()
+        col.label(text="Vertex Group:")
+        col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
 
-            col = split.column()
-            col.label(text="Default Weight:")
-            col.prop(md, "default_weight", text="")
+        col = split.column()
+        col.label(text="Default Weight:")
+        col.prop(md, "default_weight", text="")
 
-            layout.prop(md, "falloff_type")
-            if md.falloff_type == 'CURVE':
-                col = layout.column()
-                col.template_curve_mapping(md, "map_curve")
+        layout.prop(md, "falloff_type")
+        if md.falloff_type == 'CURVE':
+            col = layout.column()
+            col.template_curve_mapping(md, "map_curve")
 
-            split = layout.split(percentage=0.4)
-            split.prop(md, "use_add")
-            row = split.row()
-            row.active = md.use_add
-            row.prop(md, "add_threshold")
+        split = layout.split(percentage=0.4)
+        split.prop(md, "use_add")
+        row = split.row()
+        row.active = md.use_add
+        row.prop(md, "add_threshold")
 
-            split = layout.split(percentage=0.4)
-            split.prop(md, "use_remove")
-            row = split.row()
-            row.active = md.use_remove
-            row.prop(md, "remove_threshold")
+        split = layout.split(percentage=0.4)
+        split.prop(md, "use_remove")
+        row = split.row()
+        row.active = md.use_remove
+        row.prop(md, "remove_threshold")
 
-            # Common mask options…
-            layout.separator()
-            self.vertex_weight_mask(layout, ob, md)
+        # Common mask options
+        layout.separator()
+        self.vertex_weight_mask(layout, ob, md)
 
     def VERTEX_WEIGHT_MIX(self, layout, ob, md):
-        if ob.type == 'MESH':
-            split = layout.split()
-            col = split.column()
-            col.label(text="Vertex Group A:")
-            col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
-            col.label(text="Default Weight A:")
-            col.prop(md, "default_weight_a", text="")
+        split = layout.split()
+        
+        col = split.column()
+        col.label(text="Vertex Group A:")
+        col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
+        col.label(text="Default Weight A:")
+        col.prop(md, "default_weight_a", text="")
 
-            col.label(text="Mix Mode:")
-            col.prop(md, "mix_mode", text="")
+        col.label(text="Mix Mode:")
+        col.prop(md, "mix_mode", text="")
 
-            col = split.column()
-            col.label(text="Vertex Group B:")
-            col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
-            col.label(text="Default Weight B:")
-            col.prop(md, "default_weight_b", text="")
+        col = split.column()
+        col.label(text="Vertex Group B:")
+        col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
+        col.label(text="Default Weight B:")
+        col.prop(md, "default_weight_b", text="")
 
-            col.label(text="Mix Set:")
-            col.prop(md, "mix_set", text="")
+        col.label(text="Mix Set:")
+        col.prop(md, "mix_set", text="")
 
-            # Common mask options…
-            layout.separator()
-            self.vertex_weight_mask(layout, ob, md)
+        # Common mask options
+        layout.separator()
+        self.vertex_weight_mask(layout, ob, md)
 
     def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
-        if ob.type == 'MESH':
-            split = layout.split()
-            col = split.column()
-            col.label(text="Vertex Group:")
-            col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        split = layout.split()
+        
+        col = split.column()
+        col.label(text="Vertex Group:")
+        col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
 
-            col = split.column()
-            col.label(text="Target Object:")
-            col.prop(md, "target", text="")
+        col = split.column()
+        col.label(text="Target Object:")
+        col.prop(md, "target", text="")
 
-            row = layout.row()
-            row.prop(md, "proximity_mode", expand=True)
-            if md.proximity_mode == 'GEOMETRY':
-                row = layout.row()
-                row.prop(md, "proximity_geometry", expand=True)
+        layout.row().prop(md, "proximity_mode", expand=True)
+        if md.proximity_mode == 'GEOMETRY':
+            layout.row().prop(md, "proximity_geometry", expand=True)
 
-            row = layout.split()
-            row.prop(md, "min_dist")
-            row.prop(md, "max_dist")
+        row = layout.row()
+        row.prop(md, "min_dist")
+        row.prop(md, "max_dist")
 
-            layout.prop(md, "falloff_type")
+        layout.prop(md, "falloff_type")
 
-            # Common mask options…
-            layout.separator()
-            self.vertex_weight_mask(layout, ob, md)
+        # Common mask options
+        layout.separator()
+        self.vertex_weight_mask(layout, ob, md)
 
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
index 985400493eec5660f06d82e987d11040bfbe1379..2e420414fcd17d4b7f96a43d0bf1b9c4c3879e0b 100644 (file)
 /* useful for debugging */
 #define AT __FILE__ ":" STRINGIFY(__LINE__)
 
+/* so we can use __func__ everywhere */
+#if defined(_MSC_VER)
+#  define __func__ __FUNCTION__
+#endif
+
+
 /* UNUSED macro, for function argument */
 #ifdef __GNUC__
 #  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
index 803da55cea6b1a9f46b6caf8e331ab5176a49f7f..3e3e6da188e52bc9cf2b4c0511955286af61c6ca 100644 (file)
@@ -630,7 +630,7 @@ PointerRNA uiItemFullO(uiLayout *layout, const char *opname, const char *name, i
 
        if(!ot) {
                ui_item_disabled(layout, opname);
-               RNA_warning("uiItemFullO: unknown operator '%s'\n", opname);
+               RNA_warning("unknown operator '%s'", opname);
                return PointerRNA_NULL;
        }
 
@@ -737,7 +737,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
 
        if(!ot || !ot->srna) {
                ui_item_disabled(layout, opname);
-               RNA_warning("uiItemsFullEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", opname);
+               RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname);
                return;
        }
 
@@ -815,7 +815,7 @@ void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char
                /* pass */
        }
        else {
-               RNA_warning("uiItemEnumO_value: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+               RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname);
                return;
        }
 
@@ -844,7 +844,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
                RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free);
                if(item==NULL || RNA_enum_value_from_id(item, value_str, &value)==0) {
                        if(free) MEM_freeN(item);
-                       RNA_warning("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str);
+                       RNA_warning("%s.%s, enum %s not found.", RNA_struct_identifier(ptr.type), propname, value_str);
                        return;
                }
 
@@ -852,7 +852,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
                        MEM_freeN(item);
        }
        else {
-               RNA_warning("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+               RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname);
                return;
        }
        
@@ -1059,7 +1059,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag,
 
        if(!prop) {
                ui_item_disabled(layout, propname);
-               RNA_warning("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -1072,7 +1072,7 @@ void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA
 
        if(!prop || RNA_property_type(prop) != PROP_ENUM) {
                ui_item_disabled(layout, propname);
-               RNA_warning("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -1087,7 +1087,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
 
        if(!prop || RNA_property_type(prop) != PROP_ENUM) {
                ui_item_disabled(layout, propname);
-               RNA_warning("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -1096,7 +1096,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
        if(!RNA_enum_value_from_id(item, value, &ivalue)) {
                if(free) MEM_freeN(item);
                ui_item_disabled(layout, propname);
-               RNA_warning("uiItemEnumR: enum property value not found: %s\n", value);
+               RNA_warning("enum property value not found: %s", value);
                return;
        }
 
@@ -1121,12 +1121,12 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
 
        if(!prop) {
                ui_item_disabled(layout, propname);
-               RNA_warning("uiItemsEnumR: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        if(RNA_property_type(prop) != PROP_ENUM) {
-               RNA_warning("uiItemsEnumR: not an enum property: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("not an enum property: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
        else {
@@ -1314,13 +1314,13 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
        prop= RNA_struct_find_property(ptr, propname);
 
        if(!prop) {
-               RNA_warning("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
        
        type= RNA_property_type(prop);
        if(!ELEM(type, PROP_POINTER, PROP_STRING)) {
-               RNA_warning("uiItemPointerR: property %s must be a pointer or string.\n", propname);
+               RNA_warning("property %s must be a pointer or string.", propname);
                return;
        }
 
@@ -1328,11 +1328,11 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
 
 
        if(!searchprop) {
-               RNA_warning("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+               RNA_warning("search collection property not found: %s.%s", RNA_struct_identifier(ptr->type), searchpropname);
                return;
        }
        else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
-               RNA_warning("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+               RNA_warning("search collection property is not a collection type: %s.%s", RNA_struct_identifier(ptr->type), searchpropname);
                return;
        }
 
@@ -1417,7 +1417,7 @@ void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const
        mt= WM_menutype_find(menuname, FALSE);
 
        if(mt==NULL) {
-               RNA_warning("uiItemM: not found %s\n", menuname);
+               RNA_warning("not found %s", menuname);
                return;
        }
 
@@ -1537,12 +1537,12 @@ void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname,
 
        if(!ot) {
                ui_item_disabled(layout, opname);
-               RNA_warning("uiItemMenuEnumO: unknown operator '%s'\n", opname);
+               RNA_warning("unknown operator '%s'", opname);
                return;
        }
        if(!ot->srna) {
                ui_item_disabled(layout, opname);
-               RNA_warning("uiItemMenuEnumO: operator missing srna '%s'\n", opname);
+               RNA_warning("operator missing srna '%s'", opname);
                return;
        }
 
@@ -1575,7 +1575,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn
        prop= RNA_struct_find_property(ptr, propname);
        if(!prop) {
                ui_item_disabled(layout, propname);
-               RNA_warning("uiItemMenuEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
index d2cee11c755db6874d0267501a4ad4769cdf8866..8c151712f959f3792ed169c601f2208c58d89fce 100644 (file)
@@ -245,7 +245,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
        switch(event) {
                case UI_ID_BROWSE:
                case UI_ID_PIN:
-                       RNA_warning("warning, id event %d shouldnt come here\n", event);
+                       RNA_warning("warning, id event %d shouldnt come here", event);
                        break;
                case UI_ID_OPEN:
                case UI_ID_ADD_NEW:
@@ -488,7 +488,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const
        prop= RNA_struct_find_property(ptr, propname);
 
        if(!prop || RNA_property_type(prop) != PROP_POINTER) {
-               RNA_warning("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -549,11 +549,11 @@ void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, co
        propType= RNA_struct_find_property(ptr, proptypename);
 
        if (!propID || RNA_property_type(propID) != PROP_POINTER) {
-               RNA_warning("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
        if (!propType || RNA_property_type(propType) != PROP_ENUM) { 
-               RNA_warning("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename);
+               RNA_warning("pointer-type property not found: %s.%s", RNA_struct_identifier(ptr->type), proptypename);
                return;
        }
        
@@ -592,7 +592,7 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propna
        /* check that properties are valid */
        propPath= RNA_struct_find_property(ptr, propname);
        if (!propPath || RNA_property_type(propPath) != PROP_STRING) {
-               RNA_warning("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
        
@@ -855,7 +855,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
 
        /* verify we have valid data */
        if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
-               RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
+               RNA_warning("Expected modifier on object.");
                return NULL;
        }
 
@@ -863,7 +863,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
        md= ptr->data;
 
        if(!ob || !(GS(ob->id.name) == ID_OB)) {
-               RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
+               RNA_warning("expected modifier on object.");
                return NULL;
        }
        
@@ -1084,7 +1084,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
 
        /* verify we have valid data */
        if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
-               RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
+               RNA_warning("Expected constraint on object.");
                return NULL;
        }
 
@@ -1092,7 +1092,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
        con= ptr->data;
 
        if(!ob || !(GS(ob->id.name) == ID_OB)) {
-               RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
+               RNA_warning("Expected constraint on object.");
                return NULL;
        }
        
@@ -1138,7 +1138,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
        PointerRNA texture_ptr;
 
        if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
-               RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
+               RNA_warning("expected ID of type material, texture, lamp or world.");
                return;
        }
 
@@ -1844,12 +1844,14 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propn
        PointerRNA cptr;
 
        if(!prop) {
-               RNA_warning("uiTemplateCurveMapping: curve property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("curve property not found: %s.%s",
+                           RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        if(RNA_property_type(prop) != PROP_POINTER) {
-               RNA_warning("uiTemplateCurveMapping: curve is not a pointer: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("curve is not a pointer: %s.%s",
+                           RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -1879,7 +1881,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propnam
        float softmin, softmax, step, precision;
        
        if (!prop) {
-               RNA_warning("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -1949,7 +1951,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
 
        prop= RNA_struct_find_property(ptr, propname);
        if (!prop) {
-               RNA_warning("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("layers property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
        
@@ -1966,7 +1968,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
        if(used_ptr && used_propname) {
                used_prop= RNA_struct_find_property(used_ptr, used_propname);
                if (!used_prop) {
-                       RNA_warning("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname);
+                       RNA_warning("used layers property not found: %s.%s", RNA_struct_identifier(ptr->type), used_propname);
                        return;
                }
 
@@ -2157,7 +2159,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
        pa= block->panel;
 
        if(!pa) {
-               RNA_warning("uiTemplateList: only works inside a panel.\n");
+               RNA_warning("only works inside a panel.");
                return;
        }
 
@@ -2167,28 +2169,28 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
        if(ptr->data) {
                prop= RNA_struct_find_property(ptr, propname);
                if(!prop) {
-                       RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+                       RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                        return;
                }
        }
 
        activeprop= RNA_struct_find_property(activeptr, activepropname);
        if(!activeprop) {
-               RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), activepropname);
                return;
        }
 
        if(prop) {
                type= RNA_property_type(prop);
                if(type != PROP_COLLECTION) {
-                       RNA_warning("uiTemplateList: Expected collection property.\n");
+                       RNA_warning("uiExpected collection property.");
                        return;
                }
        }
 
        activetype= RNA_property_type(activeprop);
        if(activetype != PROP_INT) {
-               RNA_warning("uiTemplateList: Expected integer property.\n");
+               RNA_warning("expected integer property.");
                return;
        }
 
index 5d75f8215acaf432bedc79a47b3377fc1eda13f9..2a4eb3d4045827c9fa481ceb31d98526c90e42df 100644 (file)
@@ -824,7 +824,7 @@ typedef struct WeightVGEditModifierData {
        int             mask_tex_mapping;
        char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
 
-       /* Padding */
+       /* Padding... */
        int pad_i1;
 } WeightVGEditModifierData;
 
@@ -869,7 +869,7 @@ typedef struct WeightVGMixModifierData {
        int             mask_tex_mapping;          /* How to map the texture! */
        char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
 
-       /* Padding */
+       /* Padding... */
        int pad_i1;
 } WeightVGMixModifierData;
 
index e80e33e78392b9a957b32750da7dbb1cd0b9b26b..f2f2426e5312c86cd4e85983e6d97167895983e3 100644 (file)
@@ -976,7 +976,11 @@ int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *re
 short RNA_type_to_ID_code(StructRNA *type);
 StructRNA *ID_code_to_RNA_type(short idcode);
 
-void RNA_warning(const char *format, ...)
+
+/* macro which inserts the function name */
+#define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args)
+
+void _RNA_warning(const char *format, ...)
 #ifdef __GNUC__
 __attribute__ ((format (printf, 1, 2)))
 #endif
index e7d0c5cdec2449267352fca0a884e7e420fc34a4..ea23fea0c2c64b35262dca89f1f392db69849798 100644 (file)
@@ -5374,7 +5374,8 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i
        return 0;
 }
 
-void RNA_warning(const char *format, ...)
+/* use RNA_warning macro which includes __func__ suffix */
+void _RNA_warning(const char *format, ...)
 {
        va_list args;
 
index bfe2c7ffaac94eb1158a7e4cde4475878082b441..ef67b0e684e3bd0fe04a22b20ab1b61ca33dc6b5 100644 (file)
@@ -68,6 +68,7 @@ EnumPropertyItem modifier_type_items[] ={
        {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
        {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
        {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
+       {0, "", 0, "Modify", ""},
        {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
        {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""},
        {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""},
index d4ac98802905fe104d89aff712cc7c4da5249fbd..92c93f41dfc6129e95e22538eda19c7cbeca5199 100644 (file)
@@ -46,7 +46,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname,
        int flag= 0;
 
        if(!prop) {
-               RNA_warning("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
index 66c4e7245c4657e3eecbe5df4445789104d8d2f5..4bc828cdc4f305f79e7ba15b8b95145bcea2a16c 100644 (file)
@@ -1959,6 +1959,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
 {
        StructRNA *srna;
        PropertyRNA *prop;
+       static float default_dir[3] = {0.f, 1.f, 0.f};
 
        srna= RNA_def_struct(brna, "UserSolidLight", NULL);
        RNA_def_struct_sdna(srna, "SolidLight");
@@ -1972,6 +1973,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
        prop= RNA_def_property(srna, "direction", PROP_FLOAT, PROP_DIRECTION);
        RNA_def_property_float_sdna(prop, NULL, "vec");
        RNA_def_property_array(prop, 3);
+       RNA_def_property_float_array_default(prop, default_dir);
        RNA_def_property_ui_text(prop, "Direction", "The direction that the OpenGL light is shining");
        RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update");
 
index 51465cc80b09e90335ac3f713fec1322162a3c47..98615c705531b5f5c1873c9be6424e2202a2e556 100644 (file)
@@ -135,7 +135,7 @@ void weightvg_do_mask(int num, const int *indices, float *org_w, const float *ne
                MappingInfoModifierData t_map;
                float (*v_co)[3];
 
-               /* Use new generic get_texture_coords, but do not modify our DNA struct for it
+               /* Use new generic get_texture_coords, but do not modify our DNA struct for it...
                 * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ?
                 *     What e.g. if a modifier wants to use several textures ?
                 *     Why use only v_co, and not MVert (or both) ?
index 00c63a3d5d5c83eb3ef6cd03987e447abdf38bce..ce3520f19000ad2162bd73ac4513f14b5ec98bfc 100644 (file)
@@ -44,7 +44,7 @@ struct Tex;
 
 /*
  * XXX I'd like to make modified weights visible in WeightPaint mode,
- *     but couldn't figure a way to do this
+ *     but couldn't figure a way to do this...
  *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
  *     Or the WeightPaint mode code itself?
  */
@@ -53,7 +53,7 @@ struct Tex;
  * Util functions.                    *
  **************************************/
 
-/* We cannot divide by zero (what a surprise).
+/* We cannot divide by zero (what a surprise...).
  * So if -MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR < weightf < MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR,
  * we clamp weightf to this value (or its negative version).
  * Also used to avoid null power factor.
index b8bbf2a4b6c98bfec6b0b49f4b27288d675afe91..fffb3c6de2f41f25d6d5b4b3fd0aa3ed8a36a718 100644 (file)
@@ -28,7 +28,7 @@
 
 /*
  * XXX I'd like to make modified weights visible in WeightPaint mode,
- *     but couldn't figure a way to do this
+ *     but couldn't figure a way to do this...
  *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
  *     Or the WeightPaint mode code itself?
  */
@@ -211,13 +211,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        if (defgrp_idx < 0)
                return dm;
 
-       /* XXX All this to avoid copying dm when not needed However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file
+       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+        *     time! See scene 5 of the WeighVG test file...
         */
 #if 0
        /* Get actual dverts (ie vertex group data). */
        dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data */
+       /* If no dverts, return unmodified data... */
        if (dvert == NULL)
                return dm;
 
@@ -231,7 +231,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
        if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
                /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess
+                *     I'm missing something here, I guess...
                 */
 //             DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
                ret = CDDM_copy(dm);
index 8139adc5910245402aa5ef800cf19ecc5fc9d58e..8093683a098ef4a8d7d8459a29180e654444e8a8 100644 (file)
@@ -28,7 +28,7 @@
 
 /*
  * XXX I'd like to make modified weights visible in WeightPaint mode,
- *     but couldn't figure a way to do this
+ *     but couldn't figure a way to do this...
  *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
  *     Or the WeightPaint mode code itself?
  */
@@ -62,7 +62,7 @@ static float mix_weight(float weight, float weight2, char mix_mode)
 #if 0
        /*
         * XXX Don't know why, but the switch version takes many CPU time,
-        *     and produces lag in realtime playback
+        *     and produces lag in realtime playback...
         */
        switch (mix_mode)
        {
@@ -258,13 +258,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                        return dm;
        }
 
-       /* XXX All this to avoid copying dm when not needed However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file
+       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+        *     time! See scene 5 of the WeighVG test file...
         */
 #if 0
        /* Get actual dverts (ie vertex group data). */
        dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data */
+       /* If no dverts, return unmodified data... */
        if (dvert == NULL)
                return dm;
 
@@ -278,7 +278,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
        if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
                /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess
+                *     I'm missing something here, I guess...
                 */
 //             DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
                ret = CDDM_copy(dm);
index b0be02c5b2777f32b5ce66e0521de698f1a8d73e..717f2b7001b9ce2ceeb9ed4373bd55213af0d2ff 100644 (file)
@@ -28,7 +28,7 @@
 
 /*
  * XXX I'd like to make modified weights visible in WeightPaint mode,
- *     but couldn't figure a way to do this
+ *     but couldn't figure a way to do this...
  *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
  *     Or the WeightPaint mode code itself?
  */
@@ -385,13 +385,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        if (defgrp_idx < 0)
                return dm;
 
-       /* XXX All this to avoid copying dm when not needed However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file
+       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+        *     time! See scene 5 of the WeighVG test file...
         */
 #if 0
        /* Get actual dverts (ie vertex group data). */
        dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data */
+       /* If no dverts, return unmodified data... */
        if (dvert == NULL)
                return dm;
 
@@ -405,7 +405,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
        if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
                /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess
+                *     I'm missing something here, I guess...
                 */
 //             DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
                ret = CDDM_copy(dm);
index 2212499d842e439bb7ee4fa322d15a161ce18416..4c382efdda36a15d8d0bcb0ec4e070048967cb3c 100644 (file)
@@ -5443,7 +5443,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
                if(bpy_types==NULL) {
                        PyErr_Print();
                        PyErr_Clear();
-                       fprintf(stderr, "pyrna_srna_ExternalType: failed to find 'bpy_types' module\n");
+                       fprintf(stderr, "%s: failed to find 'bpy_types' module\n", __func__);
                        return NULL;
                }
                bpy_types_dict= PyModule_GetDict(bpy_types); // borrow
@@ -5457,18 +5457,18 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
                PyObject *base_compare= pyrna_srna_PyBase(srna);
                //PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
                //PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
-               PyObject *bases= ((PyTypeObject *)newclass)->tp_bases;
-               PyObject *slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
+               PyObject *tp_bases= ((PyTypeObject *)newclass)->tp_bases;
+               PyObject *tp_slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
 
-               if(slots==NULL) {
-                       fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname);
+               if(tp_slots==NULL) {
+                       fprintf(stderr, "%s: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", __func__, idname);
                        newclass= NULL;
                }
-               else if(PyTuple_GET_SIZE(bases)) {
-                       PyObject *base= PyTuple_GET_ITEM(bases, 0);
+               else if(PyTuple_GET_SIZE(tp_bases)) {
+                       PyObject *base= PyTuple_GET_ITEM(tp_bases, 0);
 
                        if(base_compare != base) {
-                               fprintf(stderr, "pyrna_srna_ExternalType: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", idname);
+                               fprintf(stderr, "%s: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", __func__, idname);
                                PyC_ObSpit("Expected! ", base_compare);
                                newclass= NULL;
                        }
@@ -5538,7 +5538,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
                }
                else {
                        /* this should not happen */
-                       printf("Error registering '%s'\n", idname);
+                       printf("%s: error registering '%s'\n", __func__, idname);
                        PyErr_Print();
                        PyErr_Clear();
                }
@@ -5581,7 +5581,7 @@ PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr)
                        Py_DECREF(tp); /* srna owns, cant hold a ref */
                }
                else {
-                       fprintf(stderr, "Could not make type\n");
+                       fprintf(stderr, "%s: could not make type\n", __func__);
                        pyrna= (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type);
 #ifdef USE_WEAKREFS
                        pyrna->in_weakreflist= NULL;
@@ -6231,10 +6231,10 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
 #endif
 
        py_class= RNA_struct_py_type_get(ptr->type);
-
        /* rare case. can happen when registering subclasses */
        if(py_class==NULL) {
-               fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type));
+               fprintf(stderr, "%s: unable to get python class for rna struct '%.200s'\n",
+                       __func__, RNA_struct_identifier(ptr->type));
                return -1;
        }
 
index 0e94ad72d350ea2d22898be8bd37022df3d418a3..854fa688ea4d9b108da23f340f4764abe3a6071d 100644 (file)
@@ -47,6 +47,7 @@
 #include "BKE_blender.h"
 #include "BKE_context.h"
 #include "BKE_idprop.h"
+#include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_screen.h"
@@ -680,6 +681,17 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPrope
        wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0);
        km->flag |= KEYMAP_MODAL;
        km->modal_items= items;
+
+       if(!items) {
+               /* init modal items from default config */
+               wmWindowManager *wm = G.main->wm.first;
+               wmKeyMap *defaultkm= WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0);
+
+               if(defaultkm) {
+                       km->modal_items = defaultkm->modal_items;
+                       km->poll = defaultkm->poll;
+               }
+       }
        
        return km;
 }