Fix unnecessary 3D viewport redraws in various cases, in particular when editing

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.
This commit is contained in:
Brecht Van Lommel
2013-06-24 22:41:33 +00:00
parent 8390aa5181
commit 02fbfa5c70
26 changed files with 105 additions and 92 deletions

View 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 *);

View 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);

View 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;
}
}

View 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);
}
}

View 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) {

View 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;

View 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) {

View 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;

View 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) {

View 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;

View 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) {

View 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) {

View 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) {

View 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) {

View 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);

View 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) {

View 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) {

View 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.

View 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) {

View 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;

View 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) {

View 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

View 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;

View 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;

View 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)

View 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);
}
}
}