[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17747] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Mon Dec 8 16:03:01 CET 2008


Revision: 17747
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17747
Author:   ton
Date:     2008-12-08 16:02:57 +0100 (Mon, 08 Dec 2008)

Log Message:
-----------
2.5

Part one of wrapping up area/region management.
Read design doc here:
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/AreaManager

This commit:
- brings keymap storage to WM, based on names/types. This structure
  allows rna-ifying it too, so you can browse keymaps etc.
- creating areas and regions works slightly different now, wich
  regiontypes stored in areatype.

Todo:
- better callbacks and structure for defining which handlers need to
  be added.
- using region types to validate regions
- proper implementation of local region data
- code method for customizing keymaps. Current idea is that you have
  to indicate an entire keymap to be custom, to prevent too complicated
  merging problems of default and custom maps (like order, multiple keys
  for same operator, disabling options, etc).

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
    branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/spacetypes.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
    branches/blender2.5/blender/source/blender/editors/space_time/space_time.c
    branches/blender2.5/blender/source/blender/editors/space_time/time_ops.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-08 15:02:57 UTC (rev 17747)
@@ -40,13 +40,15 @@
 struct ListBase;
 
 /* spacetype has everything stored to get an editor working, it gets initialized via 
-spacetypes_init() in editors/area/spacetypes.c   */
+   ED_spacetypes_init() in editors/area/spacetypes.c   */
 /* an editor in Blender is a combined ScrArea + SpaceType + SpaceData */
 
+#define BKE_ST_MAXNAME	32
+
 typedef struct SpaceType {
 	struct SpaceType *next, *prev;
 	
-	char			name[32];					/* for menus */
+	char			name[BKE_ST_MAXNAME];		/* for menus */
 	int				spaceid;					/* unique space identifier */
 	int				iconid;						/* icon lookup for menus */
 	
@@ -56,7 +58,7 @@
 	void		(*free)(struct SpaceLink *);
 	
 	/* init is to cope with internal contextual changes, adds handlers,
-	 * sets screarea regions */
+	 * creates/sets screarea regions */
 	void		(*init)(struct wmWindowManager *, struct ScrArea *);
 	/* refresh is for external bContext changes */
 	void		(*refresh)(struct bContext *, struct ScrArea *);
@@ -66,23 +68,35 @@
 
 	/* register operator types on startup */
 	void		(*operatortypes)(void);
-	/* add default items to keymap */
+	/* add default items to WM keymap */
 	void		(*keymap)(struct wmWindowManager *);
 
+	/* region type definitions */
+	ListBase	regiontypes;
+	
 	/* read and write... */
 	
 } SpaceType;
 
-/* region type gets allocated and freed in spacetype init/free callback */
-/* data storage for regions is in space struct (also width/height of regions!) */
+/* region types are also defined using spacetypes_init, via a callback */
+
 typedef struct ARegionType {
+	struct ARegionType *next, *prev;
 	
+	int			regionid;	/* unique identifier within this space */
+	
 	void		(*init)(const struct bContext *, struct ARegion *);		/* add handlers, stuff you only do once or on area/region changes */
-	void		(*refresh)(const struct bContext *, struct ARegion *);		/* refresh to match contextual changes */
+	void		(*refresh)(const struct bContext *, struct ARegion *);	/* refresh to match contextual changes */
 	void		(*draw)(const struct bContext *, struct ARegion *);		/* draw entirely, windowsize changes should be handled here */
 	
 	void		(*listener)(struct ARegion *, struct wmNotifier *);
 	void		(*free)(struct ARegion *);
+
+	/* register operator types on startup */
+	void		(*operatortypes)(void);
+	/* add default items to keymap */
+	void		(*keymap)(struct wmWindowManager *);
+	
 } ARegionType;
 
 
@@ -90,9 +104,13 @@
 void BKE_area_region_free(struct ARegion *ar);
 void free_screen(struct bScreen *sc); 
 
+/* spacetypes */
 struct SpaceType *BKE_spacetype_from_id(int spaceid);
 const struct ListBase *BKE_spacetypes_list(void);
 void BKE_spacetype_register(struct SpaceType *st);
+void BKE_spacetypes_free(void);	/* only for quitting blender */
+
+/* spacedata */
 void BKE_spacedata_freelist(ListBase *lb);
 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c	2008-12-08 15:02:57 UTC (rev 17747)
@@ -77,6 +77,7 @@
 #include "BKE_node.h"
 #include "BKE_object.h"
 #include "BKE_scene.h"
+#include "BKE_screen.h"
 #include "BKE_sound.h"
 
 #include "BLI_editVert.h"
@@ -166,6 +167,7 @@
 
 /* ********** free ********** */
 
