2.5
authorTon Roosendaal <ton@blender.org>
Sun, 14 Dec 2008 17:25:46 +0000 (17:25 +0000)
committerTon Roosendaal <ton@blender.org>
Sun, 14 Dec 2008 17:25:46 +0000 (17:25 +0000)
Fix for crash on joining (previously splitted) areas.
Reason was the stored regions in pushed 'spaces' not being copied.

next: free running handlers on area join/split.

source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/screen.c
source/blender/editors/include/ED_screen.h
source/blender/editors/screen/area.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/space_outliner/space_outliner.c

index 77179122b6e4ecc78b618d4a99c939e439f5ca9a..5a679b6475f01b2b8e35670f0ce0645e56c5939f 100644 (file)
@@ -108,10 +108,6 @@ typedef struct ARegionType {
 } ARegionType;
 
 
-void BKE_screen_area_free(struct ScrArea *sa);
-void BKE_area_region_free(struct ARegion *ar);
-void free_screen(struct bScreen *sc); 
-
 /* spacetypes */
 struct SpaceType *BKE_spacetype_from_id(int spaceid);
 const struct ListBase *BKE_spacetypes_list(void);
@@ -122,5 +118,14 @@ void BKE_spacetypes_free(void);    /* only for quitting blender */
 void BKE_spacedata_freelist(ListBase *lb);
 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
 
+/* area/regions */
+struct ARegion *BKE_area_region_copy(struct ARegion *ar);
+void   BKE_area_region_free(struct ARegion *ar);
+
+void BKE_screen_area_free(struct ScrArea *sa);
+
+void free_screen(struct bScreen *sc); 
+
+
 #endif
 
