Revision: 18314
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18314
Author: ton
Date: 2009-01-04 18:45:54 +0100 (Sun, 04 Jan 2009)
Log Message:
-----------
2.5
WM: added area-listener, which can be used to tag refreshes for
either the drawing call, or use the new ED_area_tag_refresh()
function which will automatically call, after all notifiers
were handled, an the spacetype->refresh() you provided.
Added for Joshua, after reviewing Action/Dopesheet requirements.
Joshua: I've made two dummy functions in space_action.c:
- action_listener()
- action_refresh()
Wich now does a printf on activating a new object.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
branches/blender2.5/blender/source/blender/editors/screen/area.c
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c
branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
2009-01-04 14:14:06 UTC (rev 18313)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
2009-01-04 17:45:54 UTC (rev 18314)
@@ -63,8 +63,11 @@
/* init is to cope with file load, screen (size) changes, check
handlers */
void (*init)(struct wmWindowManager *, struct ScrArea *);
/* Listeners can react to bContext changes */
- void (*listener)(struct ARegion *, struct wmNotifier *);
+ void (*listener)(struct ScrArea *, struct wmNotifier *);
+ /* refresh context, called after filereads, ED_area_tag_refresh() */
+ void (*refresh)(const struct bContext *, struct ScrArea *);
+
/* after a spacedata copy, an init should result in exact same
situation */
struct SpaceLink *(*duplicate)(struct SpaceLink *);
Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
2009-01-04 14:14:06 UTC (rev 18313)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
2009-01-04 17:45:54 UTC (rev 18314)
@@ -63,7 +63,10 @@
void ED_area_initialize(struct wmWindowManager *wm, struct wmWindow *win,
struct ScrArea *sa);
void ED_area_exit(struct bContext *C, struct ScrArea *sa);
int ED_screen_area_active(const struct bContext *C);
+void ED_area_do_listen(ScrArea *sa, struct wmNotifier *note);
void ED_area_tag_redraw(ScrArea *sa);
+void ED_area_tag_refresh(ScrArea *sa);
+void ED_area_do_refresh(struct bContext *C, ScrArea *sa);
void ED_area_headerprint(ScrArea *sa, const char *str);
/* screens */
Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c
2009-01-04 14:14:06 UTC (rev 18313)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c
2009-01-04 17:45:54 UTC (rev 18314)
@@ -104,6 +104,7 @@
wmLoadIdentity();
}
+/* only exported for WM */
void ED_region_do_listen(ARegion *ar, wmNotifier *note)
{
/* generic notes first */
@@ -121,7 +122,27 @@
}
}
+/* only exported for WM */
+void ED_area_do_listen(ScrArea *sa, wmNotifier *note)
+{
+ /* no generic notes? */
+ if(sa->type && sa->type->listener) {
+ sa->type->listener(sa, note);
+ }
+}
+
+/* only exported for WM */
+void ED_area_do_refresh(bContext *C, ScrArea *sa)
+{
+ /* no generic notes? */
+ if(sa->type && sa->type->refresh) {
+ sa->type->refresh(C, sa);
+ }
+ sa->do_refresh= 0;
+}
+
/* based on screen region draw tags, set draw tags in azones, and future
region tabs etc */
+/* only exported for WM */
void ED_area_overdraw_flush(bContext *C)
{
ScrArea *sa;
@@ -146,6 +167,7 @@
}
}
+/* only exported for WM */
void ED_area_overdraw(bContext *C)
{
wmWindow *win= CTX_wm_window(C);
@@ -174,6 +196,7 @@
}
+/* only exported for WM */
void ED_region_do_draw(bContext *C, ARegion *ar)
{
wmWindow *win= CTX_wm_window(C);
@@ -216,7 +239,7 @@
/* **********************************
maybe silly, but let's try for now
- to keep do_draw tags protected
+ to keep these tags protected
********************************** */
void ED_region_tag_redraw(ARegion *ar)
@@ -234,6 +257,11 @@
ar->do_draw= 1;
}
+void ED_area_tag_refresh(ScrArea *sa)
+{
+ if(sa)
+ sa->do_refresh= 1;
+}
/* *************************************************************** */
Modified:
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c
===================================================================
---
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c
2009-01-04 14:14:06 UTC (rev 18313)
+++
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c
2009-01-04 17:45:54 UTC (rev 18314)
@@ -329,6 +329,25 @@
}
}
+/* editor level listener */
+static void action_listener(ScrArea *sa, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_OB_ACTIVE:
+ ED_area_tag_refresh(sa);
+ break;
+ }
+ }
+}
+
+static void action_refresh(const bContext *C, ScrArea *sa)
+{
+ printf("Heya, Action refresh needed!\n");
+}
+
/* only called once, from space/spacetypes.c */
void ED_spacetype_action(void)
{
@@ -343,6 +362,8 @@
st->duplicate= action_duplicate;
st->operatortypes= action_operatortypes;
st->keymap= action_keymap;
+ st->listener= action_listener;
+ st->refresh= action_refresh;
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype action region");
Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
2009-01-04 14:14:06 UTC (rev 18313)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
2009-01-04 17:45:54 UTC (rev 18314)
@@ -106,7 +106,8 @@
short winx, winy; /* size */
short headertype; /* OLD! 0=no header, 1=
down, 2= up */
- int pad;
+ short pad;
+ short do_refresh; /* private, for
spacetype refresh callback */
short cursor, flag;
ScriptLink scriptlink;
@@ -134,7 +135,7 @@
float fsize; /* current split size in float
*/
- short do_draw; /* cached notifier events */
+ short do_draw; /* private, cached notifier
events */
short pad;
int pad1;
Modified:
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
---
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
2009-01-04 14:14:06 UTC (rev 18313)
+++
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
2009-01-04 17:45:54 UTC (rev 18314)
@@ -153,6 +153,7 @@
}
}
+ /* the notifiers are sent without context, to keep it clean */
while( (note=wm_notifier_next(wm)) ) {
wmWindow *win;
@@ -171,6 +172,7 @@
}
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ ED_area_do_listen(sa, note);
for(ar=sa->regionbase.first; ar; ar= ar->next) {
ED_region_do_listen(ar, note);
}
@@ -180,7 +182,16 @@
}
MEM_freeN(note);
- }
+ }
+
+ /* cached: editor refresh callbacks now, they get context */
+ for(win= wm->windows.first; win; win= win->next) {
+ ScrArea *sa;
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ if(sa->do_refresh)
+ ED_area_do_refresh(C, sa);
+ }
+ }
}
/* mark area-regions to redraw if overlapped with rect */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs