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

Ton Roosendaal ton at blender.org
Wed Dec 10 14:56:54 CET 2008


Revision: 17776
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17776
Author:   ton
Date:     2008-12-10 14:56:54 +0100 (Wed, 10 Dec 2008)

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

Cleanup in area/region management

- more intelligence in area management for adding handlers and setting
  data correct. Space/Region type callbacks only have to do own things.

- added option for adding default handlers to areas/regions. (flag in
  type definition)

- ensured that region-types store the minsizes for regions.

- added boundbox check for handlers; note that it accepts pointer to
  boundbox, because handlers don't get reset on area-resizing or
  view changes. Example: view2d handlers use mask rect.

- handlers get now added on correct context levels (example frame change
  also worked in header)

- removed ->refresh() callback. Context refreshing is Listener.
  
- the ->init() is being called on all WM level actions, also after a
  file read, moving areas, re-opening areas etc. 

- fixed bug: crash on exit was caused by cleaning up Screen too late.

- UI_view2d_size_update() removed from draw callback, is init()

- regions now store (winx, winy) subwindow size.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    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_regions.c
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.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_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_init_exit.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-10 12:00:36 UTC (rev 17775)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-10 13:56:54 UTC (rev 17776)
@@ -52,16 +52,15 @@
 	int				spaceid;					/* unique space identifier */
 	int				iconid;						/* icon lookup for menus */
 	
-	/* calls init too */
+	/* initial allocation, after this WM will call init() too */
 	struct SpaceLink	*(*new)(void);
 	/* not free spacelink itself */
 	void		(*free)(struct SpaceLink *);
 	
-	/* init is to cope with internal contextual changes, adds handlers,
-	 * creates/sets screarea regions */
+	/* init is to cope with file load, screen (size) changes, check handlers */
 	void		(*init)(struct wmWindowManager *, struct ScrArea *);
-	/* refresh is for external bContext changes */
-	void		(*refresh)(struct bContext *, struct ScrArea *);
+	/* Listeners can react to bContext changes */
+	void		(*listener)(struct ARegion *, struct wmNotifier *);
 	
 	/* after a spacedata copy, an init should result in exact same situation */
 	struct SpaceLink	*(*duplicate)(struct SpaceLink *);
@@ -76,6 +75,9 @@
 	
 	/* read and write... */
 	
+	/* default keymaps to add */
+	int			keymapflag;
+	
 } SpaceType;
 
 /* region types are also defined using spacetypes_init, via a callback */
@@ -85,18 +87,24 @@
 	
 	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		(*draw)(const struct bContext *, struct ARegion *);		/* draw entirely, windowsize changes should be handled here */
+	/* add handlers, stuff you only do once or on area/region type/size changes */
+	void		(*init)(struct wmWindowManager *, struct ARegion *);
+	/* draw entirely, view changes should be handled here */
+	void		(*draw)(const struct bContext *, struct ARegion *);	
+	/* contextual changes should be handled here */
+	void		(*listener)(struct ARegion *, struct wmNotifier *);
 	
-	void		(*listener)(struct ARegion *, struct wmNotifier *);
 	void		(*free)(struct ARegion *);
 
 	/* register operator types on startup */
 	void		(*operatortypes)(void);
-	/* add default items to keymap */
+	/* add own items to keymap */
 	void		(*keymap)(struct wmWindowManager *);
 	
+	/* hardcoded constraints, smaller than these values region is not visible */
+	int			minsizex, minsizey;
+	/* default keymaps to add */
+	int			keymapflag;
 } ARegionType;
 
 

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-12-10 12:00:36 UTC (rev 17775)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-12-10 13:56:54 UTC (rev 17776)
@@ -5050,7 +5050,6 @@
 			ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
 			BLI_addtail(&sa->regionbase, ar);
 			ar->regiontype= RGN_TYPE_HEADER;
-			ar->minsize= HEADERY;	// DNA_screen_types.h
 			if(sa->headertype==1)
 				ar->alignment= RGN_ALIGN_BOTTOM;
 			else

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-10 12:00:36 UTC (rev 17775)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-10 13:56:54 UTC (rev 17776)
@@ -40,12 +40,11 @@
 struct AreagionType;
 
 /* regions */
