Fix unnecessary 3D viewport redraws in various cases, in particular when editing
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 24 Jun 2013 22:41:33 +0000 (22:41 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 24 Jun 2013 22:41:33 +0000 (22:41 +0000)
node materials.

Area and region listener callbacks now get the screen and area pointers passed, so
they can do more fine grained checks to see if redraw is really needed, for example
depending on the 3D view drawtype.

26 files changed:
source/blender/blenkernel/BKE_screen.h
source/blender/editors/include/ED_screen.h
source/blender/editors/interface/interface_templates.c
source/blender/editors/screen/area.c
source/blender/editors/space_action/space_action.c
source/blender/editors/space_buttons/space_buttons.c
source/blender/editors/space_clip/space_clip.c
source/blender/editors/space_console/space_console.c
source/blender/editors/space_file/space_file.c
source/blender/editors/space_graph/space_graph.c
source/blender/editors/space_image/space_image.c
source/blender/editors/space_info/space_info.c
source/blender/editors/space_logic/space_logic.c
source/blender/editors/space_nla/space_nla.c
source/blender/editors/space_node/node_draw.c
source/blender/editors/space_node/space_node.c
source/blender/editors/space_outliner/space_outliner.c
source/blender/editors/space_script/space_script.c
source/blender/editors/space_sequencer/space_sequencer.c
source/blender/editors/space_text/space_text.c
source/blender/editors/space_time/space_time.c
source/blender/editors/space_userpref/space_userpref.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/makesrna/intern/rna_material.c
source/blender/windowmanager/WM_types.h
source/blender/windowmanager/intern/wm_event_system.c

index 5407e22e49eadb9035a3568e421415fa7a096f3b..b5a6c6fb8212de3194d18f3d64ada403fd4bf5b1 100644 (file)
@@ -78,7 +78,7 @@ typedef struct SpaceType {
        /* exit is called when the area is hidden or removed */
        void (*exit)(struct wmWindowManager *, struct ScrArea *);
        /* Listeners can react to bContext changes */
-       void (*listener)(struct ScrArea *, struct wmNotifier *);
+       void (*listener)(struct bScreen *sc, struct ScrArea *, struct wmNotifier *);
        
        /* refresh context, called after filereads, ED_area_tag_refresh() */
        void (*refresh)(const struct bContext *, struct ScrArea *);
@@ -123,7 +123,7 @@ typedef struct ARegionType {
        /* 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 bScreen *sc, struct ScrArea *, struct ARegion *, struct wmNotifier *);
        
        void (*free)(struct ARegion *);
 
index 12030f7da806579b5695ca9a58ad76d6779a8db1..d80e40d245599fbf844d859b8835c149f8a135f8 100644 (file)
@@ -50,7 +50,7 @@ struct uiBlock;
 struct rcti;
 
 /* regions */
-void    ED_region_do_listen(struct ARegion *ar, struct wmNotifier *note);
+void    ED_region_do_listen(struct bScreen *sc, struct ScrArea *sa, struct ARegion *ar, struct wmNotifier *note);
 void    ED_region_do_draw(struct bContext *C, struct ARegion *ar);
 void    ED_region_exit(struct bContext *C, struct ARegion *ar);
 void    ED_region_pixelspace(struct ARegion *ar);
@@ -80,7 +80,7 @@ int     ED_area_header_standardbuttons(const struct bContext *C, struct uiBlock
 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_do_listen(struct bScreen *sc, ScrArea *sa, struct wmNotifier *note);
 void    ED_area_tag_redraw(ScrArea *sa);
 void    ED_area_tag_redraw_regiontype(ScrArea *sa, int type);
 void    ED_area_tag_refresh(ScrArea *sa);
index 464fcfb0496e73994319bac2a7b1bd5bacb20e7f..34d1c24aade1d5ed32f70dcc3a0e2a61ec1ea9ff 100644 (file)
@@ -1284,7 +1284,7 @@ static void do_preview_buttons(bContext *C, void *arg, int event)
 {
        switch (event) {
                case B_MATPRV:
-                       WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING, arg);
+                       WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_PREVIEW, arg);
                        break;
        }
 }
index 429156ea6a7782e608a96f18b4545ace2f2152aa..4ddacc3254ef2eb9ae139a31a714fc958080c300 100644 (file)
@@ -116,7 +116,7 @@ void ED_region_pixelspace(ARegion *ar)
 }
 
 /* only exported for WM */
-void ED_region_do_listen(ARegion *ar, wmNotifier *note)
+void ED_region_do_listen(bScreen *sc, ScrArea *sa, ARegion *ar, wmNotifier *note)
 {
        /* generic notes first */
        switch (note->category) {
@@ -130,15 +130,15 @@ void ED_region_do_listen(ARegion *ar, wmNotifier *note)
        }
 
        if (ar->type && ar->type->listener)
-               ar->type->listener(ar, note);
+               ar->type->listener(sc, sa, ar, note);
 }
 
 /* only exported for WM */
-void ED_area_do_listen(ScrArea *sa, wmNotifier *note)
+void ED_area_do_listen(bScreen *sc, ScrArea *sa, wmNotifier *note)
 {
        /* no generic notes? */
        if (sa->type && sa->type->listener) {
-               sa->type->listener(sa, note);
+               sa->type->listener(sc, sa, note);
        }
 }
 
index b2bb455a0ba88e268fd1a5248490ffb6253e9497..7b0ff5a656f50b7a41f595f84740351d2ffbd9b2 100644 (file)
@@ -269,7 +269,7 @@ static void action_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void action_channel_area_listener(ARegion *ar, wmNotifier *wmn)
+static void action_channel_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -307,7 +307,7 @@ static void action_channel_area_listener(ARegion *ar, wmNotifier *wmn)
        }
 }
 
