From 19d8859c49c93a09e70f7bdf9c635f3d674cff7c Mon Sep 17 00:00:00 2001
From: Philipp Oeser <philipp@blender.org>
Date: Mon, 19 Aug 2024 10:21:11 +0200
Subject: [PATCH] Revert "Fix #123327: Crash when operator with properties
 opens render window"

This reverts commit 5f102ad445e003501e41d9f76742154c3408c525.

Apparently this was on the backport list by mistake, a (safer) alternative was commited in 174f8de75e

This 5f102ad445e0 caused #126392 (which is still present in main), we dont want to release 4.2.1 with this though.

Then the current issue only needs to be fixed for 4.3 (main), and we can safely wait for @JulianEisel to be back to do so.

Pull Request: https://projects.blender.org/blender/blender/pulls/126487
---
 source/blender/editors/include/ED_screen.hh   |   6 +-
 source/blender/editors/screen/screen_edit.cc  | 158 ++++++++----------
 source/blender/windowmanager/intern/wm.cc     |   2 +-
 .../blender/windowmanager/intern/wm_draw.cc   |   4 +-
 .../windowmanager/intern/wm_operators.cc      |   2 +-
 .../blender/windowmanager/intern/wm_window.cc |   2 +-
 6 files changed, 77 insertions(+), 97 deletions(-)

diff --git a/source/blender/editors/include/ED_screen.hh b/source/blender/editors/include/ED_screen.hh
index 9d3de84cb75..9bfb9520085 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 1e1a220be79..68f4c509f67 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 b49a0b1df73..e90d0256b27 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 d041c71d09e..2e259347e94 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 3929d04d46c..5676badbf0a 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 26364fb97bd..00cce6e728b 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);
-- 
GitLab