Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-29 16:38:08 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-29 16:38:08 +0300
commit0a8a00cd1060ee7aa9eae4223fc8c2577533247f (patch)
tree6dc09a68c1d8e35bd807d784f3507b57c9c1f62f /source
parentd51bc24384a70f3cdcd4b72091873c96d542d642 (diff)
2.5: Error reporting
* Added a report list to operator, to which they can report errors and warnings. When the operator ends, it will display them with a popup. For python these should become exceptions when calling operators. * Added a function to make a popup menu from a report list. * Also added a utility function to prepend a string before the reports to indicate what they relates to. Also made the report functions used BLI_dynstr to simplify the code. * Made file reading and writing report errors to the user again using this system, also replacing the left over uncommented bad level error() calls.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_blender.h7
-rw-r--r--source/blender/blenkernel/BKE_report.h4
-rw-r--r--source/blender/blenkernel/intern/blender.c62
-rw-r--r--source/blender/blenkernel/intern/context.c25
-rw-r--r--source/blender/blenkernel/intern/report.c140
-rw-r--r--source/blender/blenlib/BLI_dynstr.h3
-rw-r--r--source/blender/blenlib/intern/BLI_dynstr.c14
-rw-r--r--source/blender/blenloader/BLO_readfile.h6
-rw-r--r--source/blender/blenloader/intern/readblenentry.c14
-rw-r--r--source/blender/blenloader/intern/readfile.c78
-rw-r--r--source/blender/blenloader/intern/readfile.h6
-rw-r--r--source/blender/blenloader/intern/writefile.c33
-rw-r--r--source/blender/editors/include/UI_interface.h2
-rw-r--r--source/blender/editors/interface/interface_regions.c29
-rw-r--r--source/blender/editors/space_file/filelist.c3
-rw-r--r--source/blender/makesdna/DNA_space_types.h30
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h2
-rw-r--r--source/blender/windowmanager/WM_api.h7
-rw-r--r--source/blender/windowmanager/intern/wm.c8
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c18
-rw-r--r--source/blender/windowmanager/intern/wm_files.c63
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c15
-rw-r--r--source/creator/creator.c10
23 files changed, 346 insertions, 233 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 5eb3de4404e..dbdb570b2f8 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -40,6 +40,7 @@ extern "C" {
struct ListBase;
struct MemFile;
struct bContext;
+struct ReportList;
#define BLENDER_VERSION 250
#define BLENDER_SUBVERSION 0
@@ -47,9 +48,9 @@ struct bContext;
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
-int BKE_read_file(struct bContext *C, char *dir, void *type_r);
-int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, void *type_r);
-int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile);
+int BKE_read_file(struct bContext *C, char *dir, void *type_r, struct ReportList *reports);
+int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, void *type_r, struct ReportList *reports);
+int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile, struct ReportList *reports);
void free_blender(void);
void initglobals(void);
diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h
index f87910d7872..8a5c623a225 100644
--- a/source/blender/blenkernel/BKE_report.h
+++ b/source/blender/blenkernel/BKE_report.h
@@ -49,7 +49,6 @@ typedef enum ReportType {
enum ReportListFlags {
RPT_PRINT = 1,
RPT_STORE = 2,
- RPT_HAS_ERROR = 4
};
typedef struct Report {
@@ -72,6 +71,9 @@ void BKE_reports_clear(ReportList *reports);
void BKE_report(ReportList *reports, ReportType type, const char *message);
void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...);
+void BKE_reports_prepend(ReportList *reports, const char *prepend);
+void BKE_reports_prependf(ReportList *reports, const char *prepend, ...);
+
ReportType BKE_report_print_level(ReportList *reports);
void BKE_report_print_level_set(ReportList *reports, ReportType level);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 7c2d4502e5e..1ae61bad8b2 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -424,15 +424,12 @@ static void handle_subversion_warning(Main *main)
2: OK, and with new user settings
*/
-int BKE_read_file(bContext *C, char *dir, void *unused)
+int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports)
{
- ReportList reports;
BlendFileData *bfd;
int retval= 1;
-
- BKE_reports_init(&reports, RPT_STORE);
- bfd= BLO_read_from_file(dir, &reports);
+ bfd= BLO_read_from_file(dir, reports);
if (bfd) {
if(bfd->user) retval= 2;
@@ -440,50 +437,35 @@ int BKE_read_file(bContext *C, char *dir, void *unused)
handle_subversion_warning(G.main);
}
- else {
-// XXX error("Loading %s failed: %s", dir, BLO_bre_as_string(bre));
- }
-
- BKE_reports_clear(&reports);
+ else
+ BKE_reports_prependf(reports, "Loading %s failed: ", dir);
return (bfd?retval:0);
}
-int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, void *unused)
+int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, void *unused, ReportList *reports)
{
- ReportList reports;
BlendFileData *bfd;
- BKE_reports_init(&reports, RPT_STORE);
-
- bfd= BLO_read_from_memory(filebuf, filelength, &reports);
- if (bfd) {
+ bfd= BLO_read_from_memory(filebuf, filelength, reports);
+ if (bfd)
setup_app_data(C, bfd, "<memory2>");
- } else {
-// XXX error("Loading failed: %s", BLO_bre_as_string(bre));
- }
-
- BKE_reports_clear(&reports);
+ else
+ BKE_reports_prepend(reports, "Loading failed: ");
return (bfd?1:0);
}
/* memfile is the undo buffer */
-int BKE_read_file_from_memfile(bContext *C, MemFile *memfile)
+int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *reports)
{
- ReportList reports;
BlendFileData *bfd;
-
- BKE_reports_init(&reports, RPT_STORE);
- bfd= BLO_read_from_memfile(CTX_data_main(C), G.sce, memfile, &reports);
- if (bfd) {
+ bfd= BLO_read_from_memfile(CTX_data_main(C), G.sce, memfile, reports);
+ if (bfd)
setup_app_data(C, bfd, "<memory1>");
- } else {
-// XXX error("Loading failed: %s", BLO_bre_as_string(bre));
- }
-
- BKE_reports_clear(&reports);
+ else
+ BKE_reports_prepend(reports, "Loading failed: ");
return (bfd?1:0);
}
@@ -516,10 +498,10 @@ static int read_undosave(bContext *C, UndoElem *uel)
G.fileflags |= G_FILE_NO_UI;
if(UNDO_DISK)
- success= BKE_read_file(C, uel->str, NULL);
+ success= BKE_read_file(C, uel->str, NULL, NULL);
else
- success= BKE_read_file_from_memfile(C, &uel->memfile);
-
+ success= BKE_read_file_from_memfile(C, &uel->memfile, NULL);
+
/* restore */
strcpy(G.sce, scestr);
G.fileflags= fileflags;
@@ -571,7 +553,6 @@ void BKE_write_undo(bContext *C, char *name)
/* disk save version */
if(UNDO_DISK) {
- ReportList reports;
static int counter= 0;
char tstr[FILE_MAXDIR+FILE_MAXFILE];
char numstr[32];
@@ -583,22 +564,17 @@ void BKE_write_undo(bContext *C, char *name)
sprintf(numstr, "%d.blend", counter);
BLI_make_file_string("/", tstr, btempdir, numstr);
- BKE_reports_init(&reports, 0);
- success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, &reports);
- BKE_reports_clear(&reports);
+ success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL);
strcpy(curundo->str, tstr);
}
else {
- ReportList reports;
MemFile *prevfile=NULL;
if(curundo->prev) prevfile= &(curundo->prev->memfile);
memused= MEM_get_memory_in_use();
- BKE_reports_init(&reports, 0);
- success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags, &reports);
- BKE_reports_clear(&reports);
+ success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags, NULL);
curundo->undosize= MEM_get_memory_in_use() - memused;
}
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index fa5740f74e9..aec497537cf 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -60,9 +60,6 @@ struct bContext {
struct ARegion *region;
struct uiBlock *block;
- bContextDataCallback screen_cb;
- bContextDataCallback area_cb;
- bContextDataCallback region_cb;
bContextDataCallback block_cb;
} wm;
@@ -191,26 +188,22 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
C->wm.window= win;
C->wm.screen= (win)? win->screen: NULL;
C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
- C->wm.screen_cb= (C->wm.screen)? C->wm.screen->context: NULL;
}
void CTX_wm_screen_set(bContext *C, bScreen *screen)
{
C->wm.screen= screen;
C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
- C->wm.screen_cb= (C->wm.screen)? C->wm.screen->context: NULL;
}
void CTX_wm_area_set(bContext *C, ScrArea *area)
{
C->wm.area= area;
- C->wm.area_cb= (area && area->type)? area->type->context: NULL;
}
void CTX_wm_region_set(bContext *C, ARegion *region)
{
C->wm.region= region;
- C->wm.region_cb= (region && region->type)? region->type->context: NULL;
}
void CTX_wm_ui_block_set(bContext *C, struct uiBlock *block, bContextDataCallback cb)
@@ -240,21 +233,25 @@ static int ctx_data_get(bContext *C, const bContextDataMember *member, bContextD
/* we check recursion to ensure that we do not get infinite
* loops requesting data from ourselfs in a context callback */
- if(!done && recursion < 1 && C->wm.block_cb) {
+ if(!done && recursion < 1 && C->wm.block) {
C->data.recursion= 1;
done= C->wm.block_cb(C, member, result);
}
- if(!done && recursion < 2 && C->wm.region_cb) {
+ if(!done && recursion < 2 && C->wm.region) {
C->data.recursion= 2;
- done= C->wm.region_cb(C, member, result);
+ if(C->wm.region->type->context)
+ done= C->wm.region->type->context(C, member, result);
}
- if(!done && recursion < 3 && C->wm.area_cb) {
+ if(!done && recursion < 3 && C->wm.area) {
C->data.recursion= 3;
- done= C->wm.area_cb(C, member, result);
+ if(C->wm.area->type->context)
+ done= C->wm.area->type->context(C, member, result);
}
- if(!done && recursion < 4 && C->wm.screen_cb) {
+ if(!done && recursion < 4 && C->wm.screen) {
+ bContextDataCallback cb= C->wm.screen->context;
C->data.recursion= 4;
- done= C->wm.screen_cb(C, member, result);
+ if(cb)
+ done= cb(C, member, result);
}
C->data.recursion= recursion;
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index 12fbaf806d5..97bbaf66b3a 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -30,6 +30,7 @@
#include "DNA_listBase.h"
#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
#include "BKE_report.h"
@@ -59,6 +60,9 @@ static char *report_type_str(int type)
void BKE_reports_init(ReportList *reports, int flag)
{
+ if(!reports)
+ return;
+
memset(reports, 0, sizeof(ReportList));
reports->storelevel= RPT_WARNING;
@@ -70,6 +74,9 @@ void BKE_reports_clear(ReportList *reports)
{
Report *report;
+ if(!reports)
+ return;
+
for(report=reports->list.first; report; report=report->next)
MEM_freeN(report->message);
@@ -81,18 +88,12 @@ void BKE_report(ReportList *reports, ReportType type, const char *message)
Report *report;
int len;
- if(!reports)
- return;
-
- if(type >= RPT_ERROR)
- reports->flag |= RPT_HAS_ERROR;
-
- if((reports->flag & RPT_PRINT) && (type >= reports->printlevel)) {
+ if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
printf("%s: %s\n", report_type_str(type), message);
fflush(stdout); /* this ensures the message is printed before a crash */
}
- if((reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
+ if(reports && (reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
report= MEM_callocN(sizeof(Report), "Report");
report->type= type;
report->typestr= report_type_str(type);
@@ -107,83 +108,110 @@ void BKE_report(ReportList *reports, ReportType type, const char *message)
void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
{
+ DynStr *ds;
Report *report;
va_list args;
- char *message;
- int len= 256, maxlen= 65536, retval;
-
- if(!reports)
- return;
-
- if(type >= RPT_ERROR)
- reports->flag |= RPT_HAS_ERROR;
- if((reports->flag & RPT_PRINT) && (type >= reports->printlevel)) {
+ if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
va_start(args, format);
vprintf(format, args);
va_end(args);
fflush(stdout); /* this ensures the message is printed before a crash */
}
- if((reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
- while(1) {
- message= MEM_callocN(sizeof(char)*len+1, "ReportMessage");
-
- va_start(args, format);
- retval= vsnprintf(message, len, format, args);
- va_end(args);
-
- if(retval == -1) {
- /* -1 means not enough space, but on windows it may also mean
- * there is a formatting error, so we impose a maximum length */
- MEM_freeN(message);
- message= NULL;
-
- len *= 2;
- if(len > maxlen) {
- fprintf(stderr, "BKE_reportf message too long or format error.\n");
- break;
- }
- }
- else if(retval > len) {
- /* in C99 the actual length required is returned */
- MEM_freeN(message);
- message= NULL;
-
- len= retval;
- }
- else
- break;
- }
-
- if(message) {
- report= MEM_callocN(sizeof(Report), "Report");
- report->type= type;
- report->typestr= report_type_str(type);
- report->message= message;
-
- BLI_addtail(&reports->list, report);
- }
+ if(reports && (reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
+ report= MEM_callocN(sizeof(Report), "Report");
+
+ ds= BLI_dynstr_new();
+ va_start(args, format);
+ BLI_dynstr_vappendf(ds, format, args);
+ va_end(args);
+
+ report->message= BLI_dynstr_get_cstring(ds);
+
+ BLI_dynstr_free(ds);
+
+ report->type= type;
+ report->typestr= report_type_str(type);
+
+ BLI_addtail(&reports->list, report);
+ }
+}
+
+void BKE_reports_prepend(ReportList *reports, const char *prepend)
+{
+ Report *report;
+ DynStr *ds;
+
+ if(!reports)
+ return;
+
+ for(report=reports->list.first; report; report=report->next) {
+ ds= BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, prepend);
+ BLI_dynstr_append(ds, report->message);
+ MEM_freeN(report->message);
+
+ report->message= BLI_dynstr_get_cstring(ds);
+
+ BLI_dynstr_free(ds);
+ }
+}
+
+void BKE_reports_prependf(ReportList *reports, const char *prepend, ...)
+{
+ Report *report;
+ DynStr *ds;
+ va_list args;
+
+ if(!reports)
+ return;
+
+ for(report=reports->list.first; report; report=report->next) {
+ ds= BLI_dynstr_new();
+ va_start(args, prepend);
+ BLI_dynstr_vappendf(ds, prepend, args);
+ va_end(args);
+
+ BLI_dynstr_append(ds, report->message);
+ MEM_freeN(report->message);
+
+ report->message= BLI_dynstr_get_cstring(ds);
+
+ BLI_dynstr_free(ds);
}
}
ReportType BKE_report_print_level(ReportList *reports)
{
+ if(!reports)
+ return RPT_ERROR;
+
return reports->printlevel;
}
void BKE_report_print_level_set(ReportList *reports, ReportType level)
{
+ if(!reports)
+ return;
+
reports->printlevel= level;
}
ReportType BKE_report_store_level(ReportList *reports)
{
+ if(!reports)
+ return RPT_ERROR;
+
return reports->storelevel;
}
void BKE_report_store_level_set(ReportList *reports, ReportType level)
{
+ if(!reports)
+ return;
+
reports->storelevel= level;
}
diff --git a/source/blender/blenlib/BLI_dynstr.h b/source/blender/blenlib/BLI_dynstr.h
index 453e15a0f3b..39bb4e9e113 100644
--- a/source/blender/blenlib/BLI_dynstr.h
+++ b/source/blender/blenlib/BLI_dynstr.h
@@ -38,6 +38,8 @@
#ifndef BLI_DYNSTR_H
#define BLI_DYNSTR_H
+#include <stdarg.h>
+
struct DynStr;
/** The abstract DynStr type */
@@ -65,6 +67,7 @@ void BLI_dynstr_append (DynStr *ds, const char *cstr);
* @param format The printf format string to use.
*/
void BLI_dynstr_appendf (DynStr *ds, const char *format, ...);
+void BLI_dynstr_vappendf (DynStr *ds, const char *format, va_list args);
/**
* Find the length of a DynStr.
diff --git a/source/blender/blenlib/intern/BLI_dynstr.c b/source/blender/blenlib/intern/BLI_dynstr.c
index 1c539af2957..04388ea946f 100644
--- a/source/blender/blenlib/intern/BLI_dynstr.c
+++ b/source/blender/blenlib/intern/BLI_dynstr.c
@@ -83,9 +83,8 @@ void BLI_dynstr_append(DynStr *ds, const char *cstr) {
ds->curlen+= cstrlen;
}
-void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
+void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
{
- va_list args;
char *message, fixedmessage[256];
int len= 256, maxlen= 65536, retval;
@@ -95,9 +94,7 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
else
message= MEM_callocN(sizeof(char)*len+1, "BLI_dynstr_appendf");
- va_start(args, format);
retval= vsnprintf(message, len, format, args);
- va_end(args);
if(retval == -1) {
/* -1 means not enough space, but on windows it may also mean
@@ -132,6 +129,15 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
}
}
+void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ BLI_dynstr_vappendf(ds, format, args);
+ va_end(args);
+}
+
int BLI_dynstr_get_len(DynStr *ds) {
return ds->curlen;
}
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 59289b7e74c..a09c45d0399 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -200,10 +200,10 @@ BLO_blendhandle_close(
char *BLO_gethome(void);
int BLO_has_bfile_extension(char *str);
-void BLO_library_append(struct SpaceFile *sfile, char *dir, int idcode, struct Main *mainvar, struct Scene *scene);
+void BLO_library_append(struct SpaceFile *sfile, char *dir, int idcode, struct Main *mainvar, struct Scene *scene, struct ReportList *reports);
void BLO_library_append_(BlendHandle **libfiledata, struct direntry* filelist, int totfile,
- char *dir, char* file, short flag, int idcode, struct Main *mainvar, struct Scene *scene);
-void BLO_script_library_append(BlendHandle **bh, char *dir, char *name, int idcode, short flag, struct Main *mainvar, struct Scene *scene);
+ char *dir, char* file, short flag, int idcode, struct Main *mainvar, struct Scene *scene, struct ReportList *reports);
+void BLO_script_library_append(BlendHandle **bh, char *dir, char *name, int idcode, short flag, struct Main *mainvar, struct Scene *scene, struct ReportList *reports);
BlendFileData* blo_read_blendafterruntime(int file, char *name, int actualsize, struct ReportList *reports);
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index e7e45597887..23e334fbbd1 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -166,12 +166,9 @@ int BLO_idcode_from_name(char *name)
BlendHandle *BLO_blendhandle_from_file(char *file)
{
- ReportList reports;
BlendHandle *bh;
- BKE_reports_init(&reports, 0);
- bh= (BlendHandle*)blo_openblenderfile(file, &reports);
- BKE_reports_clear(&reports);
+ bh= (BlendHandle*)blo_openblenderfile(file, NULL);
return bh;
}
@@ -330,7 +327,8 @@ BlendFileData *BLO_read_from_file(char *file, ReportList *reports)
fd = blo_openblenderfile(file, reports);
if (fd) {
- bfd= blo_read_file_internal(fd, reports);
+ fd->reports= reports;
+ bfd= blo_read_file_internal(fd);
if (bfd) {
bfd->type= BLENFILETYPE_BLEND;
strncpy(bfd->main->name, file, sizeof(bfd->main->name)-1);
@@ -348,7 +346,8 @@ BlendFileData *BLO_read_from_memory(void *mem, int memsize, ReportList *reports)
fd = blo_openblendermemory(mem, memsize, reports);
if (fd) {
- bfd= blo_read_file_internal(fd, reports);
+ fd->reports= reports;
+ bfd= blo_read_file_internal(fd);
if (bfd) {
bfd->type= BLENFILETYPE_BLEND;
strcpy(bfd->main->name, "");
@@ -367,6 +366,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
fd = blo_openblendermemfile(memfile, reports);
if (fd) {
+ fd->reports= reports;
strcpy(fd->filename, filename);
/* clear ob->proxy_from pointers in old main */
@@ -380,7 +380,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
/* makes lookup of existing images in old main */
blo_make_image_pointer_map(fd, oldmain);
- bfd= blo_read_file_internal(fd, reports);
+ bfd= blo_read_file_internal(fd);
if (bfd) {
bfd->type= BLENFILETYPE_BLEND;
strcpy(bfd->main->name, "");
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 399ce3d6ef8..1de3868a1c9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -150,8 +150,6 @@
#include "readfile.h"
-//XXX #include "wm_event_types.h"
-
#include <errno.h>
/*
@@ -3111,7 +3109,7 @@ static void lib_link_object(FileData *fd, Main *main)
ob= ob->id.next;
}
- if(warn) //XXX error("WARNING IN CONSOLE");
+ if(warn)
BKE_report(fd->reports, RPT_WARNING, "Warning in console");
}
@@ -3808,7 +3806,7 @@ static void lib_link_windowmanager(FileData *fd, Main *main)
}
}
-/* ************ READ SCREEN ***************** */
+/* ****************** READ GREASE PENCIL ***************** */
/* relinks grease-pencil data for 3d-view(s) - used for direct_link */
static void link_gpencil(FileData *fd, bGPdata *gpd)
@@ -3836,6 +3834,29 @@ static void link_gpencil(FileData *fd, bGPdata *gpd)
}
}
+/* ****************** READ SCREEN ***************** */
+
+static void butspace_version_132(SpaceButs *buts)
+{
+ buts->v2d.tot.xmin= 0.0f;
+ buts->v2d.tot.ymin= 0.0f;
+ buts->v2d.tot.xmax= 1279.0f;
+ buts->v2d.tot.ymax= 228.0f;
+
+ buts->v2d.min[0]= 256.0f;
+ buts->v2d.min[1]= 42.0f;
+
+ buts->v2d.max[0]= 2048.0f;
+ buts->v2d.max[1]= 450.0f;
+
+ buts->v2d.minzoom= 0.5f;
+ buts->v2d.maxzoom= 1.21f;
+
+ buts->v2d.scroll= 0;
+ buts->v2d.keepzoom= 1;
+ buts->v2d.keeptot= 1;
+}
+
/* note: file read without screens option G_FILE_NO_UI;
check lib pointers in call below */
static void lib_link_screen(FileData *fd, Main *main)
@@ -3887,7 +3908,8 @@ static void lib_link_screen(FileData *fd, Main *main)
SpaceButs *sbuts= (SpaceButs *)sl;
sbuts->lockpoin= NULL;
sbuts->ri= NULL;
-// XXX if(main->versionfile<132) set_rects_butspace(sbuts);
+ if(main->versionfile<132)
+ butspace_version_132(sbuts);
}
else if(sl->spacetype==SPACE_FILE) {
SpaceFile *sfile= (SpaceFile *)sl;
@@ -4189,6 +4211,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
link_list(fd, &(sc->edgebase));
link_list(fd, &(sc->areabase));
sc->regionbase.first= sc->regionbase.last= NULL;
+ sc->context= NULL;
sc->mainwin= sc->subwinactive= 0; /* indices */
@@ -4340,7 +4363,6 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
BLI_remlink(&main->library, lib);
MEM_freeN(lib);
- //XXX error("Library had multiple instances, save and reload!");
BKE_report(fd->reports, RPT_WARNING, "Library had multiple instances, save and reload!");
return;
@@ -5602,8 +5624,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
SpaceLink *sl= sa->spacedata.first;
while(sl) {
if(sl->spacetype==SPACE_BUTS) {
- //SpaceButs *sbuts= (SpaceButs*) sl;
- //XXX sbuts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK;
+ SpaceButs *sbuts= (SpaceButs*) sl;
+ sbuts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK;
}
sl= sl->next;
}
@@ -6254,8 +6276,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sbuts->v2d.maxzoom= 1.2f;
sbuts->align= 1; /* horizontal default */
- //XXX
-#if 0
if(sbuts->mainb==BUTS_LAMP) {
sbuts->mainb= CONTEXT_SHADING;
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
@@ -6299,7 +6319,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sbuts->mainb= CONTEXT_EDITING;
}
else sbuts->mainb= CONTEXT_SCENE;
-#endif
}
}
}
@@ -8424,7 +8443,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
return bhead;
}
-BlendFileData *blo_read_file_internal(FileData *fd, ReportList *reports)
+BlendFileData *blo_read_file_internal(FileData *fd)
{
BHead *bhead= blo_firstbhead(fd);
BlendFileData *bfd;
@@ -9480,26 +9499,33 @@ static Library* library_append(Main *mainvar, Scene *scene, char* file, char *di
/* this should probably be moved into the Python code anyway */
void BLO_script_library_append(BlendHandle **bh, char *dir, char *name,
- int idcode, short flag, Main *mainvar, Scene *scene)
+ int idcode, short flag, Main *mainvar, Scene *scene, ReportList *reports)
{
+ FileData *fd= (FileData*)(*bh);
+
/* try to append the requested object */
- library_append(mainvar, scene, name, dir, idcode, 0, (FileData **)bh, NULL, 0, flag );
+ fd->reports= reports;
+ library_append(mainvar, scene, name, dir, idcode, 0, &fd, NULL, 0, flag );
+ if(fd) fd->reports= NULL;
/* do we need to do this? */
DAG_scene_sort(scene);
+
+ *bh= (BlendHandle*)fd;
}
/* append to scene */
/* dir is a full path */
-void BLO_library_append(SpaceFile *sfile, char *dir, int idcode, Main *mainvar, Scene *scene)
+void BLO_library_append(SpaceFile *sfile, char *dir, int idcode, Main *mainvar, Scene *scene, ReportList *reports)
{
BLO_library_append_(&sfile->libfiledata, sfile->filelist, sfile->totfile,
- dir, sfile->file, sfile->flag, idcode, mainvar, scene);
+ dir, sfile->file, sfile->flag, idcode, mainvar, scene, reports);
}
-void BLO_library_append_(BlendHandle** libfiledata, struct direntry* filelist, int totfile,
- char *dir, char* file, short flag, int idcode, Main *mainvar, Scene *scene)
+void BLO_library_append_(BlendHandle** bh, struct direntry* filelist, int totfile,
+ char *dir, char* file, short flag, int idcode, Main *mainvar, Scene *scene, ReportList *reports)
{
+ FileData *fd= (FileData*)(*bh);
Library *curlib;
Base *centerbase;
Object *ob;
@@ -9519,12 +9545,12 @@ void BLO_library_append_(BlendHandle** libfiledata, struct direntry* filelist, i
if( strcmp(filelist[a].relname, file)==0) break;
}
if(a==totfile) {
- //XXX error("Wrong indicated name");
+ BKE_report(reports, RPT_ERROR, "Wrong indicated name");
return;
}
}
else {
- //XXX error("Nothing indicated");
+ BKE_report(reports, RPT_ERROR, "Nothing indicated");
return;
}
}
@@ -9532,7 +9558,11 @@ void BLO_library_append_(BlendHandle** libfiledata, struct direntry* filelist, i
if(flag & FILE_AUTOSELECT) scene_deselect_all(scene);
- curlib = library_append(mainvar, scene, file, dir, idcode, totsel, (FileData**) libfiledata, filelist, totfile,flag );
+ fd->reports= reports;
+ curlib = library_append(mainvar, scene, file, dir, idcode, totsel, &fd, filelist, totfile,flag );
+ if(fd) fd->reports= NULL;
+
+ *bh= (BlendHandle*)fd;
/* when not linking (appending)... */
if((flag & FILE_LINK)==0) {
@@ -9614,9 +9644,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
ReportList reports;
printf("read library: lib %s\n", mainptr->curlib->name);
- BKE_reports_init(&reports, 0);
fd= blo_openblenderfile(mainptr->curlib->filename, &reports);
- BKE_reports_clear(&reports);
+ fd->reports= basefd->reports;
if (fd) {
if (fd->libmap)
@@ -9731,7 +9760,8 @@ BlendFileData *blo_read_blendafterruntime(int file, char *name, int actualsize,
if (!fd)
return NULL;
- bfd= blo_read_file_internal(fd, reports);
+ fd->reports= reports;
+ bfd= blo_read_file_internal(fd);
blo_freefiledata(fd);
return bfd;
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index 08797d36084..b084e377d19 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -107,10 +107,10 @@ struct Main;
void blo_join_main(ListBase *mainlist);
void blo_split_main(ListBase *mainlist, struct Main *main);
-BlendFileData *blo_read_file_internal( FileData *fd, struct ReportList *reports);
+BlendFileData *blo_read_file_internal(FileData *fd);
-FileData *blo_openblenderfile( char *name, struct ReportList *reports);
-FileData *blo_openblendermemory( void *buffer, int buffersize, struct ReportList *reports);
+FileData *blo_openblenderfile(char *name, struct ReportList *reports);
+FileData *blo_openblendermemory(void *buffer, int buffersize, struct ReportList *reports);
FileData *blo_openblendermemfile(struct MemFile *memfile, struct ReportList *reports);
void blo_clear_proxy_pointers_from_lib(FileData *fd, Main *oldmain);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 7c7325ab8fa..1b8db72f4ec 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2265,20 +2265,22 @@ cleanup:
if (runtime)
MEM_freeN(runtime);
- return !(reports->flag & RPT_HAS_ERROR);
+ return !BKE_reports_have_error(reports);
}
int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *reports)
{
char gamename[FILE_MAXDIR+FILE_MAXFILE];
- int outfd = -1;
+ int outfd = -1, error= 0;
// remove existing file / bundle
//printf("Delete file %s\n", file);
BLI_delete(file, 0, TRUE);
- if (!recursive_copy_runtime(file, exename, reports))
+ if (!recursive_copy_runtime(file, exename, reports)) {
+ error= 1;
goto cleanup;
+ }
strcpy(gamename, file);
strcat(gamename, "/Contents/Resources/game.blend");
@@ -2290,18 +2292,20 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo
if (write(outfd, " ", 1) != 1) {
BKE_report(reports, RPT_ERROR, "Unable to write to output file.");
+ error= 1;
goto cleanup;
}
} else {
BKE_report(reports, RPT_ERROR, "Unable to open blenderfile.");
+ error= 1;
}
cleanup:
if (outfd!=-1)
close(outfd);
- //XXX error("Unable to make runtime: %s", cause);
- return !(reports->flag & RPT_HAS_ERROR);
+ BKE_reports_prepend(reports, "Unable to make runtime: ");
+ return !error;
}
#else /* !__APPLE__ */
@@ -2310,22 +2314,25 @@ static int handle_append_runtime(int handle, char *exename, ReportList *reports)
{
char *runtime= get_runtime_path(exename);
unsigned char buf[1024];
- int count, progfd= -1;
+ int count, progfd= -1, error= 0;
if (!BLI_exists(runtime)) {
BKE_report(reports, RPT_ERROR, "Unable to find runtime.");
+ error= 1;
goto cleanup;
}
progfd= open(runtime, O_BINARY|O_RDONLY, 0);
if (progfd==-1) {
BKE_report(reports, RPT_ERROR, "Unable to find runtime.@");
+ error= 1;
goto cleanup;
}
while ((count= read(progfd, buf, sizeof(buf)))>0) {
if (write(handle, buf, count)!=count) {
BKE_report(reports, RPT_ERROR, "Unable to write to output file.");
+ error= 1;
goto cleanup;
}
}
@@ -2336,7 +2343,7 @@ cleanup:
if (runtime)
MEM_freeN(runtime);
- return !(reports->flag & RPT_HAS_ERROR);
+ return !error;
}
static int handle_write_msb_int(int handle, int i)
@@ -2353,14 +2360,17 @@ static int handle_write_msb_int(int handle, int i)
int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *reports)
{
int outfd= open(file, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777);
- int datastart;
+ int datastart, error= 0;
if (!outfd) {
BKE_report(reports, RPT_ERROR, "Unable to open output file.");
+ error= 1;
goto cleanup;
}
- if (!handle_append_runtime(outfd, exename, reports))
+ if (!handle_append_runtime(outfd, exename, reports)) {
+ error= 1;
goto cleanup;
+ }
datastart= lseek(outfd, 0, SEEK_CUR);
@@ -2368,6 +2378,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo
if (!handle_write_msb_int(outfd, datastart) || (write(outfd, "BRUNTIME", 8)!=8)) {
BKE_report(reports, RPT_ERROR, "Unable to write to output file.");
+ error= 1;
goto cleanup;
}
@@ -2375,8 +2386,8 @@ cleanup:
if (outfd!=-1)
close(outfd);
- //XXX error("Unable to make runtime: %s", cause);
- return !(reports->flag & RPT_HAS_ERROR);
+ BKE_reports_prepend(reports, "Unable to make runtime: ");
+ return !error;
}
#endif /* !__APPLE__ */
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 3b0c9beb70b..69232d41efe 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -40,6 +40,7 @@ struct AutoComplete;
struct bContext;
struct PointerRNA;
struct PropertyRNA;
+struct ReportList;
/* uiBlock->dt */
#define UI_EMBOSS 0 /* use one of the themes for drawing */
@@ -216,6 +217,7 @@ void uiPupmenuOkee(struct bContext *C, char *opname, char *str, ...);
void uiPupmenuSaveOver(struct bContext *C, char *opname, char *filename, ...);
void uiPupmenuNotice(struct bContext *C, char *str, ...);
void uiPupmenuError(struct bContext *C, char *str, ...);
+void uiPupmenuReports(struct bContext *C, struct ReportList *reports);
/* Block */
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 063255bed86..72a0fd811d0 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -36,8 +36,10 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
#include "BKE_context.h"
+#include "BKE_report.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -1765,3 +1767,30 @@ void uiPupmenuError(bContext *C, char *str, ...)
va_end(ap);
}
+void uiPupmenuReports(bContext *C, ReportList *reports)
+{
+ Report *report;
+ DynStr *ds;
+ char *str;
+
+ if(!reports || !reports->list.first)
+ return;
+ if(!CTX_wm_window(C))
+ return;
+
+ ds= BLI_dynstr_new();
+
+ for(report=reports->list.first; report; report=report->next) {
+ if(report->type >= RPT_ERROR)
+ BLI_dynstr_appendf(ds, "Error %%i%d%%t|%s", ICON_ERROR, report->message);
+ else if(report->type >= RPT_WARNING)
+ BLI_dynstr_appendf(ds, "Warning %%i%d%%t|%s", ICON_ERROR, report->message);
+ }
+
+ str= BLI_dynstr_get_cstring(ds);
+ uiPupmenu(C, 0, NULL, NULL, str);
+ MEM_freeN(str);
+
+ BLI_dynstr_free(ds);
+}
+
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 337f553e246..5b5ff95d37c 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -907,7 +907,8 @@ void filelist_from_library(struct FileList* filelist)
void filelist_append_library(struct FileList *filelist, char *dir, char *file, short flag, int idcode, struct Main *mainvar, struct Scene* scene)
{
- BLO_library_append_(&filelist->libfiledata, filelist->filelist, filelist->numfiles, dir, file, flag, idcode, mainvar, scene);
+ // XXX todo: replace NULL with op->reports
+ BLO_library_append_(&filelist->libfiledata, filelist->filelist, filelist->numfiles, dir, file, flag, idcode, mainvar, scene, NULL);
}
void filelist_from_main(struct FileList *filelist)
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 1aec7856da4..f5b3ffbd687 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -447,6 +447,23 @@ typedef struct SpaceImaSel {
#define CONTEXT_SCRIPT 5
#define CONTEXT_LOGIC 6
+/* sbuts->mainb old */
+#define BUTS_VIEW 0
+#define BUTS_LAMP 1
+#define BUTS_MAT 2
+#define BUTS_TEX 3
+#define BUTS_ANIM 4
+#define BUTS_WORLD 5
+#define BUTS_RENDER 6
+#define BUTS_EDIT 7
+#define BUTS_GAME 8
+#define BUTS_FPAINT 9
+#define BUTS_RADIO 10
+#define BUTS_SCRIPT 11
+#define BUTS_SOUND 12
+#define BUTS_CONSTRAINT 13
+#define BUTS_EFFECTS 14
+
/* sbuts->tab new */
#define TAB_SHADING_MAT 0
#define TAB_SHADING_TEX 1
@@ -471,6 +488,19 @@ typedef struct SpaceImaSel {
#define BUT_HORIZONTAL 1
#define BUT_VERTICAL 2
+/* sbuts->scaflag */
+#define BUTS_SENS_SEL 1
+#define BUTS_SENS_ACT 2
+#define BUTS_SENS_LINK 4
+#define BUTS_CONT_SEL 8
+#define BUTS_CONT_ACT 16
+#define BUTS_CONT_LINK 32
+#define BUTS_ACT_SEL 64
+#define BUTS_ACT_ACT 128
+#define BUTS_ACT_LINK 256
+#define BUTS_SENS_STATE 512
+#define BUTS_ACT_STATE 1024
+
/* these values need to be hardcoded in structs, dna does not recognize defines */
/* also defined in BKE */
#define FILE_MAXDIR 160
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 05ed8ab77c4..d4d54195146 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -50,6 +50,7 @@ struct wmSubWindow;
struct wmTimer;
struct StructRNA;
struct PointerRNA;
+struct ReportList;
/* windowmanager is saved, tag WMAN */
typedef struct wmWindowManager {
@@ -188,6 +189,7 @@ typedef struct wmOperator {
wmOperatorType *type; /* operator type definition from idname */
void *customdata; /* custom storage, only while operator runs */
struct PointerRNA *ptr; /* rna pointer to access properties */
+ struct ReportList *reports; /* errors and warnings storage */
} wmOperator;
/* operator type exec(), invoke() modal(), return values */
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index a28b3f8b86e..36198087d22 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -50,8 +50,8 @@ wmWindow *WM_window_open (struct bContext *C, struct rcti *rect);
/* files */
int WM_read_homefile (struct bContext *C, int from_memory);
int WM_write_homefile (struct bContext *C, struct wmOperator *op);
-void WM_read_file (struct bContext *C, char *name);
-void WM_write_file (struct bContext *C, char *target);
+void WM_read_file (struct bContext *C, char *name, struct ReportList *reports);
+void WM_write_file (struct bContext *C, char *target, struct ReportList *reports);
void WM_read_autosavefile(struct bContext *C);
void WM_write_autosave (struct bContext *C);
@@ -111,9 +111,6 @@ int WM_menu_invoke (struct bContext *C, struct wmOperator *op, struct wmEven
int WM_operator_confirm (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
/* poll callback, context checks */
int WM_operator_winactive (struct bContext *C);
-
- /* default error box */
-void WM_error(struct bContext *C, char *str);
/* operator api */
void WM_operator_free (struct wmOperator *op);
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 725e9cd989e..a5e11a12c5a 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -34,9 +34,10 @@
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_idprop.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_idprop.h"
+#include "BKE_report.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -65,6 +66,11 @@ void WM_operator_free(wmOperator *op)
if(op->ptr)
MEM_freeN(op->ptr);
+ if(op->reports) {
+ BKE_reports_clear(op->reports);
+ MEM_freeN(op->reports);
+ }
+
MEM_freeN(op);
}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index f241fb7f91e..d76b7ebebd4 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -44,6 +44,7 @@
#include "BKE_context.h"
#include "BKE_idprop.h"
#include "BKE_global.h"
+#include "BKE_report.h"
#include "BKE_utildefines.h"
#include "ED_screen.h"
@@ -52,6 +53,8 @@
#include "RNA_access.h"
+#include "UI_interface.h"
+
#include "WM_api.h"
#include "WM_types.h"
#include "wm.h"
@@ -336,6 +339,10 @@ int WM_operator_call(bContext *C, wmOperator *op)
if(op->type->exec)
retval= op->type->exec(C, op);
+
+ if(!(retval & OPERATOR_RUNNING_MODAL))
+ if(op->reports->list.first)
+ uiPupmenuReports(C, op->reports);
if((retval & OPERATOR_FINISHED) && (op->type->flag & OPTYPE_REGISTER)) {
wm_operator_register(CTX_wm_manager(C), op);
@@ -364,6 +371,9 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, I
op->ptr= MEM_callocN(sizeof(PointerRNA), "wmOperatorPtrRNA");
RNA_pointer_create(&RNA_WindowManager, &wm->id, ot->srna, &op->properties, op->ptr);
+ op->reports= MEM_callocN(sizeof(ReportList), "wmOperatorReportList");
+ BKE_reports_init(op->reports, RPT_STORE);
+
if(op->type->invoke && event)
retval= (*op->type->invoke)(C, op, event);
else if(op->type->exec)
@@ -374,6 +384,10 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, I
if(G.f & G_DEBUG)
WM_operator_print(op);
+ if(!(retval & OPERATOR_RUNNING_MODAL))
+ if(op->reports->list.first)
+ uiPupmenuReports(C, op->reports);
+
if((retval & OPERATOR_FINISHED) && (ot->flag & OPTYPE_REGISTER)) {
wm_operator_register(wm, op);
}
@@ -588,6 +602,10 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
CTX_wm_area_set(C, NULL);
CTX_wm_region_set(C, NULL);
}
+
+ if(!(retval & OPERATOR_RUNNING_MODAL))
+ if(op->reports->list.first)
+ uiPupmenuReports(C, op->reports);
if((retval & OPERATOR_FINISHED) && (ot->flag & OPTYPE_REGISTER)) {
wm_operator_register(CTX_wm_manager(C), op);
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 2c05ce07f48..02c45751246 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -481,7 +481,7 @@ static void verse_unsub(void)
}
#endif
-void WM_read_file(bContext *C, char *name)
+void WM_read_file(bContext *C, char *name, ReportList *reports)
{
int retval;
@@ -501,7 +501,7 @@ void WM_read_file(bContext *C, char *name)
/* put aside screens to match with persistant windows later */
wm_window_match_init(C, &wmbase);
- retval= BKE_read_file(C, name, NULL);
+ retval= BKE_read_file(C, name, NULL, reports);
/* match the read WM with current WM */
wm_window_match_do(C, &wmbase);
@@ -524,8 +524,10 @@ void WM_read_file(bContext *C, char *name)
}
// else if(retval==1)
// XXX BIF_undo_push("Import file");
- else if(retval == -1)
- WM_error(C, "Cannot read file");
+ else if(retval == -1) {
+ if(reports && reports->list.first == NULL)
+ BKE_report(reports, RPT_ERROR, "Cannot read file.");
+ }
}
static void outliner_242_patch(void)
@@ -573,9 +575,9 @@ int WM_read_homefile(bContext *C, int from_memory)
wm_window_match_init(C, &wmbase);
if (!from_memory && BLI_exists(tstr)) {
- success = BKE_read_file(C, tstr, NULL);
+ success = BKE_read_file(C, tstr, NULL, NULL);
} else {
- success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL);
+ success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL, NULL);
/* outliner patch for 2.42 .b.blend */
outliner_242_patch();
}
@@ -643,7 +645,7 @@ void WM_read_autosavefile(bContext *C)
get_autosave_location(tstr);
save_over = G.save_over;
- BKE_read_file(C, tstr, NULL);
+ BKE_read_file(C, tstr, NULL, NULL);
G.save_over = save_over;
BLI_strncpy(G.sce, scestr, FILE_MAX);
}
@@ -781,7 +783,7 @@ static void writeBlog(void)
}
}
-static void do_history(char *name)
+static void do_history(char *name, ReportList *reports)
{
char tempname1[FILE_MAXDIR+FILE_MAXFILE], tempname2[FILE_MAXDIR+FILE_MAXFILE];
int hisnr= U.versions;
@@ -789,12 +791,12 @@ static void do_history(char *name)
if(U.versions==0) return;
if(strlen(name)<2) return;
- while( hisnr > 1) {
+ while(hisnr > 1) {
sprintf(tempname1, "%s%d", name, hisnr-1);
sprintf(tempname2, "%s%d", name, hisnr);
-// if(BLI_rename(tempname1, tempname2))
-// XXX error("Unable to make version backup");
+ if(BLI_rename(tempname1, tempname2))
+ BKE_report(reports, RPT_ERROR, "Unable to make version backup");
hisnr--;
}
@@ -802,22 +804,21 @@ static void do_history(char *name)
/* is needed when hisnr==1 */
sprintf(tempname1, "%s%d", name, hisnr);
-// if(BLI_rename(name, tempname1))
-// XXX error("Unable to make version backup");
+ if(BLI_rename(name, tempname1))
+ BKE_report(reports, RPT_ERROR, "Unable to make version backup");
}
-void WM_write_file(bContext *C, char *target)
+void WM_write_file(bContext *C, char *target, ReportList *reports)
{
Library *li;
int writeflags, len;
char di[FILE_MAX];
- ReportList reports;
len = strlen(target);
if (len == 0) return;
if (len >= FILE_MAX) {
-// XXX error("Path too long, cannot save");
+ BKE_report(reports, RPT_ERROR, "Path too long, cannot save");
return;
}
@@ -826,7 +827,7 @@ void WM_write_file(bContext *C, char *target)
for (li= G.main->library.first; li; li= li->id.next) {
if (BLI_streq(li->name, target)) {
-// XXX error("Cannot overwrite used library");
+ BKE_report(reports, RPT_ERROR, "Cannot overwrite used library");
return;
}
}
@@ -851,16 +852,14 @@ void WM_write_file(bContext *C, char *target)
// XXX waitcursor(1); // exit_editmode sets cursor too
- do_history(di);
+ do_history(di, reports);
/* we use the UserDef to define compression flag */
writeflags= G.fileflags & ~G_FILE_COMPRESS;
if(U.flag & USER_FILECOMPRESS)
writeflags |= G_FILE_COMPRESS;
-
- BKE_reports_init(&reports, RPT_STORE);
- if (BLO_write_file(CTX_data_main(C), di, writeflags, &reports)) {
+ if (BLO_write_file(CTX_data_main(C), di, writeflags, reports)) {
strcpy(G.sce, di);
G.relbase_valid = 1;
strcpy(G.main->name, di); /* is guaranteed current file */
@@ -870,38 +869,29 @@ void WM_write_file(bContext *C, char *target)
G.save_over = 1;
writeBlog();
- } else {
-// XXX error("%s", err);
}
- BKE_reports_clear(&reports);
-
// XXX waitcursor(0);
}
/* operator entry */
int WM_write_homefile(bContext *C, wmOperator *op)
{
- ReportList reports;
char tstr[FILE_MAXDIR+FILE_MAXFILE];
int write_flags;
- BLI_make_file_string("/", tstr, BLI_gethome(), ".B.blend");
+ BLI_make_file_string("/", tstr, "/", ".B.blend");
/* force save as regular blend file */
write_flags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN);
- // XXX error reporting to the user
- BKE_reports_init(&reports, RPT_PRINT);
- BLO_write_file(CTX_data_main(C), tstr, write_flags, &reports);
- BKE_reports_clear(&reports);
+ BLO_write_file(CTX_data_main(C), tstr, write_flags, op->reports);
return OPERATOR_FINISHED;
}
void WM_write_autosave(bContext *C)
{
- ReportList reports;
char tstr[FILE_MAXDIR+FILE_MAXFILE];
int write_flags;
@@ -910,9 +900,8 @@ void WM_write_autosave(bContext *C)
/* force save as regular blend file */
write_flags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN);
- BKE_reports_init(&reports, RPT_PRINT);
- BLO_write_file(CTX_data_main(C), tstr, write_flags, &reports);
- BKE_reports_clear(&reports);
+ /* error reporting to console */
+ BLO_write_file(CTX_data_main(C), tstr, write_flags, NULL);
}
/* if global undo; remove tempsave, otherwise rename */
@@ -933,7 +922,3 @@ void delete_autosave(void)
/***/
-
-
-
-
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 236efb8f8e4..7d2c4a12ef4 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -195,17 +195,6 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-/* call anywhere */
-void WM_error(bContext *C, char *str)
-{
- char buf[148], testbuf[128];
-
- BLI_strncpy(testbuf, str, 128);
- sprintf(buf, "Error %%i%d%%t|%s", ICON_ERROR, testbuf);
- uiPupmenu(C, 0, NULL, NULL, buf);
-
-}
-
/* op->invoke */
int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
{
@@ -276,11 +265,11 @@ static int recentfile_exec(bContext *C, wmOperator *op)
if(event>0) {
if (G.sce[0] && (event==1))
- WM_read_file(C, G.sce);
+ WM_read_file(C, G.sce, op->reports);
else {
struct RecentFile *recent = BLI_findlink(&(G.recent_files), event-2);
if(recent) {
- WM_read_file(C, recent->filename);
+ WM_read_file(C, recent->filename, op->reports);
}
}
}
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 0d0f4f7bb01..6e62fe10d40 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -61,6 +61,7 @@
#include "BKE_packedFile.h"
#include "BKE_scene.h"
#include "BKE_node.h"
+#include "BKE_report.h"
#include "IMB_imbuf.h" // for quicktime_init
@@ -71,9 +72,8 @@
#include "RE_pipeline.h"
//XXX #include "playanim_ext.h"
-#include "wm_event_types.h"
#include "ED_datafiles.h"
-//XXX #include "datatoc.h"
+#include "UI_interface.h"
#include "WM_api.h"
@@ -784,7 +784,7 @@ int main(int argc, char **argv)
BLI_convertstringcwd(filename);
if (G.background) {
- int retval = BKE_read_file(C, argv[a], NULL);
+ int retval = BKE_read_file(C, argv[a], NULL, NULL);
// XXX sound_initialize_sounds();
/*we successfully loaded a blend file, get sure that
@@ -797,7 +797,7 @@ int main(int argc, char **argv)
} 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 */
- WM_read_file(C, filename);
+ WM_read_file(C, filename, NULL);
}
}
}
@@ -827,7 +827,7 @@ static void error_cb(char *err)
static void mem_error_cb(char *errorStr)
{
- fprintf(stderr, errorStr);
+ fprintf(stderr, "%s", errorStr);
fflush(stderr);
}