[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