From b349297861b999e4203d06dbe7999072aea1797f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Oct 2015 15:56:46 +1100 Subject: [PATCH] File Read: de-duplicate command line file-load WM_file_read must support background mode already since it can be called by Python scripts in background mode. --- release/datafiles/locale | 2 +- release/scripts/addons | 2 +- release/scripts/addons_contrib | 2 +- .../blender/windowmanager/intern/wm_files.c | 15 ++- source/creator/creator.c | 93 ++++--------------- 5 files changed, 32 insertions(+), 82 deletions(-) diff --git a/release/datafiles/locale b/release/datafiles/locale index 4e1460519fb..c651e63a9a5 160000 --- a/release/datafiles/locale +++ b/release/datafiles/locale @@ -1 +1 @@ -Subproject commit 4e1460519fb76d8fe4b838334d139a3e8d446827 +Subproject commit c651e63a9a537624f639950f3127a1dee29205d0 diff --git a/release/scripts/addons b/release/scripts/addons index cd26c938e59..30b619e7652 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit cd26c938e597d7493f3d88dfdf69346c0f8b50ee +Subproject commit 30b619e76529a5ca99f96683f1b4a512d18cd519 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib index 34dc9b5a6a5..cf842d8bb7b 160000 --- a/release/scripts/addons_contrib +++ b/release/scripts/addons_contrib @@ -1 +1 @@ -Subproject commit 34dc9b5a6a5917db65ac589c40fe1b5fed3605d1 +Subproject commit cf842d8bb7b0033ca4fa99f7ebedcbd3810fd274 diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 58b4c914ad1..c54b06b4a2e 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -81,6 +81,7 @@ #include "BKE_packedFile.h" #include "BKE_report.h" #include "BKE_sound.h" +#include "BKE_scene.h" #include "BKE_screen.h" #include "BLO_readfile.h" @@ -476,6 +477,12 @@ static void wm_file_read_post(bContext *C, bool is_startup_file) BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_VERSION_UPDATE); BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_LOAD_POST); + /* would otherwise be handled by event loop */ + if (G.background) { + Main *bmain = CTX_data_main(C); + BKE_scene_update_tagged(bmain->eval_ctx, bmain, CTX_data_scene(C)); + } + WM_event_add_notifier(C, NC_WM | ND_FILEREAD, NULL); /* report any errors. @@ -491,9 +498,11 @@ static void wm_file_read_post(bContext *C, bool is_startup_file) CTX_wm_window_set(C, NULL); /* exits queues */ } -// undo_editmode_clear(); - BKE_undo_reset(); - BKE_undo_write(C, "original"); /* save current state */ + if (!G.background) { +// undo_editmode_clear(); + BKE_undo_reset(); + BKE_undo_write(C, "original"); /* save current state */ + } } bool WM_file_read(bContext *C, const char *filepath, ReportList *reports) diff --git a/source/creator/creator.c b/source/creator/creator.c index 517dcb1074f..40525bb3add 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -1361,6 +1361,8 @@ static int set_addons(int argc, const char **argv, void *data) static int load_file(int UNUSED(argc), const char **argv, void *data) { bContext *C = data; + ReportList reports; + bool success; /* Make the path absolute because its needed for relative linked blends to be found */ char filename[FILE_MAX]; @@ -1373,84 +1375,23 @@ static int load_file(int UNUSED(argc), const char **argv, void *data) BLI_strncpy(filename, argv[0], sizeof(filename)); BLI_path_cwd(filename, sizeof(filename)); - if (G.background) { - Main *bmain; - wmWindowManager *wm; - int retval; + /* load the file */ + BKE_reports_init(&reports, RPT_PRINT); + WM_file_autoexec_init(filename); + success = WM_file_read(C, filename, &reports); + BKE_reports_clear(&reports); - bmain = CTX_data_main(C); - - BLI_callback_exec(bmain, NULL, BLI_CB_EVT_LOAD_PRE); - - retval = BKE_read_file(C, filename, NULL); - - if (retval == BKE_READ_FILE_FAIL) { - /* failed to load file, stop processing arguments */ - if (G.background) { - /* Set is_break if running in the background mode so - * blender will return non-zero exit code which then - * could be used in automated script to control how - * good or bad things are. - */ - G.is_break = true; - } - return -1; + if (success == false) { + /* failed to load file, stop processing arguments */ + if (G.background) { + /* Set is_break if running in the background mode so + * blender will return non-zero exit code which then + * could be used in automated script to control how + * good or bad things are. + */ + G.is_break = true; } - - wm = CTX_wm_manager(C); - bmain = CTX_data_main(C); - - /* special case, 2.4x files */ - if (wm == NULL && BLI_listbase_is_empty(&bmain->wm)) { - extern void wm_add_default(bContext *C); - - /* wm_add_default() needs the screen to be set. */ - CTX_wm_screen_set(C, bmain->screen.first); - wm_add_default(C); - } - - CTX_wm_manager_set(C, NULL); /* remove wm to force check */ - WM_check(C); - if (bmain->name[0]) { - G.save_over = 1; - G.relbase_valid = 1; - } - else { - G.save_over = 0; - G.relbase_valid = 0; - } - - if (CTX_wm_manager(C) == NULL) { - CTX_wm_manager_set(C, wm); /* reset wm */ - } - - /* WM_file_read would call normally */ - ED_editors_init(C); - DAG_on_visible_update(bmain, true); - - /* WM_file_read() runs normally but since we're in background mode do here */ -#ifdef WITH_PYTHON - /* run any texts that were loaded in and flagged as modules */ - BPY_python_reset(C); -#endif - - BLI_callback_exec(bmain, NULL, BLI_CB_EVT_VERSION_UPDATE); - BLI_callback_exec(bmain, NULL, BLI_CB_EVT_LOAD_POST); - - BKE_scene_update_tagged(bmain->eval_ctx, bmain, CTX_data_scene(C)); - - /* happens for the UI on file reading too (huh? (ton))*/ - // XXX BKE_undo_reset(); - // BKE_undo_write("original"); /* save current state */ - } - else { - /* we are not running in background mode here, but start blender in UI mode with - * a file - this should do everything a 'load file' does */ - ReportList reports; - BKE_reports_init(&reports, RPT_PRINT); - WM_file_autoexec_init(filename); - WM_file_read(C, filename, &reports); - BKE_reports_clear(&reports); + return -1; } G.file_loaded = 1;