2.5
authorTon Roosendaal <ton@blender.org>
Sun, 14 Dec 2008 10:52:48 +0000 (10:52 +0000)
committerTon Roosendaal <ton@blender.org>
Sun, 14 Dec 2008 10:52:48 +0000 (10:52 +0000)
The basics for InfoSpace.
Also added InfoSpace data to area by default, older files allowed to
have nothing here (space empty). (prevents reported crasher in switching
space info to others).

Also: added ifdeffed code in readfile.c to debug missing memory frees
from data read from files. (instead of "data from SCR" it will print
the actual struct names).

14 files changed:
source/Makefile
source/blender/blenloader/intern/readfile.c
source/blender/editors/Makefile
source/blender/editors/SConscript
source/blender/editors/include/ED_space_api.h
source/blender/editors/screen/screen_edit.c
source/blender/editors/screen/screen_intern.h
source/blender/editors/screen/screen_ops.c
source/blender/editors/space_api/spacetypes.c
source/blender/editors/space_info/Makefile [new file with mode: 0644]
source/blender/editors/space_info/SConscript [new file with mode: 0644]
source/blender/editors/space_info/info_header.c [new file with mode: 0644]
source/blender/editors/space_info/info_intern.h [new file with mode: 0644]
source/blender/editors/space_info/space_info.c [new file with mode: 0644]

index 8eb585b0a227e5ee7a7da65e52f636e39581c010..57d250b7d22622fa09c33a7608c36ae8eb0f1699 100644 (file)
@@ -235,6 +235,7 @@ PULIB = $(NAN_MOTO)/lib/libmoto.a
 PULIB += $(NAN_ELBEEM)/lib/$(DEBUG_DIR)libelbeem.a
 PULIB += $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
 PULIB += $(OCGDIR)/blender/ed_space/libed_space.a
+PULIB += $(OCGDIR)/blender/ed_info/libed_info.a
 PULIB += $(OCGDIR)/blender/ed_buttons/libed_buttons.a
 PULIB += $(OCGDIR)/blender/ed_node/libed_node.a
 PULIB += $(OCGDIR)/blender/ed_image/libed_image.a
index d62c4e6253529287ac261ec9c6713e4dcbe63973..db6d6ba801e83443d74b71688c30fb5f85f4843e 100644 (file)
@@ -4206,8 +4206,12 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
                sa->type= NULL; /* spacetype callbacks */
                
                /* accident can happen when read/save new file with older version */