-static void action_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void action_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -355,7 +355,7 @@ static void action_main_area_listener(ARegion *ar, wmNotifier *wmn)
 }
 
 /* editor level listener */
-static void action_listener(ScrArea *sa, wmNotifier *wmn)
+static void action_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        SpaceAction *saction = (SpaceAction *)sa->spacedata.first;
        
@@ -448,7 +448,7 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn)
        }
 }
 
-static void action_header_area_listener(ARegion *ar, wmNotifier *wmn)
+static void action_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index e6c6df416bf65dcb9aa2f8d7f239e2083e170850..b01f653837cffd839fd47443f08313332fd73785 100644 (file)
@@ -225,7 +225,7 @@ static void buttons_area_redraw(ScrArea *sa, short buttons)
 }
 
 /* reused! */
-static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
+static void buttons_area_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        SpaceButs *sbuts = sa->spacedata.first;
 
@@ -295,6 +295,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
                                case ND_SHADING:
                                case ND_SHADING_DRAW:
                                case ND_SHADING_LINKS:
+                               case ND_SHADING_PREVIEW:
                                        /* currently works by redraws... if preview is set, it (re)starts job */
                                        sbuts->preview = 1;
                                        break;
@@ -318,6 +319,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
                                case ND_SHADING:
                                case ND_SHADING_DRAW:
                                case ND_SHADING_LINKS:
+                               case ND_SHADING_PREVIEW:
                                case ND_NODES:
                                        /* currently works by redraws... if preview is set, it (re)starts job */
                                        sbuts->preview = 1;
index 986b71abc8a582fe7125dbf019499be7761f4474..36cf9fc44c6969473446706b54956a101ecdc170 100644 (file)
@@ -340,7 +340,7 @@ static SpaceLink *clip_duplicate(SpaceLink *sl)
        return (SpaceLink *)scn;
 }
 
-static void clip_listener(ScrArea *sa, wmNotifier *wmn)
+static void clip_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -1174,7 +1174,7 @@ static void clip_main_area_draw(const bContext *C, ARegion *ar)
        }
 }
 
-static void clip_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void clip_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -1283,7 +1283,7 @@ static void clip_preview_area_draw(const bContext *C, ARegion *ar)
                dopesheet_area_draw(C, ar);
 }
 
-static void clip_preview_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
+static void clip_preview_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
 {
 }
 
@@ -1324,7 +1324,7 @@ static void clip_channels_area_draw(const bContext *C, ARegion *ar)
        UI_view2d_view_restore(C);
 }
 
-static void clip_channels_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
+static void clip_channels_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
 {
 }
 
@@ -1341,7 +1341,7 @@ static void clip_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void clip_header_area_listener(ARegion *ar, wmNotifier *wmn)
+static void clip_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -1381,7 +1381,7 @@ static void clip_tools_area_draw(const bContext *C, ARegion *ar)
 
 /****************** tool properties region ******************/
 
