mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-12 18:40:29 +00:00
(svn r24250) -Fix [FS#5154]: Do not immediately display error messages from parsing the cfg file, but schedule them for displaying after the GUI is prepared for it.
This commit is contained in:
parent
1ba36d07cf
commit
c6ed8c01b3
@ -42,6 +42,9 @@ public:
|
|||||||
~ErrorMessageData();
|
~ErrorMessageData();
|
||||||
ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration = 0, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
|
ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration = 0, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
|
||||||
|
|
||||||
|
void SetDParam(uint n, uint64 v);
|
||||||
|
void SetDParamStr(uint n, const char *str);
|
||||||
|
|
||||||
void CopyOutDParams();
|
void CopyOutDParams();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -136,6 +136,27 @@ void ErrorMessageData::CopyOutDParams()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a error string parameter.
|
||||||
|
* @param n Parameter index
|
||||||
|
* @param v Parameter value
|
||||||
|
*/
|
||||||
|
void ErrorMessageData::SetDParam(uint n, uint64 v)
|
||||||
|
{
|
||||||
|
this->decode_params[n] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a rawstring parameter.
|
||||||
|
* @param n Parameter index
|
||||||
|
* @param str Raw string
|
||||||
|
*/
|
||||||
|
void ErrorMessageData::SetDParamStr(uint n, const char *str)
|
||||||
|
{
|
||||||
|
free(this->strings[n]);
|
||||||
|
this->strings[n] = strdup(str);
|
||||||
|
}
|
||||||
|
|
||||||
/** Define a queue with errors. */
|
/** Define a queue with errors. */
|
||||||
typedef std::list<ErrorMessageData> ErrorList;
|
typedef std::list<ErrorMessageData> ErrorList;
|
||||||
/** The actual queue with errors. */
|
/** The actual queue with errors. */
|
||||||
@ -386,3 +407,13 @@ void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel
|
|||||||
new ErrmsgWindow(data);
|
new ErrmsgWindow(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule a list of errors.
|
||||||
|
* Note: This does not try to display the error now. This is useful if the window system is not yet running.
|
||||||
|
* @param data Error message datas; cleared afterwards
|
||||||
|
*/
|
||||||
|
void ScheduleErrorMessage(ErrorList &datas)
|
||||||
|
{
|
||||||
|
_error_list.splice(_error_list.end(), datas);
|
||||||
|
}
|
||||||
|
@ -77,6 +77,10 @@ GameSettings _settings_newgame; ///< Game settings for new games (updated from
|
|||||||
VehicleDefaultSettings _old_vds; ///< Used for loading default vehicles settings from old savegames
|
VehicleDefaultSettings _old_vds; ///< Used for loading default vehicles settings from old savegames
|
||||||
char *_config_file; ///< Configuration file of OpenTTD
|
char *_config_file; ///< Configuration file of OpenTTD
|
||||||
|
|
||||||
|
typedef std::list<ErrorMessageData> ErrorList;
|
||||||
|
static ErrorList _settings_error_list; ///< Errors while loading minimal settings.
|
||||||
|
|
||||||
|
|
||||||
typedef void SettingDescProc(IniFile *ini, const SettingDesc *desc, const char *grpname, void *object);
|
typedef void SettingDescProc(IniFile *ini, const SettingDesc *desc, const char *grpname, void *object);
|
||||||
typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList *list);
|
typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList *list);
|
||||||
|
|
||||||
@ -348,14 +352,16 @@ static const void *StringToVal(const SettingDescBase *desc, const char *orig_str
|
|||||||
char *end;
|
char *end;
|
||||||
size_t val = strtoul(str, &end, 0);
|
size_t val = strtoul(str, &end, 0);
|
||||||
if (end == str) {
|
if (end == str) {
|
||||||
SetDParamStr(0, str);
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE);
|
||||||
SetDParamStr(1, desc->name);
|
msg.SetDParamStr(0, str);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE, WL_CRITICAL);
|
msg.SetDParamStr(1, desc->name);
|
||||||
|
_settings_error_list.push_back(msg);
|
||||||
return desc->def;
|
return desc->def;
|
||||||
}
|
}
|
||||||
if (*end != '\0') {
|
if (*end != '\0') {
|
||||||
SetDParamStr(0, desc->name);
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_TRAILING_CHARACTERS);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_TRAILING_CHARACTERS, WL_CRITICAL);
|
msg.SetDParamStr(0, desc->name);
|
||||||
|
_settings_error_list.push_back(msg);
|
||||||
}
|
}
|
||||||
return (void*)val;
|
return (void*)val;
|
||||||
}
|
}
|
||||||
@ -367,29 +373,33 @@ static const void *StringToVal(const SettingDescBase *desc, const char *orig_str
|
|||||||
if (r == (size_t)-1 && desc->proc_cnvt != NULL) r = desc->proc_cnvt(str);
|
if (r == (size_t)-1 && desc->proc_cnvt != NULL) r = desc->proc_cnvt(str);
|
||||||
if (r != (size_t)-1) return (void*)r; // and here goes converted value
|
if (r != (size_t)-1) return (void*)r; // and here goes converted value
|
||||||
|
|
||||||
SetDParamStr(0, str);
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE);
|
||||||
SetDParamStr(1, desc->name);
|
msg.SetDParamStr(0, str);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE, WL_CRITICAL);
|
msg.SetDParamStr(1, desc->name);
|
||||||
|
_settings_error_list.push_back(msg);
|
||||||
return desc->def;
|
return desc->def;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDT_MANYOFMANY: {
|
case SDT_MANYOFMANY: {
|
||||||
size_t r = LookupManyOfMany(desc->many, str);
|
size_t r = LookupManyOfMany(desc->many, str);
|
||||||
if (r != (size_t)-1) return (void*)r;
|
if (r != (size_t)-1) return (void*)r;
|
||||||
SetDParamStr(0, str);
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE);
|
||||||
SetDParamStr(1, desc->name);
|
msg.SetDParamStr(0, str);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE, WL_CRITICAL);
|
msg.SetDParamStr(1, desc->name);
|
||||||
|
_settings_error_list.push_back(msg);
|
||||||
return desc->def;
|
return desc->def;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDT_BOOLX:
|
case SDT_BOOLX: {
|
||||||
if (strcmp(str, "true") == 0 || strcmp(str, "on") == 0 || strcmp(str, "1") == 0) return (void*)true;
|
if (strcmp(str, "true") == 0 || strcmp(str, "on") == 0 || strcmp(str, "1") == 0) return (void*)true;
|
||||||
if (strcmp(str, "false") == 0 || strcmp(str, "off") == 0 || strcmp(str, "0") == 0) return (void*)false;
|
if (strcmp(str, "false") == 0 || strcmp(str, "off") == 0 || strcmp(str, "0") == 0) return (void*)false;
|
||||||
|
|
||||||
SetDParamStr(0, str);
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE);
|
||||||
SetDParamStr(1, desc->name);
|
msg.SetDParamStr(0, str);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_VALUE, WL_CRITICAL);
|
msg.SetDParamStr(1, desc->name);
|
||||||
|
_settings_error_list.push_back(msg);
|
||||||
return desc->def;
|
return desc->def;
|
||||||
|
}
|
||||||
|
|
||||||
case SDT_STRING: return orig_str;
|
case SDT_STRING: return orig_str;
|
||||||
case SDT_INTLIST: return str;
|
case SDT_INTLIST: return str;
|
||||||
@ -531,8 +541,9 @@ static void IniLoadSettings(IniFile *ini, const SettingDesc *sd, const char *grp
|
|||||||
|
|
||||||
case SDT_INTLIST: {
|
case SDT_INTLIST: {
|
||||||
if (!LoadIntList((const char*)p, ptr, sld->length, GetVarMemType(sld->conv))) {
|
if (!LoadIntList((const char*)p, ptr, sld->length, GetVarMemType(sld->conv))) {
|
||||||
SetDParamStr(0, sdb->name);
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY, WL_CRITICAL);
|
msg.SetDParamStr(0, sdb->name);
|
||||||
|
_settings_error_list.push_back(msg);
|
||||||
|
|
||||||
/* Use default */
|
/* Use default */
|
||||||
LoadIntList((const char*)sdb->def, ptr, sld->length, GetVarMemType(sld->conv));
|
LoadIntList((const char*)sdb->def, ptr, sld->length, GetVarMemType(sld->conv));
|
||||||
@ -1648,6 +1659,11 @@ void LoadFromConfig(bool minimal)
|
|||||||
HandleOldDiffCustom(false);
|
HandleOldDiffCustom(false);
|
||||||
|
|
||||||
ValidateSettings();
|
ValidateSettings();
|
||||||
|
|
||||||
|
/* Display sheduled errors */
|
||||||
|
extern void ScheduleErrorMessage(ErrorList &datas);
|
||||||
|
ScheduleErrorMessage(_settings_error_list);
|
||||||
|
if (FindWindowById(WC_ERRMSG, 0) == NULL) ShowFirstError();
|
||||||
}
|
}
|
||||||
|
|
||||||
delete ini;
|
delete ini;
|
||||||
|
Loading…
Reference in New Issue
Block a user