+/* only to be called on exit blender */
 void free_blender(void)
 {
 	/* samples are in a global list..., also sets G.main->sound->sample NULL */
@@ -174,6 +176,8 @@
 	free_main(G.main);
 	G.main= NULL;
 
+	BKE_spacetypes_free();		/* after free main, it uses space callbacks */
+	
 	IMB_freeImBufdata();		/* imbuf lib */
 	
 	free_nodesystem();	

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2008-12-08 15:02:57 UTC (rev 17747)
@@ -31,8 +31,11 @@
 #include <stdio.h>
 #include <math.h>
 
+#include "MEM_guardedalloc.h"
+
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
+
 #include "BLI_blenlib.h"
 
 #include "BKE_screen.h"
@@ -41,9 +44,27 @@
 #include "BPY_extern.h"
 #endif
 
+/* ************ Spacetype/regiontype handling ************** */
+
 /* keep global; this has to be accessible outside of windowmanager */
 static ListBase spacetypes= {NULL, NULL};
 
+/* not SpaceType itself */
+static void spacetype_free(SpaceType *st)
+{
+	BLI_freelistN(&st->regiontypes);
+}
+
+void BKE_spacetypes_free(void)
+{
+	SpaceType *st;
+	
+	for(st= spacetypes.first; st; st= st->next)
+		spacetype_free(st);
+	
+	BLI_freelistN(&spacetypes);
+}
+
 SpaceType *BKE_spacetype_from_id(int spaceid)
 {
 	SpaceType *st;
@@ -62,9 +83,21 @@
 
 void BKE_spacetype_register(SpaceType *st)
 {
+	SpaceType *stype;
+	
+	/* sanity check */
+	stype= BKE_spacetype_from_id(st->spaceid);
+	if(stype) {
+		printf("error: redefinition of spacetype %s\n", stype->name);
+		spacetype_free(stype);
+		MEM_freeN(stype);
+	}
+	
 	BLI_addtail(&spacetypes, st);
 }
 
+/* ***************** Space handling ********************** */
+
 void BKE_spacedata_freelist(ListBase *lb)
 {
 	SpaceLink *sl;

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-12-08 15:02:57 UTC (rev 17747)
@@ -3784,11 +3784,7 @@
 	}
 	
 	wm->operators.first= wm->operators.last= NULL;
-	wm->windowkeymap.first= wm->windowkeymap.last= NULL;
-	wm->screenkeymap.first= wm->screenkeymap.last= NULL;
-	wm->view2dkeymap.first= wm->view2dkeymap.last= NULL;
-	wm->uikeymap.first= wm->uikeymap.last= NULL;
-	wm->timekeymap.first= wm->timekeymap.last= NULL;
+	wm->keymaps.first= wm->keymaps.last= NULL;
 	
 	wm->queue.first= wm->queue.last= NULL;
 	wm->reports.first= wm->reports.last= NULL;

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-08 15:02:57 UTC (rev 17747)
@@ -36,6 +36,8 @@
 struct wmWindowManager;
 struct wmWindow;
 struct wmNotifier;
+struct SpaceType;
+struct AreagionType;
 
 /* regions */
 void	ED_region_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ARegion *ar);
@@ -48,6 +50,7 @@
 /* spaces */
 void	ED_spacetypes_init(void);
 void	ED_spacetypes_keymap(struct wmWindowManager *wm);
+struct ARegionType *ED_regiontype_from_id(struct SpaceType *st, int regionid);
 
 /* areas */
 void	ED_area_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *sa);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_ops.c	2008-12-08 15:02:57 UTC (rev 17747)
@@ -3511,8 +3511,8 @@
 
 void UI_keymap(wmWindowManager *wm)
 {
-	ui_operatortypes();
+	ListBase *keymap= WM_keymap_listbase(wm, "Interface", 0, 0);
 
-	WM_keymap_add_item(&wm->uikeymap, "ED_UI_OT_button_activate", MOUSEMOVE, 0, 0, 0);
+	WM_keymap_add_item(keymap, "ED_UI_OT_button_activate", MOUSEMOVE, 0, 0, 0);
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2008-12-08 15:02:57 UTC (rev 17747)
@@ -277,7 +277,7 @@
 
 ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
 {
-	static ARegionType type={NULL, NULL, NULL, NULL, NULL};
+	static ARegionType type;
 	ARegion *ar;
 	uiTooltipData *data;
 	int x1, x2, y1, y2, winx, winy;
@@ -288,6 +288,7 @@
 	/* create area region */
 	ar= ui_add_temporary_region(C->window->screen);
 
+	memset(&type, 0, sizeof(ARegionType));
 	type.draw= ui_tooltip_region_draw;
 	type.free= ui_tooltip_region_free;
 	ar->type= &type;
@@ -596,7 +597,8 @@
 
 uiMenuBlockHandle *ui_menu_block_create(bContext *C, ARegion *butregion, uiBut *but, uiBlockFuncFP block_func, void *arg)
 {
-	static ARegionType type={NULL, NULL, NULL, NULL, NULL};
+	static ARegionType type;
+	ListBase *keymap= WM_keymap_listbase(C->wm, "Interface", 0, 0);
 	ARegion *ar;
 	uiBlock *block;
 	uiBut *bt;
@@ -609,11 +611,12 @@
 	/* create area region */
 	ar= ui_add_temporary_region(C->window->screen);
 
+	memset(&type, 0, sizeof(ARegionType));
 	type.draw= ui_block_region_draw;
 	type.free= ui_block_region_free;
 	ar->type= &type;
 
-	WM_event_add_keymap_handler(&ar->handlers, &C->wm->uikeymap);
+	WM_event_add_keymap_handler(&ar->handlers, keymap);
 
 	handle->region= ar;
 	ar->regiondata= handle;

Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c	2008-12-08 11:19:44 UTC (rev 17746)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c	2008-12-08 15:02:57 UTC (rev 17747)
@@ -1160,27 +1160,27 @@
 
 void UI_view2d_keymap(wmWindowManager *wm)
 {
-	ui_view2d_operatortypes();
+	ListBase *keymap= WM_keymap_listbase(wm, "View2D", 0, 0);
 	
 	/* pan/scroll */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list