-static void clip_props_area_listener(ARegion *ar, wmNotifier *wmn)
+static void clip_props_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -1426,7 +1426,7 @@ static void clip_properties_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void clip_properties_area_listener(ARegion *ar, wmNotifier *wmn)
+static void clip_properties_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 81211e7bfefbc26628ae517742936695cead9d69..88a04197847302bbd94d7bdc3d531165430240ca 100644 (file)
@@ -359,7 +359,7 @@ static void console_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void console_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void console_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        // SpaceInfo *sinfo = sa->spacedata.first;
 
index 56b0a5481bf79771ca5572530ac654368ecfa4b5..8b1df0f0d8f90864189b87ce94817d27f4c52f75 100644 (file)
@@ -255,7 +255,7 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
 
 }
 
-static void file_listener(ScrArea *sa, wmNotifier *wmn)
+static void file_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        /* SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; */
 
@@ -291,7 +291,7 @@ static void file_main_area_init(wmWindowManager *wm, ARegion *ar)
        WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
 }
 
-static void file_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void file_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -500,7 +500,7 @@ static void file_channel_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void file_channel_area_listener(ARegion *UNUSED(ar), wmNotifier *wmn)
+static void file_channel_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -560,7 +560,7 @@ static void file_ui_area_draw(const bContext *C, ARegion *ar)
        UI_view2d_view_restore(C);
 }
 
-static void file_ui_area_listener(ARegion *ar, wmNotifier *wmn)
+static void file_ui_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 1a208ee2eb6149d3d34c442f3060a5ee3151ff03..6e38f236d019f39f6f6aee1630982c810af4d2e0 100644 (file)
@@ -384,7 +384,7 @@ static void graph_buttons_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void graph_region_listener(ARegion *ar, wmNotifier *wmn)
+static void graph_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -438,7 +438,7 @@ static void graph_region_listener(ARegion *ar, wmNotifier *wmn)
 }
 
 /* editor level listener */
-static void graph_listener(ScrArea *sa, wmNotifier *wmn)
+static void graph_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        SpaceIpo *sipo = (SpaceIpo *)sa->spacedata.first;
        
index 679c1632eb1f9687c5c3ca347f695e45aedf3f1a..fd57bf6101f62e3d9dc29ff832100c4579353723 100644 (file)
@@ -420,7 +420,7 @@ static void image_refresh(const bContext *C, ScrArea *sa)
        }
 }
 
-static void image_listener(ScrArea *sa, wmNotifier *wmn)
+static void image_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        SpaceImage *sima = (SpaceImage *)sa->spacedata.first;
        
@@ -731,7 +731,7 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
 #endif
 }
 
-static void image_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void image_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -765,7 +765,7 @@ static void image_buttons_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void image_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
+static void image_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -821,7 +821,7 @@ static void image_scope_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void image_scope_area_listener(ARegion *ar, wmNotifier *wmn)
+static void image_scope_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -858,7 +858,7 @@ static void image_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void image_header_area_listener(ARegion *ar, wmNotifier *wmn)
+static void image_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 96ad6dee2df7ff8068b15b3b3f37fd03dfb0fcca..10b935502ba79f1b142f993cb76cd6668b452a5a 100644 (file)
@@ -233,7 +233,7 @@ static void info_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void info_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        // SpaceInfo *sinfo = sa->spacedata.first;
 
@@ -248,7 +248,7 @@ static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
        }
 }
 
-static void info_header_listener(ARegion *ar, wmNotifier *wmn)
+static void info_header_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 3f3c81f2bfab123737367b3a5274f763130959ce..4682bbc59ff96049bc155282aa89c64a6649ff1a 100644 (file)
@@ -194,7 +194,7 @@ static void logic_refresh(const bContext *UNUSED(C), ScrArea *UNUSED(sa))
 
 }
 
-static void logic_listener(ARegion *ar, wmNotifier *wmn)
+static void logic_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 4ef84b3e7084ed5bf8f625e813f30bc47895889d..e54c1e8323a26d28958e5e0e9b19a3d2460cb4bf 100644 (file)
@@ -353,7 +353,7 @@ static void nla_buttons_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void nla_region_listener(ARegion *ar, wmNotifier *wmn)
+static void nla_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -386,7 +386,7 @@ static void nla_region_listener(ARegion *ar, wmNotifier *wmn)
 }
 
 