-void	ED_region_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ARegion *ar);
 void	ED_region_do_listen(ARegion *ar, struct wmNotifier *note);
 void	ED_region_do_draw(struct bContext *C, ARegion *ar);
-void	ED_region_do_refresh(struct bContext *C, ARegion *ar);
 void	ED_region_exit(struct bContext *C, ARegion *ar);
 void	ED_region_pixelspace(const struct bContext *C, ARegion *ar);
+void	ED_region_init(struct bContext *C, ARegion *ar);
 ARegion *ED_region_copy(ARegion *ar);
 
 /* spaces */
@@ -75,6 +74,10 @@
 int		ED_operator_screen_mainwinactive(struct bContext *C);
 int		ED_operator_areaactive(struct bContext *C);
 
+/* default keymaps, bitflags */
+#define ED_KEYMAP_UI		1
+#define ED_KEYMAP_VIEW2D	2
+#define ED_KEYMAP_MARKERS	4
 
 #endif /* ED_SCREEN_H */
 

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-10 12:00:36 UTC (rev 17775)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2008-12-10 13:56:54 UTC (rev 17776)
@@ -350,6 +350,9 @@
 	ar->winrct.xmax= x2;
 	ar->winrct.ymax= y2;
 
+	/* adds subwindow */
+	ED_region_init(C, ar);
+	
 	/* notify change and redraw */
 	WM_event_add_notifier(C, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 	WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
@@ -663,6 +666,9 @@
 
 	block->flag |= UI_BLOCK_LOOP|UI_BLOCK_MOVEMOUSE_QUIT;
 
+	/* adds subwindow */
+	ED_region_init(C, ar);
+	
 	/* notify change and redraw */
 	WM_event_add_notifier(C, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 	WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-10 12:00:36 UTC (rev 17775)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-10 13:56:54 UTC (rev 17776)
@@ -50,7 +50,9 @@
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
+#include "UI_interface.h"
 #include "UI_resources.h"
+#include "UI_view2d.h"
 
 #ifndef DISABLE_PYTHON
 #include "BPY_extern.h"
@@ -108,14 +110,10 @@
 		case WM_NOTE_WINDOW_REDRAW:
 		case WM_NOTE_AREA_REDRAW:
 		case WM_NOTE_REGION_REDRAW:
-			ar->do_draw= 1;
-			break;
 		case WM_NOTE_GESTURE_REDRAW:
+		case WM_NOTE_SCREEN_CHANGED:
 			ar->do_draw= 1;
 			break;
-		case WM_NOTE_SCREEN_CHANGED:
-			ar->do_draw= ar->do_refresh= 1;
-			break;
 		default:
 			if(ar->type->listener)
 				ar->type->listener(ar, note);
@@ -177,21 +175,6 @@
 	ar->do_draw= 0;
 }
 
-void ED_region_do_refresh(bContext *C, ARegion *ar)
-{
-	ARegionType *at= ar->type;
-
-	/* refresh can be called before window opened */
-	if(ar->swinid)
-		wm_subwindow_set(C->window, ar->swinid);
-	
-	if (at->refresh) {
-		at->refresh(C, ar);
-	}
-	
-	ar->do_refresh= 0;
-}
-
 /* *************************************************************** */
 
 /* dir is direction to check, not the splitting edge direction! */
@@ -207,6 +190,8 @@
 
 static void region_rect_recursive(ARegion *ar, rcti *remainder)
 {
+	int prefsizex, prefsizey;
+	
 	if(ar==NULL)
 		return;
 	
@@ -215,8 +200,8 @@
 	if(ar->next==NULL)
 		ar->alignment= RGN_ALIGN_NONE;
 	
-	if(ar->size<ar->minsize)
-		ar->size= ar->minsize;
+	prefsizex= ar->type->minsizex;
+	prefsizey= ar->type->minsizey;
 	
 	/* hidden is user flag */
 	if(ar->flag & RGN_FLAG_HIDDEN);
@@ -233,46 +218,46 @@
 	}
 	else if(ar->alignment==RGN_ALIGN_TOP || ar->alignment==RGN_ALIGN_BOTTOM) {
 		
-		if( rct_fits(remainder, 'v', ar->minsize) < 0 ) {
+		if( rct_fits(remainder, 'v', prefsizey) < 0 ) {
 			ar->flag |= RGN_FLAG_TOO_SMALL;
 		}
 		else {
-			int fac= rct_fits(remainder, 'v', ar->size);
+			int fac= rct_fits(remainder, 'v', prefsizey);
 
 			if(fac < 0 )
-				ar->size += fac;
+				prefsizey += fac;
 			
 			ar->winrct= *remainder;
 			
 			if(ar->alignment==RGN_ALIGN_TOP) {
-				ar->winrct.ymin= ar->winrct.ymax - ar->size;
+				ar->winrct.ymin= ar->winrct.ymax - prefsizey;
 				remainder->ymax= ar->winrct.ymin-1;
 			}
 			else {
-				ar->winrct.ymax= ar->winrct.ymin + ar->size;
+				ar->winrct.ymax= ar->winrct.ymin + prefsizey;
 				remainder->ymin= ar->winrct.ymax+1;
 			}
 		}
 	}
 	else if(ar->alignment==RGN_ALIGN_LEFT || ar->alignment==RGN_ALIGN_RIGHT) {
 		
-		if( rct_fits(remainder, 'h', ar->minsize) < 0 ) {
+		if( rct_fits(remainder, 'h', prefsizex) < 0 ) {
 			ar->flag |= RGN_FLAG_TOO_SMALL;
 		}
 		else {
-			int fac= rct_fits(remainder, 'h', ar->size);
+			int fac= rct_fits(remainder, 'h', prefsizex);
 			
 			if(fac < 0 )
-				ar->size += fac;
+				prefsizex += fac;
 			
 			ar->winrct= *remainder;
 			
 			if(ar->alignment==RGN_ALIGN_RIGHT) {
-				ar->winrct.xmin= ar->winrct.xmax - ar->size;
+				ar->winrct.xmin= ar->winrct.xmax - prefsizex;
 				remainder->xmax= ar->winrct.xmin-1;
 			}
 			else {
-				ar->winrct.xmax= ar->winrct.xmin + ar->size;
+				ar->winrct.xmax= ar->winrct.xmin + prefsizex;
 				remainder->xmin= ar->winrct.xmax+1;
 			}
 		}
@@ -282,7 +267,7 @@
 		ar->winrct= *remainder;
 		
 		if(ar->alignment==RGN_ALIGN_HSPLIT) {
-			if( rct_fits(remainder, 'h', ar->size) > 4) {
+			if( rct_fits(remainder, 'h', prefsizex) > 4) {
 				ar->winrct.xmax= (remainder->xmin+remainder->xmax)/2;
 				remainder->xmin= ar->winrct.xmax+1;
 			}
@@ -291,7 +276,7 @@
 			}
 		}
 		else {
-			if( rct_fits(remainder, 'v', ar->size) > 4) {
+			if( rct_fits(remainder, 'v', prefsizey) > 4) {
 				ar->winrct.ymax= (remainder->ymin+remainder->ymax)/2;
 				remainder->ymin= ar->winrct.ymax+1;
 			}
@@ -300,6 +285,9 @@
 			}
 		}
 	}
+	/* for speedup */
+	ar->winx= ar->winrct.xmax - ar->winrct.xmin + 1;
+	ar->winy= ar->winrct.ymax - ar->winrct.ymin + 1;
 	
 	region_rect_recursive(ar->next, remainder);
 }
@@ -356,8 +344,8 @@
 	}
 }
 
-/* used for area and screen regions */
-void ED_region_initialize(wmWindowManager *wm, wmWindow *win, ARegion *ar)
+/* used for area initialize below */
+static void region_subwindow(wmWindowManager *wm, wmWindow *win, ARegion *ar)
 {
 	if(ar->flag & (RGN_FLAG_HIDDEN|RGN_FLAG_TOO_SMALL)) {
 		if(ar->swinid)
@@ -370,7 +358,25 @@
 		wm_subwindow_position(win, ar->swinid, &ar->winrct);
 }
 
-/* called in screen_refresh, or screens_init */
+static void ed_default_handlers(wmWindowManager *wm, ListBase *handlers, int flag)
+{
+	/* note, add-handler checks if it already exists */
+	
+	if(flag & ED_KEYMAP_UI) {
+		UI_add_region_handlers(handlers);
+	}
+	if(flag & ED_KEYMAP_VIEW2D) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list