Two in one:
[blender.git] / source / blender / src / spacetypes.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #include <stdlib.h>
34
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
38
39 #include "BLI_blenlib.h"
40
41 #include "DNA_screen_types.h"
42 #include "DNA_space_types.h"
43
44 #include "BIF_gl.h"
45 #include "BIF_mywindow.h"
46 #include "BIF_screen.h"
47 #include "BIF_space.h"
48 #include "BIF_spacetypes.h"
49
50 /***/
51
52 struct _SpaceType {
53         char                    name[32];
54         
55         SpaceDrawFP             windraw;
56         SpaceChangeFP   winchange;
57         SpaceHandleFP   winhandle;
58 };
59
60 /* local prototypes ----------------------- */
61 void scrarea_do_windraw(ScrArea *area);
62 void scrarea_do_winchange(ScrArea *area);
63 void scrarea_do_winhandle(ScrArea *area, BWinEvent *evt);
64
65 SpaceType *spacetype_new(char *name)
66 {
67         SpaceType *st= calloc(1, sizeof(*st));
68         BLI_strncpy(st->name, name, sizeof(st->name));
69
70         return st;
71 }
72
73 void spacetype_set_winfuncs(SpaceType *st, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle) 
74 {
75         st->windraw= draw;
76         st->winchange= change;
77         st->winhandle= handle;
78 }
79
80         /* gets SpaceType struct, but also has patch to initialize unknown spacetypes */
81
82 static SpaceType *spacetype_from_area(ScrArea *area)
83 {
84         switch (area->spacetype) {
85         case SPACE_ACTION:      return spaceaction_get_type();
86         case SPACE_BUTS:        return spacebuts_get_type();
87         case SPACE_FILE:        return spacefile_get_type();
88         case SPACE_IMAGE:       return spaceimage_get_type();
89         case SPACE_IMASEL:      return spaceimasel_get_type();
90         case SPACE_INFO:        return spaceinfo_get_type();
91         case SPACE_IPO:         return spaceipo_get_type();
92         case SPACE_NLA:         return spacenla_get_type();
93         case SPACE_OOPS:        return spaceoops_get_type();
94         case SPACE_SEQ:         return spaceseq_get_type();
95         case SPACE_SOUND:       return spacesound_get_type();
96         case SPACE_TEXT:        return spacetext_get_type();
97         case SPACE_SCRIPT:      return spacescript_get_type();
98         case SPACE_VIEW3D:      return spaceview3d_get_type();
99         case SPACE_TIME:        return spacetime_get_type();
100         case SPACE_NODE:        return spacenode_get_type();
101         default:
102                 newspace(area, SPACE_VIEW3D);
103                 return spaceview3d_get_type();
104                 return NULL;
105         }
106 }
107
108 void scrarea_do_windraw(ScrArea *area)
109 {
110         SpaceType *st= spacetype_from_area(area);
111         
112         areawinset(area->win);
113
114         if(area->win && st->windraw) {
115                 st->windraw(area, area->spacedata.first);
116         }
117         else {
118                 glClearColor(0.4375, 0.4375, 0.4375, 0.0); 
119                 glClear(GL_COLOR_BUFFER_BIT);
120         }
121         
122         area->win_swap= WIN_BACK_OK;
123 }
124 void scrarea_do_winchange(ScrArea *area)
125 {
126         SpaceType *st= spacetype_from_area(area);
127
128         areawinset(area->win);
129
130         if (st->winchange) {
131                 st->winchange(area, area->spacedata.first);
132         } else {
133                 if (!BLI_rcti_is_empty(&area->winrct)) {
134                         bwin_ortho2(area->win, -0.375, area->winrct.xmax-area->winrct.xmin-0.375, -0.375, area->winrct.ymax-area->winrct.ymin-0.375);
135                         glLoadIdentity();
136                 }
137         }
138 }
139 void scrarea_do_winhandle(ScrArea *area, BWinEvent *evt)
140 {
141         SpaceType *st= spacetype_from_area(area);
142
143         areawinset(area->win);
144         
145         if (st->winhandle) {
146                 st->winhandle(area, area->spacedata.first, evt);
147         }
148 }