-               if(sa->spacedata.first==NULL && sa->spacetype>SPACE_NLA)
-                       sa->spacetype= SPACE_EMPTY;
+               /* 2.50: we now always add spacedata for info */
+               if(sa->spacedata.first==NULL) {
+                       SpaceInfo *sinfo= MEM_callocN(sizeof(SpaceInfo), "spaceinfo");
+                       sa->spacetype= SPACE_INFO;
+                       BLI_addtail(&sa->spacedata, sinfo);
+               }
                
                for(pa= sa->panels.first; pa; pa=pa->next) {
                        pa->paneltab= newdataadr(fd, pa->paneltab);
@@ -4513,15 +4517,17 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
        
        while(bhead && bhead->code==DATA) {
                void *data;
-               /* XXX BAD DEBUGGING OPTION TO GIVE NAMES */            
+#if 0          
+               /* XXX DUMB DEBUGGING OPTION TO GIVE NAMES for guarded malloc errors */         
                short *sp= fd->filesdna->structs[bhead->SDNAnr];
                char *allocname = fd->filesdna->types[ sp[0] ];
                char *tmp= malloc(100);
                
                strcpy(tmp, allocname);
-               
                data= read_struct(fd, bhead, tmp);
-
+#endif
+               data= read_struct(fd, bhead, allocname);
+               
                if (data) {
                        oldnewmap_insert(fd->datamap, bhead->old, data, 0);
                }
index dc90db4f47bac772dfad97d315da9fe091e6f116..7503f5a025bb57b73fb4125e92736dee8424cc7d 100644 (file)
@@ -29,6 +29,6 @@
 # Bounces make to subdirectories.
 
 SOURCEDIR = source/blender/editors
-DIRS = datafiles screen space_outliner space_time space_view3d interface util  space_api space_ipo space_image space_node space_buttons
+DIRS = datafiles screen space_outliner space_time space_view3d interface util  space_api space_ipo space_image space_node space_buttons space_info
 
 include nan_subdirs.mk
index b21bcd3f2214ac3770a0824700bf5bacb8ef3162..b2f391afe5416c478d1ea55f5e49383ec15647f7 100644 (file)
@@ -15,5 +15,6 @@ SConscript(['datafiles/SConscript',
                        'space_image/SConscript',
                        'space_node/SConscript',
                        'space_buttons/SConscript',
+                       'space_info/SConscript',
                        'transform/SConscript',
                        'screen/SConscript'])
index b1eb4d152cba5a163b9a27cfe9b19d73329ece3e..de406af30c94850b0e7c98de4586a347a88b2a4d 100644 (file)
@@ -39,6 +39,7 @@ void ED_spacetype_ipo(void);
 void ED_spacetype_image(void);
 void ED_spacetype_node(void);
 void ED_spacetype_buttons(void);
+void ED_spacetype_info(void);
 
 #endif /* ED_AREA_H */
 
index 24778674ddadb89011253ffd98784322c171bfb8..3af5ac2652cd7eac5dc3dc48a5b7335e4ec0c43e 100644 (file)
@@ -521,6 +521,47 @@ int screen_area_join(bScreen* scr, ScrArea *sa1, ScrArea *sa2)
        return 1;
 }
 
+void select_connected_scredge(bScreen *sc, ScrEdge *edge)
+{
+       ScrEdge *se;
+       ScrVert *sv;
+       int oneselected;
+       char dir;
+       
+       /* select connected, only in the right direction */
+       /* 'dir' is the direction of EDGE */
+       
+       if(edge->v1->vec.x==edge->v2->vec.x) dir= 'v';
+       else dir= 'h';
+       
+       sv= sc->vertbase.first;
+       while(sv) {
+               sv->flag = 0;
+               sv= sv->next;
+       }
+       
+       edge->v1->flag= 1;
+       edge->v2->flag= 1;
+       
+       oneselected= 1;
+       while(oneselected) {
+               se= sc->edgebase.first;
+               oneselected= 0;
+               while(se) {
+                       if(se->v1->flag + se->v2->flag==1) {
+                               if(dir=='h') if(se->v1->vec.y==se->v2->vec.y) {
+                                       se->v1->flag= se->v2->flag= 1;
+                                       oneselected= 1;
+                               }
+                                       if(dir=='v') if(se->v1->vec.x==se->v2->vec.x) {
+                                               se->v1->flag= se->v2->flag= 1;
+                                               oneselected= 1;
+                                       }
+                       }
+                               se= se->next;
+               }
+       }
+}
 
 /* test if screen vertices should be scaled */
 static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
@@ -580,6 +621,33 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
                if(sa->v1==sa->v2 || sa->v3==sa->v4 || sa->v2==sa->v3)
                        screen_delarea(sc, sa);
        }
+       
+       /* make each window at least HEADERY high */
+       for(sa= sc->areabase.first; sa; sa= sa->next) {
+               int headery= HEADERY+1;
+               
+               if(sa->v1->vec.y+headery > sa->v2->vec.y) {
+                       /* lower edge */
+                       ScrEdge *se= screen_findedge(sc, sa->v4, sa->v1);
+                       if(se && sa->v1!=sa->v2 ) {
+                               int yval;
+                               
+                               select_connected_scredge(sc, se);
+                               
+                               /* all selected vertices get the right offset */
+                               yval= sa->v2->vec.y-headery;
+                               sv= sc->vertbase.first;
+                               while(sv) {
+                                       /* if is a collapsed area */
+                                       if(sv!=sa->v2 && sv!=sa->v3) {
+                                               if(sv->flag) sv->vec.y= yval;
+                                       }
+                                       sv= sv->next;
+                               }
+                       }
+               }
+       }
+       
 }
 
 /* *********************** DRAWING **************************************** */
