[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17852] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Sun Dec 14 18:25:47 CET 2008


Revision: 17852
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17852
Author:   ton
Date:     2008-12-14 18:25:46 +0100 (Sun, 14 Dec 2008)

Log Message:
-----------
2.5

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.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-14 16:44:13 UTC (rev 17851)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-14 17:25:46 UTC (rev 17852)
@@ -108,10 +108,6 @@
 } 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_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
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2008-12-14 16:44:13 UTC (rev 17851)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2008-12-14 17:25:46 UTC (rev 17852)
@@ -57,10 +57,9 @@
 
 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_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 @@
 	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 @@
 	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);
+		}
 	}
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-14 16:44:13 UTC (rev 17851)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-14 17:25:46 UTC (rev 17852)
@@ -46,7 +46,6 @@
 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);

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-14 16:44:13 UTC (rev 17851)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-14 17:25:46 UTC (rev 17852)
@@ -431,21 +431,6 @@
 }
 
 
-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 @@
 		}
 	}
 	
-	/* 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);
 	}
 		

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-14 16:44:13 UTC (rev 17851)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-14 17:25:46 UTC (rev 17852)
@@ -1208,7 +1208,7 @@
 /* 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);

Modified: branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c	2008-12-14 16:44:13 UTC (rev 17851)
+++ branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c	2008-12-14 17:25:46 UTC (rev 17852)
@@ -548,6 +548,10 @@
 	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;
 }
 





More information about the Bf-blender-cvs mailing list