diff options
author | Ton Roosendaal <ton@blender.org> | 2008-12-14 20:25:46 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2008-12-14 20:25:46 +0300 |
commit | 131fa2e00c35ff78042a4f793891eaeb880d715c (patch) | |
tree | 381cf85e2aaa9f5c821805f1c7fd39e3c681f838 /source/blender/blenkernel/intern/screen.c | |
parent | 8be23f94902a9338c5fad1d826a69bfb4be3630c (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel/intern/screen.c')
-rw-r--r-- | source/blender/blenkernel/intern/screen.c | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index c9e1521a90e..74e30984436 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -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); + } } } |