index 6d8bd9e0434d23bbc59c49dedd5286a97b73820a..7b44b1910c77c4b5aedab2a919564ddd39a742e5 100644 (file)
 struct wmWindow;
 
 /* area.c */
-void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space);
+void           area_copy_data  (ScrArea *sa1, ScrArea *sa2, int swap_space);
 
 /* screen_edit.c */
-bScreen *screen_add(struct wmWindow *win, char *name);
-ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
-ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac);
-int screen_area_join(bScreen* scr, ScrArea *sa1, ScrArea *sa2);
-int area_getorientation(bScreen *screen, ScrArea *sa, ScrArea *sb);
-
-void removenotused_scrverts(bScreen *sc);
-void removedouble_scrverts(bScreen *sc);
-void removedouble_scredges(bScreen *sc);
-void removenotused_scredges(bScreen *sc);
+bScreen                *screen_add(struct wmWindow *win, char *name);
+ScrEdge                *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
+ScrArea                *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac);
+int                    screen_area_join(bScreen* scr, ScrArea *sa1, ScrArea *sa2);
+int                    area_getorientation(bScreen *screen, ScrArea *sa, ScrArea *sb);
+void           select_connected_scredge(bScreen *sc, ScrEdge *edge);
+
+void           removenotused_scrverts(bScreen *sc);
+void           removedouble_scrverts(bScreen *sc);
+void           removedouble_scredges(bScreen *sc);
+void           removenotused_scredges(bScreen *sc);
 
 #endif /* ED_SCREEN_INTERN_H */
 
index 2a065afca693ed986c5fd331d30910683a1cb8b5..e36e843b8461f38db73b856f59cfab72280172a4 100644 (file)
@@ -416,48 +416,6 @@ static void area_move_set_limits(bScreen *sc, int dir, int *bigger, int *smaller
        }
 }
 
-static void select_connected_scredge(bScreen *sc, ScrEdge *edge)
-{
-       ScrEdge *se;
-       ScrVert *sv;
-       int oneselected;
-       char dir;
-       
-       /* select connected, only in the right direction */
-       /* 'dir' is the direction of EDGE */
-       
-       if(edge->v1->vec.x==edge->v2->vec.x) dir= 'v';
-       else dir= 'h';
-       
-       sv= sc->vertbase.first;
-       while(sv) {
-               sv->flag = 0;
-               sv= sv->next;
-       }
-       
-       edge->v1->flag= 1;
-       edge->v2->flag= 1;
-       
-       oneselected= 1;
-       while(oneselected) {
-               se= sc->edgebase.first;
-               oneselected= 0;
-               while(se) {
-                       if(se->v1->flag + se->v2->flag==1) {
-                               if(dir=='h') if(se->v1->vec.y==se->v2->vec.y) {
-                                       se->v1->flag= se->v2->flag= 1;
-                                       oneselected= 1;
-                               }
-                                       if(dir=='v') if(se->v1->vec.x==se->v2->vec.x) {
-                                               se->v1->flag= se->v2->flag= 1;
-                                               oneselected= 1;
-                                       }
-                       }
-                               se= se->next;
-               }
-       }
-}
-
 /* validate selection inside screen, set variables OK */
 /* return 0: init failed */
 static int area_move_init (bContext *C, wmOperator *op)
index 466eb3e4fe6b013855b266ee000b475dcc502af9..063dcb6c1a08e07c97fe1d53757a494774fd83a8 100644 (file)
@@ -68,6 +68,7 @@ void ED_spacetypes_init(void)
        ED_spacetype_image();
        ED_spacetype_node();
        ED_spacetype_buttons();
+       ED_spacetype_info();
 //     ...
        
        /* register operator types for screen and all spaces */