-static void nla_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void nla_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -430,7 +430,7 @@ static void nla_main_area_listener(ARegion *ar, wmNotifier *wmn)
        }
 }
 
-static void nla_channel_area_listener(ARegion *ar, wmNotifier *wmn)
+static void nla_channel_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -465,7 +465,7 @@ static void nla_channel_area_listener(ARegion *ar, wmNotifier *wmn)
 }
 
 /* editor level listener */
-static void nla_listener(ScrArea *sa, wmNotifier *wmn)
+static void nla_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 0ed803a7521d31833f79cb4daa86ca38c8b82b44..7da06bcf3a6e4ddfba629c76c1ca1661cb253b4a 100644 (file)
@@ -119,11 +119,11 @@ void ED_node_tag_update_id(ID *id)
                DAG_id_tag_update(id, 0);
                
                if (GS(id->name) == ID_MA)
-                       WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, id);
+                       WM_main_add_notifier(NC_MATERIAL | ND_SHADING, id);
                else if (GS(id->name) == ID_LA)
-                       WM_main_add_notifier(NC_LAMP | ND_LIGHTING_DRAW, id);
+                       WM_main_add_notifier(NC_LAMP | ND_LIGHTING, id);
                else if (GS(id->name) == ID_WO)
-                       WM_main_add_notifier(NC_WORLD | ND_WORLD_DRAW, id);
+                       WM_main_add_notifier(NC_WORLD | ND_WORLD, id);
        }
        else if (ntree->type == NTREE_COMPOSIT) {
                WM_main_add_notifier(NC_SCENE | ND_NODES, id);
index d0d74059da812af15cb4b0e03670d6a6877910bf..07fa6997e993cbb11602d275d48a8d2e2a381865 100644 (file)
@@ -377,7 +377,7 @@ static void node_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
 
 }
 
-static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
+static void node_area_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        /* note, ED_area_tag_refresh will re-execute compositor */
        SpaceNode *snode = sa->spacedata.first;
@@ -682,7 +682,7 @@ static void node_header_area_draw(const bContext *C, ARegion *ar)
 }
 
 /* used for header + main area */
-static void node_region_listener(ARegion *ar, wmNotifier *wmn)
+static void node_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 9e458647aa2df759beecf3f251c7dfac45968a61..8da244b1db15dab108fd14bb1406d560c8295764 100644 (file)
@@ -262,7 +262,7 @@ static void outliner_main_area_free(ARegion *UNUSED(ar))
        
 }
 
-static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void outliner_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -378,7 +378,7 @@ static void outliner_header_area_free(ARegion *UNUSED(ar))
 {
 }
 
-static void outliner_header_area_listener(ARegion *ar, wmNotifier *wmn)
+static void outliner_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index a6c4ac231df7c20f29008e87bab0d055c8ee8e48..fd2cd268a270768957d544fe9f2a4e1f1b88bcb5 100644 (file)
@@ -178,7 +178,7 @@ static void script_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void script_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
+static void script_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
 {
        /* context changes */
        // XXX - Todo, need the ScriptSpace accessible to get the python script to run.
index 08848645bf9fb2edb199c8bf76059c5d83a1518c..04b2a21bf792be0901148a666c12d784f08ad3fe 100644 (file)
@@ -318,7 +318,7 @@ static SpaceLink *sequencer_duplicate(SpaceLink *sl)
        return (SpaceLink *)sseqn;
 }
 
-static void sequencer_listener(ScrArea *sa, wmNotifier *wmn)
+static void sequencer_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -480,7 +480,7 @@ static void sequencer_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void sequencer_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -555,7 +555,7 @@ static void sequencer_preview_area_draw(const bContext *C, ARegion *ar)
 
 }
 
-static void sequencer_preview_area_listener(ARegion *ar, wmNotifier *wmn)
+static void sequencer_preview_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -612,7 +612,7 @@ static void sequencer_buttons_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void sequencer_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
+static void sequencer_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 92b6b78e53652bfa001d0b14a666b6c10a6cede2..e7fa4c05b9dccded9b8d6f185764631b1a679e0b 100644 (file)
@@ -116,7 +116,7 @@ static SpaceLink *text_duplicate(SpaceLink *sl)
        return (SpaceLink *)stextn;
 }
 
-static void text_listener(ScrArea *sa, wmNotifier *wmn)
+static void text_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
        SpaceText *st = sa->spacedata.first;
 
