diff --git a/source/blender/editors/include/ED_screen.hh b/source/blender/editors/include/ED_screen.hh index 9d3de84cb75ecbbbf1b95c6aeb78d52b11f43c2a..9bfb9520085ba99b3c70d918c6947e94725242c6 100644 --- a/source/blender/editors/include/ED_screen.hh +++ b/source/blender/editors/include/ED_screen.hh @@ -291,7 +291,7 @@ ScrArea *ED_screen_areas_iter_next(const bScreen *screen, const ScrArea *area); /** * File read, set all screens, .... */ -void ED_screens_init(bContext *C, Main *bmain, wmWindowManager *wm); +void ED_screens_init(Main *bmain, wmWindowManager *wm); /** * Only for edge lines between areas. */ @@ -301,8 +301,8 @@ void ED_screen_draw_edges(wmWindow *win); * Make this screen usable. * for file read and first use, for scaling window, area moves. */ -void ED_screen_refresh(bContext *C, wmWindowManager *wm, wmWindow *win); -void ED_screen_ensure_updated(bContext *C, wmWindowManager *wm, wmWindow *win); +void ED_screen_refresh(wmWindowManager *wm, wmWindow *win); +void ED_screen_ensure_updated(bContext *C, wmWindowManager *wm, wmWindow *win, bScreen *screen); void ED_screen_do_listen(bContext *C, const wmNotifier *note); /** * \brief Change the active screen. diff --git a/source/blender/editors/screen/screen_edit.cc b/source/blender/editors/screen/screen_edit.cc index 1e1a220be796b2cfebb0569fa9b3764235ad6f86..68f4c509f675b0a939768152422c8b32af268aec 100644 --- a/source/blender/editors/screen/screen_edit.cc +++ b/source/blender/editors/screen/screen_edit.cc @@ -658,86 +658,9 @@ void ED_screen_do_listen(bContext *C, const wmNotifier *note) } } -static bool region_poll(const bContext *C, - const bScreen *screen, - const ScrArea *area, - const ARegion *region) -{ - if (!region->type || !region->type->poll) { - /* Show region by default. */ - return true; - } - - RegionPollParams params = {nullptr}; - params.screen = screen; - params.area = area; - params.region = region; - params.context = C; - - return region->type->poll(¶ms); -} - -/** - * \return true if any region polling state changed, and a screen refresh is needed. - */ -static bool screen_regions_poll(bContext *C, const wmWindow *win, bScreen *screen) -{ - ScrArea *prev_area = CTX_wm_area(C); - ARegion *prev_region = CTX_wm_region(C); - - bool any_changed = false; - ED_screen_areas_iter (win, screen, area) { - CTX_wm_area_set(C, area); - - LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { - const int old_region_flag = region->flag; - - region->flag &= ~RGN_FLAG_POLL_FAILED; - - CTX_wm_region_set(C, region); - if (region_poll(C, screen, area, region) == false) { - region->flag |= RGN_FLAG_POLL_FAILED; - } - else if (region->type && region->type->on_poll_success) { - region->type->on_poll_success(C, region); - } - - if (old_region_flag != region->flag) { - any_changed = true; - - /* Enforce complete re-init. */ - region->v2d.flag &= ~V2D_IS_INIT; - ED_region_visibility_change_update(C, area, region); - } - } - } - - CTX_wm_area_set(C, prev_area); - CTX_wm_region_set(C, prev_region); - - return any_changed; -} - -/** - * \param force_full_refresh: If false, a full refresh will only be performed if the screen is - * tagged for refresh (#bScreen.do_refresh), or region polling changes require a refresh. - */ -static void screen_refresh(bContext *C, - wmWindowManager *wm, - wmWindow *win, - const bool force_full_refresh) +void ED_screen_refresh(wmWindowManager *wm, wmWindow *win) { bScreen *screen = WM_window_get_active_screen(win); - bool do_refresh = screen->do_refresh; - - /* Returns true if a change was done that requires refreshing. */ - if (screen_regions_poll(C, win, screen)) { - do_refresh = true; - } - - if (!force_full_refresh && !do_refresh) { - return; - } /* Exception for background mode, we only need the screen context. */ if (!G.background) { @@ -774,12 +697,7 @@ static void screen_refresh(bContext *C, screen->context = reinterpret_cast<void *>(ed_screen_context); } -void ED_screen_refresh(bContext *C, wmWindowManager *wm, wmWindow *win) -{ - screen_refresh(C, wm, win, /*force_full_refresh=*/true); -} - -void ED_screens_init(bContext *C, Main *bmain, wmWindowManager *wm) +void ED_screens_init(Main *bmain, wmWindowManager *wm) { LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { if (BKE_workspace_active_get(win->workspace_hook) == nullptr) { @@ -787,7 +705,7 @@ void ED_screens_init(bContext *C, Main *bmain, wmWindowManager *wm) static_cast<WorkSpace *>(bmain->workspaces.first)); } - ED_screen_refresh(C, wm, win); + ED_screen_refresh(wm, win); if (win->eventstate) { ED_screen_set_active_region(nullptr, win, win->eventstate->xy); } @@ -800,11 +718,71 @@ void ED_screens_init(bContext *C, Main *bmain, wmWindowManager *wm) } } -void ED_screen_ensure_updated(bContext *C, wmWindowManager *wm, wmWindow *win) +static bool region_poll(const bContext *C, + const bScreen *screen, + const ScrArea *area, + const ARegion *region) +{ + if (!region->type || !region->type->poll) { + /* Show region by default. */ + return true; + } + + RegionPollParams params = {nullptr}; + params.screen = screen; + params.area = area; + params.region = region; + params.context = C; + + return region->type->poll(¶ms); +} + +static void screen_regions_poll(bContext *C, const wmWindow *win, bScreen *screen) +{ + ScrArea *prev_area = CTX_wm_area(C); + ARegion *prev_region = CTX_wm_region(C); + + bool any_changed = false; + ED_screen_areas_iter (win, screen, area) { + CTX_wm_area_set(C, area); + + LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { + const int old_region_flag = region->flag; + + region->flag &= ~RGN_FLAG_POLL_FAILED; + + CTX_wm_region_set(C, region); + if (region_poll(C, screen, area, region) == false) { + region->flag |= RGN_FLAG_POLL_FAILED; + } + else if (region->type && region->type->on_poll_success) { + region->type->on_poll_success(C, region); + } + + if (old_region_flag != region->flag) { + any_changed = true; + + /* Enforce complete re-init. */ + region->v2d.flag &= ~V2D_IS_INIT; + ED_region_visibility_change_update(C, area, region); + } + } + } + + if (any_changed) { + screen->do_refresh = true; + } + + CTX_wm_area_set(C, prev_area); + CTX_wm_region_set(C, prev_region); +} + +void ED_screen_ensure_updated(bContext *C, wmWindowManager *wm, wmWindow *win, bScreen *screen) { - /* Only do a full refresh if required (checks #bScreen.do_refresh tag). */ - const bool force_full_refresh = false; - screen_refresh(C, wm, win, force_full_refresh); + screen_regions_poll(C, win, screen); + if (screen->do_refresh) { + ED_screen_refresh(wm, win); + } } void ED_region_remove(bContext *C, ScrArea *area, ARegion *region) @@ -1272,7 +1250,7 @@ void screen_change_update(bContext *C, wmWindow *win, bScreen *screen) CTX_wm_window_set(C, win); /* stores C->wm.screen... hrmf */ - ED_screen_refresh(C, CTX_wm_manager(C), win); + ED_screen_refresh(CTX_wm_manager(C), win); BKE_screen_view3d_scene_sync(screen, scene); /* sync new screen with scene data */ WM_event_add_notifier(C, NC_WINDOW, nullptr); diff --git a/source/blender/windowmanager/intern/wm.cc b/source/blender/windowmanager/intern/wm.cc index b49a0b1df731e639287f14789476a683f699f9af..e90d0256b275932ecffed053510c900c898c7c38 100644 --- a/source/blender/windowmanager/intern/wm.cc +++ b/source/blender/windowmanager/intern/wm.cc @@ -509,7 +509,7 @@ void WM_check(bContext *C) /* Case: file-read. */ /* NOTE: this runs in background mode to set the screen context cb. */ if ((wm->init_flag & WM_INIT_FLAG_WINDOW) == 0) { - ED_screens_init(C, bmain, wm); + ED_screens_init(bmain, wm); wm->init_flag |= WM_INIT_FLAG_WINDOW; } } diff --git a/source/blender/windowmanager/intern/wm_draw.cc b/source/blender/windowmanager/intern/wm_draw.cc index d041c71d09ed670c64ed5d8023afe3ff1ac036b3..2e259347e94a73d339de78e02a758649150498f0 100644 --- a/source/blender/windowmanager/intern/wm_draw.cc +++ b/source/blender/windowmanager/intern/wm_draw.cc @@ -1565,11 +1565,13 @@ void wm_draw_update(bContext *C) CTX_wm_window_set(C, win); if (wm_draw_update_test_window(bmain, C, win)) { + bScreen *screen = WM_window_get_active_screen(win); + /* Sets context window+screen. */ wm_window_make_drawable(wm, win); /* Notifiers for screen redraw. */ - ED_screen_ensure_updated(C, wm, win); + ED_screen_ensure_updated(C, wm, win, screen); wm_draw_window(C, win); wm_draw_update_clear_window(C, win); diff --git a/source/blender/windowmanager/intern/wm_operators.cc b/source/blender/windowmanager/intern/wm_operators.cc index 3929d04d46c396c83b060ae289b2afc2a2d70754..5676badbf0a709b794cfc005858fc82c8ee948bf 100644 --- a/source/blender/windowmanager/intern/wm_operators.cc +++ b/source/blender/windowmanager/intern/wm_operators.cc @@ -1889,7 +1889,7 @@ int WM_operator_redo_popup(bContext *C, wmOperator *op) static int wm_debug_menu_exec(bContext *C, wmOperator *op) { G.debug_value = RNA_int_get(op->ptr, "debug_value"); - ED_screen_refresh(C, CTX_wm_manager(C), CTX_wm_window(C)); + ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C)); WM_event_add_notifier(C, NC_WINDOW, nullptr); return OPERATOR_FINISHED; diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index 26364fb97bd3917ed250674a8b97bf766cd15b16..00cce6e728b905beda8f7f73926f80093646fd5f 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -1080,7 +1080,7 @@ wmWindow *WM_window_open(bContext *C, } /* Refresh screen dimensions, after the effective window size is known. */ - ED_screen_refresh(C, wm, win); + ED_screen_refresh(wm, win); if (win->ghostwin) { wm_window_raise(win);