diff --git a/source/blender/editors/space_info/Makefile b/source/blender/editors/space_info/Makefile
new file mode 100644 (file)
index 0000000..31401d8
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# $Id: Makefile 14 2002-10-13 15:57:19Z hans $
+#
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version. 
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2007 Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): none yet.
+#
+# ***** END GPL LICENSE BLOCK *****
+#
+# Makes module object directory and bounces make to subdirectories.
+
+LIBNAME = ed_info
+DIR = $(OCGDIR)/blender/$(LIBNAME)
+
+include nan_compile.mk
+
+CFLAGS += $(LEVEL_1_C_WARNINGS)
+
+CPPFLAGS += -I$(NAN_GLEW)/include
+CPPFLAGS += -I$(OPENGL_HEADERS)
+
+# not very neat....
+CPPFLAGS += -I../../windowmanager
+CPPFLAGS += -I../../blenloader
+CPPFLAGS += -I../../blenkernel
+CPPFLAGS += -I../../blenlib
+CPPFLAGS += -I../../makesdna
+CPPFLAGS += -I../../imbuf
+CPPFLAGS += -I../../python
+CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+
+# own include 
+
+CPPFLAGS += -I../include 
diff --git a/source/blender/editors/space_info/SConscript b/source/blender/editors/space_info/SConscript
new file mode 100644 (file)
index 0000000..c967cf9
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('*.c')
+
+incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+
+env.BlenderLib ( 'bf_editors_space_info', sources, Split(incs), [], libtype=['core','intern'], priority=[35, 40] )
diff --git a/source/blender/editors/space_info/info_header.c b/source/blender/editors/space_info/info_header.c
new file mode 100644 (file)
index 0000000..e41177f
--- /dev/null
@@ -0,0 +1,189 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+
+#include "BKE_global.h"
+#include "BKE_screen.h"
+
+#include "ED_screen.h"
+#include "ED_util.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "info_intern.h"
+
+
+/* ************************ header area region *********************** */
+
+static void do_viewmenu(bContext *C, void *arg, int event)
+{
+       
+}
+
+static uiBlock *dummy_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
+{
+       ScrArea *curarea= C->area;
+       uiBlock *block;
+       short yco= 0, menuwidth=120;
+       
+       block= uiBeginBlock(C, handle->region, "dummy_viewmenu", UI_EMBOSSP, UI_HELV);
+       uiBlockSetButmFunc(block, do_viewmenu, NULL);
+       
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20, 
+                                        menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+       
+       if(curarea->headertype==HEADERTOP) {
+               uiBlockSetDirection(block, UI_DOWN);
+       }
+       else {
+               uiBlockSetDirection(block, UI_TOP);
+               uiBlockFlipOrder(block);
+       }
+       
+       uiTextBoundsBlock(block, 50);
+       uiEndBlock(C, block);
+       
+       return block;
+}
+
+#define B_NEWSPACE             100
+
+static void do_info_buttons(bContext *C, void *arg, int event)
+{
+       switch(event) {
+               case B_NEWSPACE:
+                       ED_newspace(C->area, C->area->butspacetype);
+                       WM_event_add_notifier(C, WM_NOTE_SCREEN_CHANGED, 0, NULL);
+                       break;
+               }
+}
+
+
+void info_header_buttons(const bContext *C, ARegion *ar)
+{
+       ScrArea *sa= C->area;
+       uiBlock *block;
+       int xco, yco= 3;
+       
+       block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS, UI_HELV);
+       uiBlockSetHandleFunc(block, do_info_buttons, NULL);
+       
+       if(ED_screen_area_active(C)) uiBlockSetCol(block, TH_HEADER);
+       else uiBlockSetCol(block, TH_HEADERDESEL);
+
+       xco = 8;
+       
+       uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, 
+                                         windowtype_pup(), xco, yco, XIC+10, YIC, 
+                                         &(C->area->butspacetype), 1.0, SPACEICONMAX, 0, 0, 
+                                         "Displays Current Window Type. "
+                                         "Click for menu of available types.");
+       
+       xco += XIC + 14;
+       
+       uiBlockSetEmboss(block, UI_EMBOSSN);
+       if (sa->flag & HEADER_NO_PULLDOWN) {
+               uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, 0, 
+                                                ICON_DISCLOSURE_TRI_RIGHT,
+                                                xco,yco,XIC,YIC-2,
+                                                &(sa->flag), 0, 0, 0, 0, 
+                                                "Show pulldown menus");
+       }
+       else {
+               uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, 0, 
+                                                ICON_DISCLOSURE_TRI_DOWN,
+                                                xco,yco,XIC,YIC-2,
+                                                &(sa->flag), 0, 0, 0, 0, 
+                                                "Hide pulldown menus");
+       }
+       uiBlockSetEmboss(block, UI_EMBOSS);
+       xco+=XIC;
+       
+       if((sa->flag & HEADER_NO_PULLDOWN)==0) {
+               int xmax;
+               
+               /* pull down menus */
+               uiBlockSetEmboss(block, UI_EMBOSSP);
+               
+               xmax= GetButStringLength("File");
+               uiDefPulldownBut(block, dummy_viewmenu, C->area, "File",        xco, yco, xmax-3, 22, "");
+               xco+= xmax;
+               
+               xmax= GetButStringLength("Add");
+               uiDefPulldownBut(block, dummy_viewmenu, C->area, "Add", xco, yco, xmax-3, 22, "");
+               xco+= xmax;
+               
+               xmax= GetButStringLength("Timeline");
+               uiDefPulldownBut(block, dummy_viewmenu, C->area, "Timeline",    xco, yco, xmax-3, 22, "");
+               xco+= xmax;
+               
+               xmax= GetButStringLength("Game");
+               uiDefPulldownBut(block, dummy_viewmenu, C->area, "Game",        xco, yco, xmax-3, 22, "");
+               xco+= xmax;
+               
+               xmax= GetButStringLength("Render");
+               uiDefPulldownBut(block, dummy_viewmenu, C->area, "Render",      xco, yco, xmax-3, 22, "");
+               xco+= xmax;
+               
+               xmax= GetButStringLength("Help");
+               uiDefPulldownBut(block, dummy_viewmenu, NULL, "Help",   xco, yco, xmax-3, 22, "");
+               xco+= xmax;
+               
+               
+               
+       }
+       
+       uiBlockSetEmboss(block, UI_EMBOSS);
+
+       /* always as last  */
+       sa->headbutlen= xco+XIC+80; // +80 because the last button is not an icon
+       
+       uiEndBlock(C, block);
+       uiDrawBlock(block);
+}
+
+
diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h
new file mode 100644 (file)
index 0000000..213c068
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef ED_INFO_INTERN_H
+#define ED_INFO_INTERN_H
+
+/* internal exports only */
+
+
+/* info_header.c */
+void info_header_buttons(const bContext *C, ARegion *ar);
+
+
+#endif /* ED_INFO_INTERN_H */
+
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
new file mode 100644 (file)
index 0000000..7a54297
--- /dev/null
@@ -0,0 +1,235 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "BKE_colortools.h"
+#include "BKE_global.h"
+#include "BKE_screen.h"
+
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "ED_markers.h"
+
+#include "info_intern.h"       // own include
+
+/* ******************** default callbacks for info space ***************** */
+
+static SpaceLink *info_new(void)
+{
+       ARegion *ar;
+       SpaceInfo *sinfo;
+       
+       sinfo= MEM_callocN(sizeof(SpaceInfo), "initinfo");
+       sinfo->spacetype= SPACE_INFO;
+       
+       /* header */
+       ar= MEM_callocN(sizeof(ARegion), "header for info");
+       
+       BLI_addtail(&sinfo->regionbase, ar);
+       ar->regiontype= RGN_TYPE_HEADER;
+       ar->alignment= RGN_ALIGN_BOTTOM;
+       UI_view2d_header_default(&ar->v2d);
+       
+       /* main area */
+       ar= MEM_callocN(sizeof(ARegion), "main area for info");
+       
+       BLI_addtail(&sinfo->regionbase, ar);
+       ar->regiontype= RGN_TYPE_WINDOW;
+       
+       /* channel list region XXX */
+
+       
+       return (SpaceLink *)sinfo;
+}
+
+/* not spacelink itself */
+static void info_free(SpaceLink *sl)
+{      
+//     SpaceInfo *sinfo= (SpaceInfo*) sl;
+       
+}
+
+
+/* spacetype; init callback */
+static void info_init(struct wmWindowManager *wm, ScrArea *sa)
+{
+
+}
+
+static SpaceLink *info_duplicate(SpaceLink *sl)
+{
+       SpaceInfo *sinfon= MEM_dupallocN(sl);
+       
+       /* clear or remove stuff from old */
+       
+       return (SpaceLink *)sinfon;
+}
+
+
+
+/* add handlers, stuff you only do once or on area/region changes */
+static void info_main_area_init(wmWindowManager *wm, ARegion *ar)
+{
+       ListBase *keymap;
+       
+       UI_view2d_size_update(&ar->v2d, ar->winx, ar->winy);
+       
+       /* own keymap */
+       keymap= WM_keymap_listbase(wm, "info", SPACE_INFO, 0);  /* XXX weak? */
+       WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+}
+
+static void info_main_area_draw(const bContext *C, ARegion *ar)
+{
+       /* draw entirely, view changes should be handled here */
+       // SpaceInfo *sinfo= C->area->spacedata.first;
+       View2D *v2d= &ar->v2d;
+       float col[3];
+       
+       /* clear and setup matrix */
+       UI_GetThemeColor3fv(TH_BACK, col);
+       glClearColor(col[0], col[1], col[2], 0.0);
+       glClear(GL_COLOR_BUFFER_BIT);
+       
+       UI_view2d_view_ortho(C, v2d);
+               
+       /* data... */
+       
+       
+       /* reset view matrix */
+       UI_view2d_view_restore(C);
+       
+       /* scrollers? */
+}
+
+void info_operatortypes(void)
+{
+       
+}
+
+void info_keymap(struct wmWindowManager *wm)
+{
+       
+}
+
+/* add handlers, stuff you only do once or on area/region changes */
+static void info_header_area_init(wmWindowManager *wm, ARegion *ar)
+{
+       UI_view2d_size_update(&ar->v2d, ar->winx, ar->winy);
+}
+
+static void info_header_area_draw(const bContext *C, ARegion *ar)
+{
+       float col[3];
+       
+       /* clear */
+       if(ED_screen_area_active(C))
+               UI_GetThemeColor3fv(TH_HEADER, col);
+       else
+               UI_GetThemeColor3fv(TH_HEADERDESEL, col);
+       
+       glClearColor(col[0], col[1], col[2], 0.0);
+       glClear(GL_COLOR_BUFFER_BIT);
+       
+       /* set view2d view matrix for scrolling (without scrollers) */
+       UI_view2d_view_ortho(C, &ar->v2d);
+       
+       info_header_buttons(C, ar);
+       
+       /* restore view matrix? */
+       UI_view2d_view_restore(C);
+}
+
+static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
+{
+       /* context changes */
+}
+
+/* only called once, from space/spacetypes.c */
+void ED_spacetype_info(void)
+{
+       SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype info");
+       ARegionType *art;
+       
+       st->spaceid= SPACE_INFO;
+       
+       st->new= info_new;
+       st->free= info_free;
+       st->init= info_init;
+       st->duplicate= info_duplicate;
+       st->operatortypes= info_operatortypes;
+       st->keymap= info_keymap;
+       
+       /* regions: main window */
+       art= MEM_callocN(sizeof(ARegionType), "spacetype info region");
+       art->regionid = RGN_TYPE_WINDOW;
+       art->init= info_main_area_init;
+       art->draw= info_main_area_draw;
+       art->listener= info_main_area_listener;
+       art->keymapflag= ED_KEYMAP_VIEW2D;
+
+       BLI_addhead(&st->regiontypes, art);
+       
+       /* regions: header */
+       art= MEM_callocN(sizeof(ARegionType), "spacetype info region");
+       art->regionid = RGN_TYPE_HEADER;
+       art->minsizey= HEADERY;
+       art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+       
+       art->init= info_header_area_init;
+       art->draw= info_header_area_draw;
+       
+       BLI_addhead(&st->regiontypes, art);
+       
+       
+       BKE_spacetype_register(st);
+}
+