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(&params);
-}
-
-/**
- * \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(&params);
+}
+
+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);