Whole lot of changes.... here a shortlist:
[blender.git] / source / blender / blenkernel / intern / screen.c
1 /* 
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * Contributor(s): Blender Foundation 2002-2008
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #include <string.h>
29 #include <stdio.h>
30 #include <math.h>
31
32 #include "DNA_screen_types.h"
33 #include "DNA_space_types.h"
34 #include "BLI_blenlib.h"
35
36 #include "BKE_screen.h"
37
38 #include "BPY_extern.h"
39
40 /* keep global; this has to be accessible outside of windowmanager */
41 static ListBase spacetypes= {NULL, NULL};
42
43 SpaceType *BKE_spacetype_from_id(int spaceid)
44 {
45         SpaceType *st;
46         
47         for(st= spacetypes.first; st; st= st->next) {
48                 if(st->spaceid==spaceid)
49                         return st;
50         }
51         return NULL;
52 }
53
54 void BKE_spacetype_register(SpaceType *st)
55 {
56         BLI_addtail(&spacetypes, st);
57 }
58
59 void BKE_spacedata_freelist(ListBase *lb)
60 {
61         SpaceLink *sl;
62         
63         for (sl= lb->first; sl; sl= sl->next) {
64                 SpaceType *st= BKE_spacetype_from_id(sl->spacetype);
65                 
66                 if(st && st->free) 
67                         st->free(sl);
68         }
69         
70         BLI_freelistN(lb);
71 }
72
73 /* lb1 should be empty */
74 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2)
75 {
76         SpaceLink *sl;
77         
78         lb1->first= lb2->last= NULL;    /* to be sure */
79         
80         for (sl= lb2->first; sl; sl= sl->next) {
81                 SpaceType *st= BKE_spacetype_from_id(sl->spacetype);
82                 
83                 if(st && st->duplicate)
84                         BLI_addtail(lb1, st->duplicate(sl));
85         }
86 }
87
88
89 /* not area itself */
90 void BKE_screen_area_free(ScrArea *sa)
91 {
92         
93         BKE_spacedata_freelist(&sa->spacedata);
94         
95         BLI_freelistN(&sa->regionbase);
96         
97         BLI_freelistN(&sa->panels);
98         //      uiFreeBlocks(&sa->uiblocks);
99         //      uiFreePanels(&sa->panels);
100         
101         BPY_free_scriptlink(&sa->scriptlink);
102
103 }
104
105 /* don't free screen itself */
106 void free_screen(bScreen *sc)
107 {
108         ScrArea *sa;
109         
110         for(sa= sc->areabase.first; sa; sa= sa->next)
111                 BKE_screen_area_free(sa);
112         
113         BLI_freelistN(&sc->vertbase);
114         BLI_freelistN(&sc->edgebase);
115         BLI_freelistN(&sc->areabase);
116 }
117
118