2.5
authorTon Roosendaal <ton@blender.org>
Sun, 14 Dec 2008 10:08:00 +0000 (10:08 +0000)
committerTon Roosendaal <ton@blender.org>
Sun, 14 Dec 2008 10:08:00 +0000 (10:08 +0000)
Added freeing functions in outliner space, this makes blender quit
without memory free errors in my test .b.blends.

Note: I'll move current rna viewer to new SpaceData editor, then I
can bring back original outliner stuff. Proposed menu name is
"Data Viewer". Probably better not not expose name 'rna' in UI?

source/blender/blenloader/intern/readfile.c
source/blender/editors/space_outliner/outliner_intern.h
source/blender/editors/space_outliner/space_outliner.c

index 93cacaf61a1a108a309d2327d6d70cf43c7da06a..d62c4e6253529287ac261ec9c6713e4dcbe63973 100644 (file)
@@ -4510,8 +4510,17 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
        allocname= dataname(GS(id->name));
        
                /* read all data */
+       
        while(bhead && bhead->code==DATA) {
-               void *data= read_struct(fd, bhead, allocname);
+               void *data;
+               /* XXX BAD DEBUGGING OPTION TO GIVE NAMES */            
+               short *sp= fd->filesdna->structs[bhead->SDNAnr];
+               char *allocname = fd->filesdna->types[ sp[0] ];
+               char *tmp= malloc(100);
+               
+               strcpy(tmp, allocname);
+               
+               data= read_struct(fd, bhead, tmp);
 
                if (data) {
                        oldnewmap_insert(fd->datamap, bhead->old, data, 0);
index dcc81ad5f9d4df4ed23b0552fa2b6d014a5fb1cc..50c5156f4dfa527b898056ef3dabcc842c196205 100644 (file)
 
 struct wmWindowManager;
 
+struct TreeStoreElem;
+
+typedef struct TreeElement {
+       struct TreeElement *next, *prev, *parent;
+       ListBase subtree;
+       float xs, ys;           // do selection
+       int store_index;        // offset in tree store
+       short flag, index;      // flag for non-saved stuff, index for data arrays
+       short idcode;           // from TreeStore id
+       short xend;                     // width of item display, for select
+       char *name;
+       void *directdata;       // Armature Bones, Base, Sequence, Strip...
+}  TreeElement;
+
+/* TreeElement->flag */
+#define TE_ACTIVE      1
+#define TE_ICONROW     2
+
+/* TreeStoreElem types */
+#define TSE_NLA                                1
+#define TSE_NLA_ACTION         2
+#define TSE_DEFGROUP_BASE      3
+#define TSE_DEFGROUP           4
+#define TSE_BONE                       5
+#define TSE_EBONE                      6
+#define TSE_CONSTRAINT_BASE    7
+#define TSE_CONSTRAINT         8
+#define TSE_MODIFIER_BASE      9
+#define TSE_MODIFIER           10
+#define TSE_LINKED_OB          11
+#define TSE_SCRIPT_BASE                12
+#define TSE_POSE_BASE          13
+#define TSE_POSE_CHANNEL       14
+/*#ifdef WITH_VERSE*/
+#define TSE_VERSE_SESSION      15
+#define TSE_VERSE_OBJ_NODE     16
+#define TSE_VERSE_GEOM_NODE    17
+/*#endif*/
+#define TSE_PROXY                      18
+#define TSE_R_LAYER_BASE       19
+#define TSE_R_LAYER                    20
+#define TSE_R_PASS                     21
+#define TSE_LINKED_MAT         22
+/* NOTE, is used for light group */
+#define TSE_LINKED_LAMP                23
+#define TSE_POSEGRP_BASE       24
+#define TSE_POSEGRP                    25
+#define TSE_SEQUENCE   26
+#define TSE_SEQ_STRIP  27
+#define TSE_SEQUENCE_DUP 28
+
+/* outliner search flags */
+#define OL_FIND                                        0
+#define OL_FIND_CASE                   1
+#define OL_FIND_COMPLETE               2
+#define OL_FIND_COMPLETE_CASE  3
+
+/* button events */
+#define OL_NAMEBUTTON          1
+
+
 /* outliner_ops.c */
 void outliner_operatortypes(void);
 void outliner_keymap(struct wmWindowManager *wm);
index c687ca179079a42ed70fb9189f7abed622dcc5bb..b53e5ce427d25f4b34dbd5f41af366bc015edbda 100644 (file)
@@ -492,15 +492,46 @@ static SpaceLink *outliner_new(void)
        return (SpaceLink*)soutliner;
 }
 
+static void free_oops(Oops *oops)      /* also oops itself */
+{
+       BLI_freelistN(&oops->link);
+       MEM_freeN(oops);
+}
+
+static void outliner_free_tree(ListBase *lb)
+{
+       
+       while(lb->first) {
+               TreeElement *te= lb->first;
+               
+               outliner_free_tree(&te->subtree);
+               BLI_remlink(lb, te);
+               MEM_freeN(te);
+       }
+}
+
 /* not spacelink itself */
 static void outliner_free(SpaceLink *sl)
 {
        SpaceOops *soutliner= (SpaceOops*)sl;
+       Oops *oops;
 
        if(soutliner->rnapath) {
                MEM_freeN(soutliner->rnapath);
                soutliner->rnapath= NULL;
        }
+       
+       while( (oops= soutliner->oops.first) ) {
+               BLI_remlink(&soutliner->oops, oops);
+               free_oops(oops);
+       }
+       
+       outliner_free_tree(&soutliner->tree);
+       if(soutliner->treestore) {
+               if(soutliner->treestore->data) MEM_freeN(soutliner->treestore->data);
+               MEM_freeN(soutliner->treestore);
+       }
+       
 }
 
 /* spacetype; init callback */