﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3ASource%2FUI%2FTutorials%2FAddAnEditor</id>
	<title>Dev:Source/UI/Tutorials/AddAnEditor - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3ASource%2FUI%2FTutorials%2FAddAnEditor"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:Source/UI/Tutorials/AddAnEditor&amp;action=history"/>
	<updated>2026-06-07T13:30:01Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:Source/UI/Tutorials/AddAnEditor&amp;diff=139907&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:Source/UI/Tutorials/AddAnEditor&amp;diff=139907&amp;oldid=prev"/>
		<updated>2018-06-28T20:52:42Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 20:52時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:Source/UI/Tutorials/AddAnEditor&amp;diff=139906&amp;oldid=prev</id>
		<title>wiki&gt;Sobotka: Remove obsolete areas.c code.</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:Source/UI/Tutorials/AddAnEditor&amp;diff=139906&amp;oldid=prev"/>
		<updated>2015-12-30T20:42:21Z</updated>

		<summary type="html">&lt;p&gt;Remove obsolete areas.c code.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Page/Header|&amp;lt;blender 2.6&amp;gt;|&amp;lt;previous page&amp;gt;|&amp;lt;next page&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{note|Work In Progress|I am writing this tutorial as I learn to work with Blender Areas/Spaces/Editors. Hopefully, this will make it easier for others to learn the same material. Since this is new to me there may be comments/questions embedded related to things for which I have no answers.}}&lt;br /&gt;