index 0f798aa18930b684b2764bb9a20d8f3f37a6f15c..8258d7178894e0d0cb6ba0bc99bf80983a96873e 100644 (file)
@@ -397,7 +397,7 @@ static void time_refresh(const bContext *UNUSED(C), ScrArea *sa)
 }
 
 /* editor level listener */
-static void time_listener(ScrArea *sa, wmNotifier *wmn)
+static void time_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
 {
 
        /* mainly for updating cache display */
@@ -523,7 +523,7 @@ static void time_main_area_draw(const bContext *C, ARegion *ar)
        UI_view2d_scrollers_free(scrollers);
 }
 
-static void time_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void time_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -563,7 +563,7 @@ static void time_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void time_header_area_listener(ARegion *ar, wmNotifier *wmn)
+static void time_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
index 5ebbebec35b4ad8e040371d6ef09b924bdbde923..0bd094b6a33eb06cf414f54134628be3e6aeaaf9 100644 (file)
@@ -138,12 +138,12 @@ static void userpref_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void userpref_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
+static void userpref_main_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
 {
        /* context changes */
 }
 
-static void userpref_header_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
+static void userpref_header_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
 {
        /* context changes */
 #if 0
index eb7adb7a333d56e9940aa2b909cb4d9081e8b6bc..b3d58bfa1b1b9f2a2694b88bc48fe63430f55f2b 100644 (file)
@@ -709,8 +709,10 @@ static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn, Scene *scene
        }
 }
 
-static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void view3d_main_area_listener(bScreen *sc, ScrArea *sa, ARegion *ar, wmNotifier *wmn)
 {
+       Scene *scene = sc->scene;
+       View3D *v3d = sa->spacedata.first;
        
        /* context changes */
        switch (wmn->category) {
@@ -799,6 +801,12 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
                        break;
                case NC_MATERIAL:
                        switch (wmn->data) {
+                               case ND_SHADING:
+                               case ND_NODES:
+                                       if ((v3d->drawtype == OB_MATERIAL) ||
+                                           (v3d->drawtype == OB_TEXTURE && scene->gm.matmode == GAME_MAT_GLSL))
+                                               ED_region_tag_redraw(ar);
+                                       break;
                                case ND_SHADING_DRAW:
                                case ND_SHADING_LINKS:
                                        ED_region_tag_redraw(ar);
@@ -822,7 +830,9 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
                case NC_LAMP:
                        switch (wmn->data) {
                                case ND_LIGHTING_DRAW:
-                                       ED_region_tag_redraw(ar);
+                                       if ((v3d->drawtype == OB_MATERIAL) ||
+                                           (v3d->drawtype == OB_TEXTURE && (scene->gm.matmode == GAME_MAT_GLSL)))
+                                               ED_region_tag_redraw(ar);
                                        break;
                        }
                        break;
@@ -907,7 +917,7 @@ static void view3d_header_area_draw(const bContext *C, ARegion *ar)
        ED_region_header(C, ar);
 }
 
-static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
+static void view3d_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -948,7 +958,7 @@ static void view3d_buttons_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, NULL, -1);
 }
 
-static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
+static void view3d_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -1048,7 +1058,7 @@ static void view3d_tools_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, CTX_data_mode_string(C), -1);
 }
 
-static void view3d_props_area_listener(ARegion *ar, wmNotifier *wmn)
+static void view3d_props_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
        switch (wmn->category) {
@@ -1068,7 +1078,7 @@ static void view3d_props_area_listener(ARegion *ar, wmNotifier *wmn)
 }
 
 /*area (not region) level listener*/
