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

Reply via email to