&lt;br /&gt;
=Adding a New Space (Editor) to Blender=&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
I recommend taking a look at [[Dev:2.5/Source/UI/AreaManager|Area Manager implementation]] before starting this tutorial. It'll give you a good base from which to start.&lt;br /&gt;
&lt;br /&gt;
For the purposes of using terminology that matches the code base please note the following:&lt;br /&gt;
&lt;br /&gt;
* '''Area or Editor''' is also referred to as a '''Space'''. Ie - the boxes labeled as ''Area'' in the diagram can be referred to equally as ''Area'',  ''Editor'' or ''Space''. &lt;br /&gt;
* '''Region''' is implemented as '''ARegion'''.&lt;br /&gt;
* '''RegionType''' is implemented as '''ARegionType'''.&lt;br /&gt;
&lt;br /&gt;
==Spaces and Regions==&lt;br /&gt;
&lt;br /&gt;
Blender starts with a single window which is divided into multiple spaces/editors/areas. Each of those spaces contains one or more regions.  &lt;br /&gt;
&lt;br /&gt;
In the following image, each of the orange boxes outlines a space (or editor) in the Blender window. The box at the top is the info space, the large box in the middle is the 3D View space, on the right are the outliner and properties spaces and at the bottom is the timeline space. Each of these boxes represents a space and has a specific space type defined in the source code. &lt;br /&gt;
&lt;br /&gt;
[[File:blenderspaces.png|Blender Spaces]]&lt;br /&gt;
&lt;br /&gt;
The next image shows orange boxes around each of the regions within the 3D View space. To the left is the tools region, in the middle is the 3D View region and on the bottom is the header region.&lt;br /&gt;
&lt;br /&gt;
[[File:blenderregions.png|Blender Regions]]&lt;br /&gt;
&lt;br /&gt;
==Looking at the Source==&lt;br /&gt;
&lt;br /&gt;
Every space has an associated type defined by the ''SpaceType'' structure. The basic information contained within the ''SpaceType'' structure is a name, an ID, a list of region types and pointers to a set of callback functions. The ''SpaceType'' structure is defined in [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/blenkernel/BKE_screen.h blender/source/blender/blenkernel/BKE_screen.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct SpaceType {&lt;br /&gt;
	struct SpaceType *next, *prev;&lt;br /&gt;
	&lt;br /&gt;
	char name[BKE_ST_MAXNAME];                  /* for menus */&lt;br /&gt;
	int spaceid;                                /* unique space identifier */&lt;br /&gt;
	int iconid;                                 /* icon lookup for menus */&lt;br /&gt;
	&lt;br /&gt;
	/* initial allocation, after this WM will call init() too */&lt;br /&gt;
	struct SpaceLink    *(*new)(const struct bContext *C);&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
		&lt;br /&gt;
	/* region type definitions */&lt;br /&gt;
	ListBase regiontypes;&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
    &lt;br /&gt;
} SpaceType;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A unique ID for each space type is defined in the ''eSpace_Type'' enumeration. When a new ''SpaceType'' instance is created it's ''spaceid'' is set to one of these values. ''eSpace_Type'' is defined in [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/makesdna/DNA_space_types.h blender/source/blender/makesdna/DNA_space_types.h]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* space types, moved from DNA_screen_types.h */&lt;br /&gt;
/* Do NOT change order, append on end. types are hardcoded needed */&lt;br /&gt;
typedef enum eSpace_Type {&lt;br /&gt;
	SPACE_EMPTY    = 0,&lt;br /&gt;
	SPACE_VIEW3D   = 1,&lt;br /&gt;
	SPACE_IPO      = 2,&lt;br /&gt;
	SPACE_OUTLINER = 3,&lt;br /&gt;
	SPACE_BUTS     = 4,&lt;br /&gt;
	SPACE_FILE     = 5,&lt;br /&gt;
	SPACE_IMAGE    = 6,&lt;br /&gt;
	SPACE_INFO     = 7,&lt;br /&gt;
	SPACE_SEQ      = 8,&lt;br /&gt;
	SPACE_TEXT     = 9,&lt;br /&gt;
	SPACE_IMASEL   = 10, /* deprecated */&lt;br /&gt;
	SPACE_SOUND    = 11, /* Deprecated */&lt;br /&gt;
	SPACE_ACTION   = 12,&lt;br /&gt;
	SPACE_NLA      = 13,&lt;br /&gt;
	SPACE_SCRIPT   = 14, /* Deprecated */&lt;br /&gt;
	SPACE_TIME     = 15,&lt;br /&gt;
	SPACE_NODE     = 16,&lt;br /&gt;
	SPACE_LOGIC    = 17,&lt;br /&gt;
	SPACE_CONSOLE  = 18,&lt;br /&gt;
	SPACE_USERPREF = 19,&lt;br /&gt;
	SPACE_CLIP     = 20,&lt;br /&gt;
	&lt;br /&gt;
	SPACEICONMAX = SPACE_CLIP&lt;br /&gt;
} eSpace_Type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When Blender's window manager is initialized it calls the ''ED_spacetypes_init()'' function in [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/space_api/spacetypes.c blender/source/blender/editors/space_api/spacetypes.c] which in turn calls each ''ED_spacetype_*()'' function to initialize each space type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* only call once on startup, storage is global in BKE kernel listbase */&lt;br /&gt;
void ED_spacetypes_init(void)&lt;br /&gt;
{&lt;br /&gt;
	const ListBase *spacetypes;&lt;br /&gt;
	SpaceType *type;&lt;br /&gt;
&lt;br /&gt;
	/* UI_UNIT_X is now a variable, is used in some spacetype inits? */&lt;br /&gt;
	U.widget_unit = 20;&lt;br /&gt;
	&lt;br /&gt;
	/* create space types */&lt;br /&gt;
	ED_spacetype_outliner();&lt;br /&gt;
	ED_spacetype_time();&lt;br /&gt;
	ED_spacetype_view3d();&lt;br /&gt;
	ED_spacetype_ipo();&lt;br /&gt;
	ED_spacetype_image();&lt;br /&gt;
	ED_spacetype_node();&lt;br /&gt;
	ED_spacetype_buttons();&lt;br /&gt;
	ED_spacetype_info();&lt;br /&gt;
	ED_spacetype_file();&lt;br /&gt;
	ED_spacetype_action();&lt;br /&gt;
	ED_spacetype_nla();&lt;br /&gt;
	ED_spacetype_script();&lt;br /&gt;
	ED_spacetype_text();&lt;br /&gt;
	ED_spacetype_sequencer();&lt;br /&gt;
	ED_spacetype_logic();&lt;br /&gt;
	ED_spacetype_console();&lt;br /&gt;
	ED_spacetype_userpref();&lt;br /&gt;
	ED_spacetype_clip();&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The declaration for each spacetype initialization function is put in [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/include/ED_space_api.h blender/source/blender/editors/include/ED_space_api.h].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* the pluginnable API for export to editors */&lt;br /&gt;
&lt;br /&gt;
/* calls for registering default spaces */&lt;br /&gt;
void ED_spacetype_outliner(void);&lt;br /&gt;
void ED_spacetype_time(void);&lt;br /&gt;
void ED_spacetype_view3d(void);&lt;br /&gt;
void ED_spacetype_ipo(void);&lt;br /&gt;
void ED_spacetype_image(void);&lt;br /&gt;
void ED_spacetype_node(void);&lt;br /&gt;
void ED_spacetype_buttons(void);&lt;br /&gt;
void ED_spacetype_info(void);&lt;br /&gt;
void ED_spacetype_file(void);&lt;br /&gt;
void ED_spacetype_action(void);&lt;br /&gt;
void ED_spacetype_nla(void);&lt;br /&gt;
void ED_spacetype_script(void);&lt;br /&gt;
void ED_spacetype_text(void);&lt;br /&gt;
void ED_spacetype_tutorial(void);&lt;br /&gt;
void ED_spacetype_sequencer(void);&lt;br /&gt;
void ED_spacetype_logic(void);&lt;br /&gt;
void ED_spacetype_console(void);&lt;br /&gt;
void ED_spacetype_userpref(void);&lt;br /&gt;
void ED_spacetype_clip(void);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each space type is implemented in a set of source files under [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors blender/source/blender/editors]. The following image highlights the directories associated with the various space types (editors).&lt;br /&gt;
&lt;br /&gt;
[[File:editorsdir.png|Editor source directories]]&lt;br /&gt;
&lt;br /&gt;
Examining the logic space type contained in ''space_logic/space_logic.c'' reveals the definition of the ''ED_spacetype_logic'' function which is called by ''ED_spacetypes_init()'' as indicated above. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* only called once, from space/spacetypes.c */&lt;br /&gt;
void ED_spacetype_logic(void)&lt;br /&gt;
{&lt;br /&gt;
	SpaceType *st = MEM_callocN(sizeof(SpaceType), &amp;quot;spacetype logic&amp;quot;);&lt;br /&gt;
	ARegionType *art;&lt;br /&gt;
	&lt;br /&gt;
	st-&amp;gt;spaceid = SPACE_LOGIC;&lt;br /&gt;
	strncpy(st-&amp;gt;name, &amp;quot;Logic&amp;quot;, BKE_ST_MAXNAME);&lt;br /&gt;
	&lt;br /&gt;
	st-&amp;gt;new = logic_new;&lt;br /&gt;
	st-&amp;gt;free = logic_free;&lt;br /&gt;
	st-&amp;gt;init = logic_init;&lt;br /&gt;
	st-&amp;gt;duplicate = logic_duplicate;&lt;br /&gt;
	st-&amp;gt;operatortypes = logic_operatortypes;&lt;br /&gt;
	st-&amp;gt;keymap = logic_keymap;&lt;br /&gt;
	st-&amp;gt;refresh = logic_refresh;&lt;br /&gt;
	st-&amp;gt;context = logic_context;&lt;br /&gt;
	&lt;br /&gt;
	/* regions: main window */&lt;br /&gt;
	art = MEM_callocN(sizeof(ARegionType), &amp;quot;spacetype logic region&amp;quot;);&lt;br /&gt;
	art-&amp;gt;regionid = RGN_TYPE_WINDOW;&lt;br /&gt;
	art-&amp;gt;keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES | ED_KEYMAP_VIEW2D;&lt;br /&gt;
	art-&amp;gt;init = logic_main_area_init;&lt;br /&gt;
	art-&amp;gt;draw = logic_main_area_draw;&lt;br /&gt;
	art-&amp;gt;listener = logic_listener;&lt;br /&gt;
&lt;br /&gt;
	BLI_addhead(&amp;amp;st-&amp;gt;regiontypes, art);&lt;br /&gt;
	&lt;br /&gt;
	/* regions: listview/buttons */&lt;br /&gt;
	art = MEM_callocN(sizeof(ARegionType), &amp;quot;spacetype logic region&amp;quot;);&lt;br /&gt;
	art-&amp;gt;regionid = RGN_TYPE_UI;&lt;br /&gt;
	art-&amp;gt;prefsizex= 220; // XXX&lt;br /&gt;
	art-&amp;gt;keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;&lt;br /&gt;
	art-&amp;gt;listener = logic_listener;&lt;br /&gt;
	art-&amp;gt;init = logic_buttons_area_init;&lt;br /&gt;
	art-&amp;gt;draw = logic_buttons_area_draw;&lt;br /&gt;
	BLI_addhead(&amp;amp;st-&amp;gt;regiontypes, art);&lt;br /&gt;
&lt;br /&gt;
	/* regions: header */&lt;br /&gt;
	art= MEM_callocN(sizeof(ARegionType), &amp;quot;spacetype logic region&amp;quot;);&lt;br /&gt;
	art-&amp;gt;regionid = RGN_TYPE_HEADER;&lt;br /&gt;
	art-&amp;gt;prefsizey = HEADERY;&lt;br /&gt;
	art-&amp;gt;keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_HEADER;&lt;br /&gt;
	art-&amp;gt;init = logic_header_area_init;&lt;br /&gt;
	art-&amp;gt;draw = logic_header_area_draw;&lt;br /&gt;
	&lt;br /&gt;
	BLI_addhead(&amp;amp;st-&amp;gt;regiontypes, art);&lt;br /&gt;
	&lt;br /&gt;
	BKE_spacetype_register(st);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The top portion of this function allocates a new ''SpaceType'' structure and a new ''RegionType'' structure. The ''st'' ''SpaceType'' structure is updated with it's ''spaceid'' set to ''SPACE_LOGIC'', a name and function pointers for each callback.&lt;br /&gt;
&lt;br /&gt;
Region types are allocated for the main logic area, the header and the properties list. Each region type is added to the ''regiontypes'' linked list in the ''st'' ''SpaceType'' structure by calling ''BLI_add_head()'' which adds the region type to the head of the linked list.&lt;br /&gt;
&lt;br /&gt;
Finally, the space type is registered with Blender with a call to ''BKE_spacetype_register(st)'' which essentially is a wrapper around ''BLI_add_tail()'' which first checks to make sure that the space type has not already been assigned.&lt;br /&gt;
&lt;br /&gt;
The first time the user selects an editor from the Editor Type menu for a given space the ''new'' callback for the space type is called. The function returns a ''SpaceLink'' type which is a generic pointer for all of the specific space types. &lt;br /&gt;
&lt;br /&gt;
Search for the ''logic_new()'' function in [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/space_logic/space_logic.c blender/source/blender/editors/space_logic/space_logic.c].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static SpaceLink *logic_new(const bContext *C)&lt;br /&gt;
{&lt;br /&gt;
	ScrArea *sa= CTX_wm_area(C);&lt;br /&gt;
	ARegion *ar;&lt;br /&gt;
	SpaceLogic *slogic;&lt;br /&gt;
	&lt;br /&gt;
	slogic= MEM_callocN(sizeof(SpaceLogic), &amp;quot;initlogic&amp;quot;);&lt;br /&gt;
	slogic-&amp;gt;spacetype= SPACE_LOGIC;&lt;br /&gt;
	&lt;br /&gt;
	/* default options */&lt;br /&gt;
	slogic-&amp;gt;scaflag = ((BUTS_SENS_SEL|BUTS_SENS_ACT|BUTS_SENS_LINK) |&lt;br /&gt;
	                   (BUTS_CONT_SEL|BUTS_CONT_ACT|BUTS_CONT_LINK) |&lt;br /&gt;
	                   (BUTS_ACT_SEL|BUTS_ACT_ACT|BUTS_ACT_LINK)    |&lt;br /&gt;
	                   (BUTS_SENS_STATE|BUTS_ACT_STATE));&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/* header */&lt;br /&gt;
	ar= MEM_callocN(sizeof(ARegion), &amp;quot;header for logic&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	BLI_addtail(&amp;amp;slogic-&amp;gt;regionbase, ar);&lt;br /&gt;
	ar-&amp;gt;regiontype= RGN_TYPE_HEADER;&lt;br /&gt;
	ar-&amp;gt;alignment= RGN_ALIGN_BOTTOM;&lt;br /&gt;
	&lt;br /&gt;
	/* buttons/list view */&lt;br /&gt;
	ar= MEM_callocN(sizeof(ARegion), &amp;quot;buttons for logic&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	BLI_addtail(&amp;amp;slogic-&amp;gt;regionbase, ar);&lt;br /&gt;
	ar-&amp;gt;regiontype= RGN_TYPE_UI;&lt;br /&gt;
	ar-&amp;gt;alignment= RGN_ALIGN_LEFT;&lt;br /&gt;
	&lt;br /&gt;
	/* main area */&lt;br /&gt;
	ar= MEM_callocN(sizeof(ARegion), &amp;quot;main area for logic&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	BLI_addtail(&amp;amp;slogic-&amp;gt;regionbase, ar);&lt;br /&gt;
	ar-&amp;gt;regiontype= RGN_TYPE_WINDOW;&lt;br /&gt;
&lt;br /&gt;
	ar-&amp;gt;v2d.tot.xmin =  0.0f;&lt;br /&gt;
	ar-&amp;gt;v2d.tot.ymax =  0.0f;&lt;br /&gt;
	ar-&amp;gt;v2d.tot.xmax = 1150.0f;&lt;br /&gt;
	ar-&amp;gt;v2d.tot.ymin = ( 1150.0f/(float)sa-&amp;gt;winx ) * (float)-sa-&amp;gt;winy;&lt;br /&gt;
	&lt;br /&gt;
	ar-&amp;gt;v2d.cur = ar-&amp;gt;v2d.tot;&lt;br /&gt;
	&lt;br /&gt;
	ar-&amp;gt;v2d.min[0] = 1.0f;&lt;br /&gt;
	ar-&amp;gt;v2d.min[1] = 1.0f;&lt;br /&gt;
	&lt;br /&gt;
	ar-&amp;gt;v2d.max[0] = 32000.0f;&lt;br /&gt;
	ar-&amp;gt;v2d.max[1] = 32000.0f;&lt;br /&gt;
	&lt;br /&gt;
	ar-&amp;gt;v2d.minzoom = 0.5f;&lt;br /&gt;
	ar-&amp;gt;v2d.maxzoom = 1.5f;&lt;br /&gt;
	&lt;br /&gt;
	ar-&amp;gt;v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM);&lt;br /&gt;
	ar-&amp;gt;v2d.keepzoom = V2D_KEEPZOOM | V2D_LIMITZOOM | V2D_KEEPASPECT;&lt;br /&gt;
	ar-&amp;gt;v2d.keeptot = V2D_KEEPTOT_BOUNDS;&lt;br /&gt;
	ar-&amp;gt;v2d.align = V2D_ALIGN_NO_POS_Y | V2D_ALIGN_NO_NEG_X;&lt;br /&gt;
	ar-&amp;gt;v2d.keepofs = V2D_KEEPOFS_Y;&lt;br /&gt;
	&lt;br /&gt;
	return (SpaceLink *)slogic;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''logic_new()'' allocates a new ''SpaceLogic'' structure and sets its ''spaceid'' to ''SPACE_LOGIC''. Then it proceeds to create 3 regions for the main logic region, the header region and the properties region and adding these regions to the ''regionbase'' linked list within the space. Finally, the pointer to the ''SpaceLogic'' structure is returned as a ''SpaceLink'' pointer. &lt;br /&gt;
&lt;br /&gt;
While there is much more going on in regard to initialization, keymaps etc in most of the files discussed so far we now have enough information to create a new space with minimal functionality.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Create a New Space (Editor)=&lt;br /&gt;
&lt;br /&gt;
== source/blender/makesdna/DNA_space_types ==&lt;br /&gt;
&lt;br /&gt;
Add the new ID, and update SPACEICONMAX to refer to the new value:&lt;br /&gt;
&amp;lt;br&amp;gt;[https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/makesdna/DNA_space_types.h blender/source/blender/makesdna/DNA_space_types.h] &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum eSpace_Type {&lt;br /&gt;
	SPACE_EMPTY    = 0,&lt;br /&gt;
	SPACE_VIEW3D   = 1,&lt;br /&gt;
	SPACE_IPO      = 2,&lt;br /&gt;
	SPACE_OUTLINER = 3,&lt;br /&gt;
	...&lt;br /&gt;
	SPACE_CLIP     = 20,&lt;br /&gt;
	SPACE_TUTORIAL = 21,&lt;br /&gt;
	&lt;br /&gt;
	SPACEICONMAX = SPACE_TUTORIAL&lt;br /&gt;
} eSpace_Type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the new ''SpaceLink'' structure:&lt;br /&gt;
&amp;lt;br&amp;gt;[https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/makesdna/DNA_space_types.h blender/source/blender/makesdna/DNA_space_types.h] &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* Tutorial Editor */&lt;br /&gt;
typedef struct SpaceTutorial {&lt;br /&gt;
  SpaceLink *next, *prev;&lt;br /&gt;
  ListBase regionbase;&lt;br /&gt;
  int spacetype;&lt;br /&gt;
  char pad[4];&lt;br /&gt;
} SpaceTutorial;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== source/blender/editors/space_api/spacetypes.c ==&lt;br /&gt;
Add a call for ''ED_spacetype_tutorial()'':&lt;br /&gt;
&amp;lt;br&amp;gt;[https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/space_api/spacetypes.c blender/source/blender/editors/space_api/spacetypes.c]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void ED_spacetypes_init(void)&lt;br /&gt;
{&lt;br /&gt;
	const ListBase *spacetypes;&lt;br /&gt;
	SpaceType *type;&lt;br /&gt;
&lt;br /&gt;
	/* UI_UNIT_X is now a variable, is used in some spacetype inits? */&lt;br /&gt;
	U.widget_unit = 20;&lt;br /&gt;
	&lt;br /&gt;
	/* create space types */&lt;br /&gt;
	ED_spacetype_outliner();&lt;br /&gt;
	ED_spacetype_time();&lt;br /&gt;
	ED_spacetype_view3d();&lt;br /&gt;
	ED_spacetype_ipo();&lt;br /&gt;
	ED_spacetype_image();&lt;br /&gt;
	ED_spacetype_node();&lt;br /&gt;
	ED_spacetype_buttons();&lt;br /&gt;
	ED_spacetype_info();&lt;br /&gt;
	ED_spacetype_file();&lt;br /&gt;
	ED_spacetype_action();&lt;br /&gt;
	ED_spacetype_nla();&lt;br /&gt;
	ED_spacetype_script();&lt;br /&gt;
	ED_spacetype_text();&lt;br /&gt;
	ED_spacetype_sequencer();&lt;br /&gt;
	ED_spacetype_logic();&lt;br /&gt;
	ED_spacetype_console();&lt;br /&gt;
	ED_spacetype_userpref();&lt;br /&gt;
	ED_spacetype_clip();&lt;br /&gt;
        ED_spacetype_tutorial();        /* Our new space/editor */&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== source/blender/editors/include/ED_space_api.h ==&lt;br /&gt;
Add a declaration for the new space type initialization function:&lt;br /&gt;
&amp;lt;br&amp;gt;[https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/include/ED_space_api.h blender/source/blender/editors/include/ED_space_api.h] &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* the pluginnable API for export to editors */&lt;br /&gt;
&lt;br /&gt;
/* calls for registering default spaces */&lt;br /&gt;
void ED_spacetype_outliner(void);&lt;br /&gt;
void ED_spacetype_time(void);&lt;br /&gt;
void ED_spacetype_view3d(void);&lt;br /&gt;
void ED_spacetype_ipo(void);&lt;br /&gt;
void ED_spacetype_image(void);&lt;br /&gt;
void ED_spacetype_node(void);&lt;br /&gt;
void ED_spacetype_buttons(void);&lt;br /&gt;
void ED_spacetype_info(void);&lt;br /&gt;
void ED_spacetype_file(void);&lt;br /&gt;
void ED_spacetype_action(void);&lt;br /&gt;
void ED_spacetype_nla(void);&lt;br /&gt;
void ED_spacetype_script(void);&lt;br /&gt;
void ED_spacetype_text(void);&lt;br /&gt;
void ED_spacetype_tutorial(void);&lt;br /&gt;
void ED_spacetype_sequencer(void);&lt;br /&gt;
void ED_spacetype_logic(void);&lt;br /&gt;
void ED_spacetype_console(void);&lt;br /&gt;
void ED_spacetype_userpref(void);&lt;br /&gt;
void ED_spacetype_clip(void);&lt;br /&gt;
void ED_spacetype_tutorial(void);        /* Our new space/editor */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CREATE source/blender/editors/space_tutorial/ ==&lt;br /&gt;
Create a new folder in [https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors blender/source/blender/editors] called ''space_tutorial''.&lt;br /&gt;
&lt;br /&gt;
== CREATE source/blender/editors/space_tutorial/space_tutorial.c ==&lt;br /&gt;
Create a new file named ''space_tutorial.c'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * ***** BEGIN GPL LICENSE BLOCK *****&lt;br /&gt;
 *&lt;br /&gt;
 * This program is free software; you can redistribute it and/or&lt;br /&gt;
 * modify it under the terms of the GNU General Public License&lt;br /&gt;
 * as published by the Free Software Foundation; either version 2&lt;br /&gt;
 * of the License, or (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 * GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU General Public License&lt;br /&gt;
 * along with this program; if not, write to the Free Software Foundation,&lt;br /&gt;
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.&lt;br /&gt;
 *&lt;br /&gt;
 * The Original Code is Copyright (C) 2008 Blender Foundation.&lt;br /&gt;
 * All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 * Contributor(s): Michael Neilly&lt;br /&gt;
 *&lt;br /&gt;
 * ***** END GPL LICENSE BLOCK *****&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/** \file blender/editors/space_tutorial/space_tutorial.c&lt;br /&gt;
 *  \ingroup sptutorial&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;DNA_text_types.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;MEM_guardedalloc.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;BLI_blenlib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;BKE_context.h&amp;quot;&lt;br /&gt;
#include &amp;quot;BKE_screen.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;ED_space_api.h&amp;quot;&lt;br /&gt;
#include &amp;quot;ED_screen.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;BIF_gl.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;WM_api.h&amp;quot;&lt;br /&gt;
#include &amp;quot;WM_types.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;UI_interface.h&amp;quot;&lt;br /&gt;
#include &amp;quot;UI_resources.h&amp;quot;&lt;br /&gt;
#include &amp;quot;UI_view2d.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
static SpaceLink *tutorial_new(const bContext *C)&lt;br /&gt;
{&lt;br /&gt;
	ScrArea *sa= CTX_wm_area(C);&lt;br /&gt;
	ARegion *ar;&lt;br /&gt;
	SpaceTutorial *stutorial;&lt;br /&gt;
&lt;br /&gt;
	stutorial = MEM_callocN(sizeof(SpaceTutorial), &amp;quot;inittutorial&amp;quot;);&lt;br /&gt;
	stutorial-&amp;gt;spacetype = SPACE_TUTORIAL;&lt;br /&gt;
&lt;br /&gt;
	/* header */&lt;br /&gt;
	ar = MEM_callocN(sizeof(ARegion), &amp;quot;header for tutorial&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	BLI_addtail(&amp;amp;stutorial-&amp;gt;regionbase, ar);&lt;br /&gt;
	ar-&amp;gt;regiontype = RGN_TYPE_HEADER;&lt;br /&gt;
	ar-&amp;gt;alignment = RGN_ALIGN_BOTTOM;&lt;br /&gt;
&lt;br /&gt;
	/* main area */&lt;br /&gt;
	ar = MEM_callocN(sizeof(ARegion), &amp;quot;main area for tutorial&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	BLI_addtail(&amp;amp;stutorial-&amp;gt;regionbase, ar);&lt;br /&gt;
	ar-&amp;gt;regiontype = RGN_TYPE_WINDOW;&lt;br /&gt;
&lt;br /&gt;
	return (SpaceLink *)stutorial;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* add handlers, stuff you only do once or on area/region changes */&lt;br /&gt;
static void tutorial_main_area_init(wmWindowManager *wm, ARegion *ar)&lt;br /&gt;
{&lt;br /&gt;
	UI_view2d_region_reinit(&amp;amp;ar-&amp;gt;v2d, V2D_COMMONVIEW_CUSTOM, ar-&amp;gt;winx, ar-&amp;gt;winy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void tutorial_main_area_draw(const bContext *C, ARegion *ar)&lt;br /&gt;
{&lt;br /&gt;
	/* draw entirely, view changes should be handled here */&lt;br /&gt;
	SpaceTutorial *stutorial = CTX_wm_space_tutorial(C);&lt;br /&gt;
	View2D *v2d = &amp;amp;ar-&amp;gt;v2d;&lt;br /&gt;
	View2DScrollers *scrollers;&lt;br /&gt;
&lt;br /&gt;
	/* clear and setup matrix */&lt;br /&gt;
	UI_ThemeClearColor(TH_BACK);&lt;br /&gt;
	glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
	/* works best with no view2d matrix set */&lt;br /&gt;
	UI_view2d_view_ortho(v2d);&lt;br /&gt;
&lt;br /&gt;
	/* reset view matrix */&lt;br /&gt;
	UI_view2d_view_restore(C);&lt;br /&gt;
&lt;br /&gt;
	/* scrollers */&lt;br /&gt;
	scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);&lt;br /&gt;
	UI_view2d_scrollers_draw(C, v2d, scrollers);&lt;br /&gt;
	UI_view2d_scrollers_free(scrollers);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void tutorial_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)&lt;br /&gt;
{&lt;br /&gt;
	ED_region_header_init(ar);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void tutorial_header_area_draw(const bContext *C, ARegion *ar)&lt;br /&gt;
{&lt;br /&gt;
	ED_region_header(C, ar);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/********************* registration ********************/&lt;br /&gt;
&lt;br /&gt;
/* only called once, from space/spacetypes.c */&lt;br /&gt;
void ED_spacetype_tutorial(void)&lt;br /&gt;
{&lt;br /&gt;
	SpaceType *st = MEM_callocN(sizeof(SpaceType), &amp;quot;spacetype tutorial&amp;quot;);&lt;br /&gt;
	ARegionType *art;&lt;br /&gt;
&lt;br /&gt;
	st-&amp;gt;spaceid = SPACE_TUTORIAL;&lt;br /&gt;
	strncpy(st-&amp;gt;name, &amp;quot;Tutorial&amp;quot;, BKE_ST_MAXNAME);&lt;br /&gt;
&lt;br /&gt;
	st-&amp;gt;new = tutorial_new;&lt;br /&gt;
&lt;br /&gt;
	/* regions: main window */&lt;br /&gt;
	art = MEM_callocN(sizeof(ARegionType), &amp;quot;spacetype tutorial region&amp;quot;);&lt;br /&gt;
	art-&amp;gt;regionid = RGN_TYPE_WINDOW;&lt;br /&gt;
&lt;br /&gt;
	art-&amp;gt;init = tutorial_main_area_init;&lt;br /&gt;
	art-&amp;gt;draw = tutorial_main_area_draw;&lt;br /&gt;
&lt;br /&gt;
	BLI_addhead(&amp;amp;st-&amp;gt;regiontypes, art);&lt;br /&gt;
&lt;br /&gt;
	/* regions: header */&lt;br /&gt;
	art = MEM_callocN(sizeof(ARegionType), &amp;quot;spacetype tutorial region&amp;quot;);&lt;br /&gt;
	art-&amp;gt;regionid = RGN_TYPE_HEADER;&lt;br /&gt;
	art-&amp;gt;prefsizey = HEADERY;&lt;br /&gt;
	art-&amp;gt;keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_HEADER;&lt;br /&gt;
	art-&amp;gt;init = tutorial_header_area_init;&lt;br /&gt;
	art-&amp;gt;draw = tutorial_header_area_draw;&lt;br /&gt;
	&lt;br /&gt;
	BLI_addhead(&amp;amp;st-&amp;gt;regiontypes, art);&lt;br /&gt;
&lt;br /&gt;
	BKE_spacetype_register(st);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What's missing==&lt;br /&gt;
&lt;br /&gt;
The above discussion touches on key areas but is not a complete picture of all the changes need to create a new space. The diff below contains the full set of changes that compile and run successfully in my tree as of 01/16/2013. I plan to update this page as I learn more myself but wanted to get it put in place in the hope that it will be useful even in its current limited state.&lt;br /&gt;
&lt;br /&gt;
You will also need to create ''space_tutorial/CMakeLists.txt'' and/or ''space_tutorial/SConscript''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/blender/source/blender/blenkernel/BKE_context.h b/blender/source/blender/blenkernel/BKE_context.h&lt;br /&gt;
index 285077f..cc5d21e 100644&lt;br /&gt;
--- a/blender/source/blender/blenkernel/BKE_context.h&lt;br /&gt;
+++ b/blender/source/blender/blenkernel/BKE_context.h&lt;br /&gt;
@@ -145,6 +145,7 @@ struct ReportList *CTX_wm_reports(const bContext *C);&lt;br /&gt;
 struct View3D *CTX_wm_view3d(const bContext *C);&lt;br /&gt;
 struct RegionView3D *CTX_wm_region_view3d(const bContext *C);&lt;br /&gt;
 struct SpaceText *CTX_wm_space_text(const bContext *C);&lt;br /&gt;
+struct SpaceTutorial *CTX_wm_space_tutorial(const bContext *C);&lt;br /&gt;
 struct SpaceImage *CTX_wm_space_image(const bContext *C);&lt;br /&gt;
 struct SpaceConsole *CTX_wm_space_console(const bContext *C);&lt;br /&gt;
 struct SpaceButs *CTX_wm_space_buts(const bContext *C);&lt;br /&gt;
diff --git a/blender/source/blender/blenkernel/intern/context.c b/blender/source/blender/blenkernel/intern/context.c&lt;br /&gt;
index a45afa5..2c55e1a 100644&lt;br /&gt;
--- a/blender/source/blender/blenkernel/intern/context.c&lt;br /&gt;
+++ b/blender/source/blender/blenkernel/intern/context.c&lt;br /&gt;
@@ -680,6 +680,14 @@ struct SpaceText *CTX_wm_space_text(const bContext *C)&lt;br /&gt;
 	return NULL;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+struct SpaceTutorial *CTX_wm_space_tutorial(const bContext *C)&lt;br /&gt;
+{&lt;br /&gt;
+	ScrArea *sa = CTX_wm_area(C);&lt;br /&gt;
+	if (sa &amp;amp;&amp;amp; sa-&amp;gt;spacetype == SPACE_TUTORIAL)&lt;br /&gt;
+		return sa-&amp;gt;spacedata.first;&lt;br /&gt;
+	return NULL;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
 struct SpaceConsole *CTX_wm_space_console(const bContext *C)&lt;br /&gt;
 {&lt;br /&gt;
 	ScrArea *sa = CTX_wm_area(C);&lt;br /&gt;
diff --git a/blender/source/blender/editors/CMakeLists.txt b/blender/source/blender/editors/CMakeLists.txt&lt;br /&gt;
index 084006c..5e3c5d3 100644&lt;br /&gt;
--- a/blender/source/blender/editors/CMakeLists.txt&lt;br /&gt;
+++ b/blender/source/blender/editors/CMakeLists.txt&lt;br /&gt;
@@ -50,6 +50,7 @@ if(WITH_BLENDER)&lt;br /&gt;
 	add_subdirectory(space_script)&lt;br /&gt;
 	add_subdirectory(space_sequencer)&lt;br /&gt;
 	add_subdirectory(space_text)&lt;br /&gt;
+	add_subdirectory(space_tutorial)&lt;br /&gt;
 	add_subdirectory(space_time)&lt;br /&gt;
 	add_subdirectory(space_userpref)&lt;br /&gt;
 	add_subdirectory(space_view3d)&lt;br /&gt;
diff --git a/blender/source/blender/editors/include/ED_space_api.h b/blender/source/blender/editors/include/ED_space_api.h&lt;br /&gt;
index c8521cb..517edf1 100644&lt;br /&gt;
--- a/blender/source/blender/editors/include/ED_space_api.h&lt;br /&gt;
+++ b/blender/source/blender/editors/include/ED_space_api.h&lt;br /&gt;
@@ -50,6 +50,7 @@ void ED_spacetype_action(void);&lt;br /&gt;
 void ED_spacetype_nla(void);&lt;br /&gt;
 void ED_spacetype_script(void);&lt;br /&gt;
 void ED_spacetype_text(void);&lt;br /&gt;
+void ED_spacetype_tutorial(void);&lt;br /&gt;
 void ED_spacetype_sequencer(void);&lt;br /&gt;
 void ED_spacetype_logic(void);&lt;br /&gt;
 void ED_spacetype_console(void);&lt;br /&gt;
diff --git a/blender/source/blender/editors/screen/area.c b/blender/source/blender/editors/screen/area.c&lt;br /&gt;
index cea7b12..7412ffe 100644&lt;br /&gt;
--- a/blender/source/blender/editors/screen/area.c&lt;br /&gt;
+++ b/blender/source/blender/editors/screen/area.c&lt;br /&gt;
@@ -1539,6 +1539,11 @@ static const char *editortype_pup(void)&lt;br /&gt;
 	    &amp;quot;|%l&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 	    &amp;quot;|Python Console %x18&amp;quot;&lt;br /&gt;
+&lt;br /&gt;
+	    &amp;quot;|%l&amp;quot;&lt;br /&gt;
+&lt;br /&gt;
+	    &amp;quot;|Tutorial %x21&amp;quot;&lt;br /&gt;
+&lt;br /&gt;
 	    );&lt;br /&gt;
 &lt;br /&gt;
 	return IFACE_(types);&lt;br /&gt;
diff --git a/blender/source/blender/editors/space_api/spacetypes.c b/blender/source/blender/editors/space_api/spacetypes.c&lt;br /&gt;
index 35344f2..e67e411 100644&lt;br /&gt;
--- a/blender/source/blender/editors/space_api/spacetypes.c&lt;br /&gt;
+++ b/blender/source/blender/editors/space_api/spacetypes.c&lt;br /&gt;
@@ -90,6 +90,7 @@ void ED_spacetypes_init(void)&lt;br /&gt;
 	ED_spacetype_nla();&lt;br /&gt;
 	ED_spacetype_script();&lt;br /&gt;
 	ED_spacetype_text();&lt;br /&gt;
+	ED_spacetype_tutorial();&lt;br /&gt;
 	ED_spacetype_sequencer();&lt;br /&gt;
 	ED_spacetype_logic();&lt;br /&gt;
 	ED_spacetype_console();&lt;br /&gt;
diff --git a/blender/source/blender/makesdna/DNA_space_types.h b/blender/source/blender/makesdna/DNA_space_types.h&lt;br /&gt;
index d632a88..4d33637 100644&lt;br /&gt;
--- a/blender/source/blender/makesdna/DNA_space_types.h&lt;br /&gt;
+++ b/blender/source/blender/makesdna/DNA_space_types.h&lt;br /&gt;
@@ -782,6 +782,16 @@ typedef enum eSpaceImage_Flag {&lt;br /&gt;
 	SI_COLOR_CORRECTION   = (1 &amp;lt;&amp;lt; 24),&lt;br /&gt;
 } eSpaceImage_Flag;&lt;br /&gt;
 &lt;br /&gt;
+/* Tutorial Editor ============================================ */&lt;br /&gt;
+&lt;br /&gt;
+/* Tutorial Editor */&lt;br /&gt;
+typedef struct SpaceTutorial {&lt;br /&gt;
+	SpaceLink *next, *prev;&lt;br /&gt;
+	ListBase regionbase;        /* storage of regions for inactive spaces */&lt;br /&gt;
+	int spacetype;&lt;br /&gt;
+	char pad[4];&lt;br /&gt;
+} SpaceTutorial;&lt;br /&gt;
+&lt;br /&gt;
 /* Text Editor ============================================ */&lt;br /&gt;
 &lt;br /&gt;
 /* Text Editor */&lt;br /&gt;
@@ -1124,8 +1134,9 @@ typedef enum eSpace_Type {&lt;br /&gt;
 	SPACE_CONSOLE  = 18,&lt;br /&gt;
 	SPACE_USERPREF = 19,&lt;br /&gt;
 	SPACE_CLIP     = 20,&lt;br /&gt;
+	SPACE_TUTORIAL = 21,&lt;br /&gt;
 	&lt;br /&gt;
-	SPACEICONMAX = SPACE_CLIP&lt;br /&gt;
+	SPACEICONMAX&lt;br /&gt;
 } eSpace_Type;&lt;br /&gt;
 &lt;br /&gt;
 #define IMG_SIZE_FALLBACK 256&lt;br /&gt;
diff --git a/blender/source/blender/makesrna/RNA_access.h b/blender/source/blender/makesrna/RNA_access.h&lt;br /&gt;
index 29adb8f..46309f4 100644&lt;br /&gt;
--- a/blender/source/blender/makesrna/RNA_access.h&lt;br /&gt;
+++ b/blender/source/blender/makesrna/RNA_access.h&lt;br /&gt;
@@ -504,6 +504,7 @@ extern StructRNA RNA_SpaceOutliner;&lt;br /&gt;
 extern StructRNA RNA_SpaceProperties;&lt;br /&gt;
 extern StructRNA RNA_SpaceSequenceEditor;&lt;br /&gt;
 extern StructRNA RNA_SpaceTextEditor;&lt;br /&gt;
+extern StructRNA RNA_SpaceTutorialEditor;&lt;br /&gt;
 extern StructRNA RNA_SpaceTimeline;&lt;br /&gt;
 extern StructRNA RNA_SpaceUVEditor;&lt;br /&gt;
 extern StructRNA RNA_SpaceUserPreferences;&lt;br /&gt;
diff --git a/blender/source/blender/makesrna/intern/rna_space.c b/blender/source/blender/makesrna/intern/rna_space.c&lt;br /&gt;
index 926b141..a240dff 100644&lt;br /&gt;
--- a/blender/source/blender/makesrna/intern/rna_space.c&lt;br /&gt;
+++ b/blender/source/blender/makesrna/intern/rna_space.c&lt;br /&gt;
@@ -67,6 +67,7 @@ EnumPropertyItem space_type_items[] = {&lt;br /&gt;
 	{SPACE_INFO, &amp;quot;INFO&amp;quot;, 0, &amp;quot;Info&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
 	{SPACE_SEQ, &amp;quot;SEQUENCE_EDITOR&amp;quot;, 0, &amp;quot;Sequence Editor&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
 	{SPACE_TEXT, &amp;quot;TEXT_EDITOR&amp;quot;, 0, &amp;quot;Text Editor&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
+	{SPACE_TUTORIAL, &amp;quot;TUTORIAL_EDITOR&amp;quot;, 0, &amp;quot;Tutorial Editor&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
 	{SPACE_ACTION, &amp;quot;DOPESHEET_EDITOR&amp;quot;, 0, &amp;quot;DopeSheet Editor&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
 	{SPACE_NLA, &amp;quot;NLA_EDITOR&amp;quot;, 0, &amp;quot;NLA Editor&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
 	{SPACE_TIME, &amp;quot;TIMELINE&amp;quot;, 0, &amp;quot;Timeline&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
@@ -177,6 +178,8 @@ static StructRNA *rna_Space_refine(struct PointerRNA *ptr)&lt;br /&gt;
 			return &amp;amp;RNA_SpaceSequenceEditor;&lt;br /&gt;
 		case SPACE_TEXT:&lt;br /&gt;
 			return &amp;amp;RNA_SpaceTextEditor;&lt;br /&gt;
+		case SPACE_TUTORIAL:&lt;br /&gt;
+			return &amp;amp;RNA_SpaceTutorialEditor;&lt;br /&gt;
 		case SPACE_ACTION:&lt;br /&gt;
 			return &amp;amp;RNA_SpaceDopeSheetEditor;&lt;br /&gt;
 		case SPACE_NLA:&lt;br /&gt;
@@ -2367,6 +2370,17 @@ static void rna_def_space_text(BlenderRNA *brna)&lt;br /&gt;
 	RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TEXT, NULL);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+static void rna_def_space_tutorial(BlenderRNA *brna)&lt;br /&gt;
+{&lt;br /&gt;
+	StructRNA *srna;&lt;br /&gt;
+	PropertyRNA *prop;&lt;br /&gt;
+&lt;br /&gt;
+	srna = RNA_def_struct(brna, &amp;quot;SpaceTutorialEditor&amp;quot;, &amp;quot;Space&amp;quot;);&lt;br /&gt;
+	RNA_def_struct_sdna(srna, &amp;quot;SpaceTutorial&amp;quot;);&lt;br /&gt;
+	RNA_def_struct_ui_text(srna, &amp;quot;Space Tutorial Editor&amp;quot;, &amp;quot;Tutorial editor space data&amp;quot;);&lt;br /&gt;
+&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
 static void rna_def_space_dopesheet(BlenderRNA *brna)&lt;br /&gt;
 {&lt;br /&gt;
 	StructRNA *srna;&lt;br /&gt;
@@ -3426,6 +3440,7 @@ void RNA_def_space(BlenderRNA *brna)&lt;br /&gt;
 	rna_def_space_image(brna);&lt;br /&gt;
 	rna_def_space_sequencer(brna);&lt;br /&gt;
 	rna_def_space_text(brna);&lt;br /&gt;
+	rna_def_space_tutorial(brna);&lt;br /&gt;
 	rna_def_fileselect_params(brna);&lt;br /&gt;
 	rna_def_space_filebrowser(brna);&lt;br /&gt;
 	rna_def_space_outliner(brna);&lt;br /&gt;
diff --git a/blender/source/creator/CMakeLists.txt b/blender/source/creator/CMakeLists.txt&lt;br /&gt;
index 72f1132..7b0e6bd 100644&lt;br /&gt;
--- a/blender/source/creator/CMakeLists.txt&lt;br /&gt;
+++ b/blender/source/creator/CMakeLists.txt&lt;br /&gt;
@@ -824,6 +824,7 @@ endif()&lt;br /&gt;
 		bf_editor_space_userpref&lt;br /&gt;
 		bf_editor_space_view3d&lt;br /&gt;
 		bf_editor_space_clip&lt;br /&gt;
+		bf_editor_space_tutorial&lt;br /&gt;
 &lt;br /&gt;
 		bf_editor_text&lt;br /&gt;
 		bf_editor_transform&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update (AUG 2014)===&lt;br /&gt;
* NOTE on (+++b/blender/source/creator/CMakeLists.txt): for Blender v2.72 ''bf_editor_space_tutorial'' must '''not''' be added to [http://git.blender.org/gitweb/gitweb.cgi/blender.git/blob/1d3d68b4084ad5d5c9e1a7131ffded9e58066260:/source/creator/CMakeLists.txt blender/source/creator/CMakeList.txt] but to [http://git.blender.org/gitweb/gitweb.cgi/blender.git/blob_plain/refs/heads/master:/build_files/cmake/macros.cmake blender/build_files/cmake/macros.cmake] after ''set(BLENDER_SORTED_LIBS'' where all the editors are listed.&lt;br /&gt;
&lt;br /&gt;
* In the folder of your new editor you then must create a CMakeLists.txt file that contains:&lt;br /&gt;
&amp;lt;source lang='cmake'&amp;gt;&lt;br /&gt;
set(INC&lt;br /&gt;
	../include&lt;br /&gt;
	../../blenfont&lt;br /&gt;
	../../blenkernel&lt;br /&gt;
	../../blenlib&lt;br /&gt;
	../../gpu&lt;br /&gt;
	../../imbuf&lt;br /&gt;
	../../makesdna&lt;br /&gt;
	../../makesrna&lt;br /&gt;
	../../windowmanager&lt;br /&gt;
	../../../../intern/guardedalloc&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
set(INC_SYS&lt;br /&gt;
	${GLEW_INCLUDE_PATH}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
set(SRC&lt;br /&gt;
	space_tutorial.c&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
blender_add_lib(bf_editor_space_tutorial &amp;quot;${SRC}&amp;quot; &amp;quot;${INC}&amp;quot; &amp;quot;${INC_SYS}&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Results ===&lt;br /&gt;
The following images show the new Tutorial space in the Editor Type menu, after creation and after being split into three spaces.&lt;br /&gt;
&lt;br /&gt;
[[File:tutorialspace.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:tutorialspace2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:tutorialspace3.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:UI]]&lt;br /&gt;
[[Category:Editors]]&lt;/div&gt;</summary>
		<author><name>wiki&gt;Sobotka</name></author>
		
	</entry>
</feed>