-static void space_view3d_listener(ScrArea *sa, struct wmNotifier *wmn)
+static void space_view3d_listener(bScreen *UNUSED(sc), ScrArea *sa, struct wmNotifier *wmn)
 {
        View3D *v3d = sa->spacedata.first;
 
index 8936609c7db6a35cf05bbd6d93781a5b3bc88685..fceb4e0a4d44d946d57dd582b669772f2ea7ea0a 100644 (file)
@@ -97,14 +97,7 @@ static void rna_Material_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *p
        Material *ma = ptr->id.data;
 
        DAG_id_tag_update(&ma->id, 0);
-       if (scene) {  /* can be NULL, see [#30025] */
-               if (scene->gm.matmode == GAME_MAT_GLSL) {
-                       WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, ma);
-               }
-               else {
-                       WM_main_add_notifier(NC_MATERIAL | ND_SHADING, ma);
-               }
-       }
+       WM_main_add_notifier(NC_MATERIAL | ND_SHADING, ma);
 }
 
 static void rna_Material_update_previews(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -114,10 +107,9 @@ static void rna_Material_update_previews(Main *bmain, Scene *scene, PointerRNA *
        if (ma->nodetree)
                BKE_node_preview_clear_tree(ma->nodetree);
                
-       WM_main_add_notifier(NC_MATERIAL | ND_SHADING, ma);
+       WM_main_add_notifier(NC_MATERIAL | ND_SHADING_PREVIEW, ma);
 }
 
-
 static void rna_Material_draw_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
 {
        Material *ma = ptr->id.data;
index cd3899897a1748a2fc3ab5c7be44338af82abd46..f1932c8aa97f2bbb6a205482150c2403765d581d 100644 (file)
@@ -302,6 +302,7 @@ typedef struct wmNotifier {
 #define        ND_SHADING                      (30<<16)
 #define        ND_SHADING_DRAW         (31<<16)
 #define        ND_SHADING_LINKS        (32<<16)
+#define        ND_SHADING_PREVIEW      (33<<16)
 
        /* NC_LAMP Lamp */
 #define        ND_LIGHTING                     (40<<16)
index ac714b09bb06b6a49c76c77945434c0ab83818e9..0bef59cfc55509e97eb8112c21fa1590b0a2d7b5 100644 (file)
@@ -148,9 +148,15 @@ static int wm_test_duplicate_notifier(wmWindowManager *wm, unsigned int type, vo
 void WM_event_add_notifier(const bContext *C, unsigned int type, void *reference)
 {
        ARegion *ar;
-       wmNotifier *note = MEM_callocN(sizeof(wmNotifier), "notifier");
+       wmWindowManager *wm = CTX_wm_manager(C);
+       wmNotifier *note;
+
+       if (wm_test_duplicate_notifier(wm, type, reference))
+               return;
+
+       note = MEM_callocN(sizeof(wmNotifier), "notifier");
        
-       note->wm = CTX_wm_manager(C);
+       note->wm = wm;
        BLI_addtail(&note->wm->queue, note);
        
        note->window = CTX_wm_window(C);
@@ -171,20 +177,22 @@ void WM_main_add_notifier(unsigned int type, void *reference)
 {
        Main *bmain = G.main;
        wmWindowManager *wm = bmain->wm.first;
+       wmNotifier *note;
 
-       if (wm && !wm_test_duplicate_notifier(wm, type, reference)) {
-               wmNotifier *note = MEM_callocN(sizeof(wmNotifier), "notifier");
-               
-               note->wm = wm;
-               BLI_addtail(&note->wm->queue, note);
-               
-               note->category = type & NOTE_CATEGORY;
-               note->data = type & NOTE_DATA;
-               note->subtype = type & NOTE_SUBTYPE;
-               note->action = type & NOTE_ACTION;
-               
-               note->reference = reference;
-       }
+       if (!wm || wm_test_duplicate_notifier(wm, type, reference))
+               return;
+
+       note = MEM_callocN(sizeof(wmNotifier), "notifier");
+       
+       note->wm = wm;
+       BLI_addtail(&note->wm->queue, note);
+       
+       note->category = type & NOTE_CATEGORY;
+       note->data = type & NOTE_DATA;
+       note->subtype = type & NOTE_SUBTYPE;
+       note->action = type & NOTE_ACTION;
+       
+       note->reference = reference;
 }
 
 /**
@@ -312,13 +320,13 @@ void wm_event_do_notifiers(bContext *C)
                                ED_screen_do_listen(C, note);
 
                                for (ar = win->screen->regionbase.first; ar; ar = ar->next) {
-                                       ED_region_do_listen(ar, note);
+                                       ED_region_do_listen(win->screen, NULL, ar, note);
                                }
                                
                                for (sa = win->screen->areabase.first; sa; sa = sa->next) {
-                                       ED_area_do_listen(sa, note);
+                                       ED_area_do_listen(win->screen, sa, note);
                                        for (ar = sa->regionbase.first; ar; ar = ar->next) {
-                                               ED_region_do_listen(ar, note);
+                                               ED_region_do_listen(win->screen, sa, ar, note);
                                        }
                                }
                        }