index c9e1521a90eb66f596e178cc82ce3708682ba5be..74e30984436b704d7ce4b67a0d4ba11970ff5ec5 100644 (file)
@@ -57,10 +57,9 @@ static void spacetype_free(SpaceType *st)
 
 void BKE_spacetypes_free(void)
 {
-       SpaceType *st, *stn;
+       SpaceType *st;
        
-       for(st= spacetypes.first; st; st= stn) {
-               stn= st->next;
+       for(st= spacetypes.first; st; st= st->next) {
                spacetype_free(st);
        }
        
@@ -102,16 +101,14 @@ void BKE_spacetype_register(SpaceType *st)
 
 void BKE_spacedata_freelist(ListBase *lb)
 {
-       SpaceLink *sl, *sln;
-       ARegion *ar, *arn;
+       SpaceLink *sl;
+       ARegion *ar;
        
-       for (sl= lb->first; sl; sl= sln) {
+       for (sl= lb->first; sl; sl= sl->next) {
                SpaceType *st= BKE_spacetype_from_id(sl->spacetype);
-               sln= sl->next;
                
-               /* regions for pushed spaces */
-               for(ar=sl->regionbase.first; ar; ar=arn) {
-                       arn= ar->next;
+               /* free regions for pushed spaces */
+               for(ar=sl->regionbase.first; ar; ar=ar->next) {
                        BKE_area_region_free(ar);
                }
                BLI_freelistN(&sl->regionbase);
@@ -123,6 +120,37 @@ void BKE_spacedata_freelist(ListBase *lb)
        BLI_freelistN(lb);
 }
 
+ARegion *BKE_area_region_copy(ARegion *ar)
+{
+       ARegion *newar= MEM_dupallocN(ar);
+       
+       newar->handlers.first= newar->handlers.last= NULL;
+       newar->uiblocks.first= newar->uiblocks.last= NULL;
+       newar->swinid= 0;
+       
+       /* XXX regiondata callback */
+       if(ar->regiondata)
+               newar->regiondata= MEM_dupallocN(ar->regiondata);
+       
+       return newar;
+}
+
+
+/* from lb2 to lb1, lb1 is supposed to be free'd */
+static void region_copylist(ListBase *lb1, ListBase *lb2)
+{
+       ARegion *ar;
+       
+       /* to be sure */
+       lb1->first= lb1->last= NULL;
+       
+       for(ar= lb2->first; ar; ar= ar->next) {
+               ARegion *arnew= BKE_area_region_copy(ar);
+               BLI_addtail(lb1, arnew);
+       }
+}
+
+
 /* lb1 should be empty */
 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2)
 {
@@ -133,8 +161,13 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2)
        for (sl= lb2->first; sl; sl= sl->next) {
                SpaceType *st= BKE_spacetype_from_id(sl->spacetype);
                
-               if(st && st->duplicate)
-                       BLI_addtail(lb1, st->duplicate(sl));
+               if(st && st->duplicate) {
+                       SpaceLink *slnew= st->duplicate(sl);
+                       
+                       BLI_addtail(lb1, slnew);
+                       
+                       region_copylist(&slnew->regionbase, &sl->regionbase);
+               }
        }
 }
 
index 7292cc87366a889ce90c0cd717722ef2cf959687..2cb394da2b07b18d13db29017cacc321a03a8918 100644 (file)
@@ -46,7 +46,6 @@ void  ED_region_do_draw(struct bContext *C, struct ARegion *ar);
 void   ED_region_exit(struct bContext *C, struct ARegion *ar);
 void   ED_region_pixelspace(const struct bContext *C, struct ARegion *ar);
 void   ED_region_init(struct bContext *C, struct ARegion *ar);
-ARegion *ED_region_copy(ARegion *ar);
 
 /* spaces */
 void   ED_spacetypes_init(void);
index 066b110e4570482b1d7a1fdc70c45b8aee4012d4..fc6ed8cee54e8f06690069325de71d6b5612e530 100644 (file)
@@ -431,21 +431,6 @@ void ED_region_init(bContext *C, ARegion *ar)
 }
 
 
-ARegion *ED_region_copy(ARegion *ar)
-{
-       ARegion *newar= MEM_dupallocN(ar);
-       
-       newar->handlers.first= newar->handlers.last= NULL;
-       newar->uiblocks.first= newar->uiblocks.last= NULL;
-       newar->swinid= 0;
-       
-       /* XXX regiondata */
-       if(ar->regiondata)
-               newar->regiondata= MEM_dupallocN(ar->regiondata);
-       
-       return newar;
-}
-
 /* sa2 to sa1, we swap spaces for fullscreen to keep all allocated data */
 /* area vertices were set */
 void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space)
@@ -485,11 +470,11 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space)
                }
        }
        
-       /* regions */
+       /* regions... XXX */
        BLI_freelistN(&sa1->regionbase);
        
        for(ar= sa2->regionbase.first; ar; ar= ar->next) {
-               ARegion *newar= ED_region_copy(ar);
+               ARegion *newar= BKE_area_region_copy(ar);
                BLI_addtail(&sa1->regionbase, newar);
        }
                
index e36e843b8461f38db73b856f59cfab72280172a4..9a96edf243c31deb9cc09b23eff4d58f98a16b6a 100644 (file)
@@ -1208,7 +1208,7 @@ void ED_SCR_OT_repeat_last(wmOperatorType *ot)
 /* insert a region in the area region list */
 static int region_split_exec(bContext *C, wmOperator *op)
 {
-       ARegion *newar= ED_region_copy(C->region);
+       ARegion *newar= BKE_area_region_copy(C->region);
        int dir= RNA_enum_get(op->ptr, "dir");
        
        BLI_insertlinkafter(&C->area->regionbase, C->region, newar);
index b53e5ce427d25f4b34dbd5f41af366bc015edbda..923710d22b352472fe1c72f3ec7b8341fa8c0947 100644 (file)
@@ -548,6 +548,10 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl)
        if(soutlinern->rnapath)
                soutlinern->rnapath= MEM_dupallocN(soutlinern->rnapath);
        
+       soutlinern->oops.first= soutlinern->oops.last= NULL;
+       soutlinern->tree.first= soutlinern->tree.last= NULL;
+       soutlinern->treestore= NULL;
+       
        return (SpaceLink *)soutlinern;
 }