From f18ed7ad890ee5c89fc6e6a22e76c732fb5fc1bc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 1 Jun 2020 13:57:41 +1000 Subject: Fix T67577: Add-on unregister can't access preferences on factory reset --- source/blender/windowmanager/intern/wm_files.c | 24 +++++++++++++++++++++--- source/blender/windowmanager/wm_files.h | 6 +++--- 2 files changed, 24 insertions(+), 6 deletions(-) (limited to 'source/blender') diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index cc81e4f2715..1220c75f641 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -516,9 +516,13 @@ static void wm_file_read_post(bContext *C, BPY_execute_string( C, (const char *[]){"bl_app_template_utils", NULL}, "bl_app_template_utils.reset()"); } + } + + if (use_userdef) { /* sync addons, these may have changed from the defaults */ BPY_execute_string(C, (const char *[]){"addon_utils", NULL}, "addon_utils.reset_all()"); } + if (use_data) { BPY_python_reset(C); } @@ -767,9 +771,9 @@ const char *WM_init_state_app_template_get(void) void wm_homefile_read(bContext *C, ReportList *reports, bool use_factory_settings, - bool use_empty_data, - bool use_data, - bool use_userdef, + const bool use_empty_data, + const bool use_data, + const bool use_userdef, const char *filepath_startup_override, const char *app_template_override, bool *r_is_factory_startup) @@ -809,6 +813,20 @@ void wm_homefile_read(bContext *C, SET_FLAG_FROM_TEST(G.f, (U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0, G_FLAG_SCRIPT_AUTOEXEC); } + if (use_userdef) { +#ifdef WITH_PYTHON + /* This only runs once Blender has already started. */ + if (CTX_py_init_get(C)) { + /* This is restored by 'wm_file_read_post', disable before loading any preferences + * so an add-on can read their own preferences when un-registering, see T67577. + * + * Note that this would fit into a matching 'wm_file_read_pre' function, + * but this gets complicated by blend files not always loading, call inline instead. */ + BPY_execute_string(C, (const char *[]){"addon_utils", NULL}, "addon_utils.disable_all()"); + } +#endif /* WITH_PYTHON */ + } + if (use_data) { BKE_callback_exec_null(CTX_data_main(C), BKE_CB_EVT_LOAD_PRE); BLI_timer_on_file_load(); diff --git a/source/blender/windowmanager/wm_files.h b/source/blender/windowmanager/wm_files.h index e081742b904..a37eb6e777b 100644 --- a/source/blender/windowmanager/wm_files.h +++ b/source/blender/windowmanager/wm_files.h @@ -33,9 +33,9 @@ void wm_history_file_read(void); void wm_homefile_read(struct bContext *C, struct ReportList *reports, bool use_factory_settings, - bool use_empty_data, - bool use_data, - bool use_userdef, + const bool use_empty_data, + const bool use_data, + const bool use_userdef, const char *filepath_startup_override, const char *app_template_override, bool *r_is_factory_startup); -- cgit v1.2.3