(svn r20220) -Fix [FS#3974]: strip non-printable characters before showing it in an edit box, so when renaming a vehicle type you won't get the "SETX stuff" that some NewGRFs use

This commit is contained in:
rubidium 2010-07-25 23:14:59 +00:00
parent b38c4f897a
commit 80cc566553
3 changed files with 21 additions and 2 deletions

View File

@ -82,6 +82,15 @@ Long delay between switching songs/music
is the default driver for OpenTTD. You can change this default by
setting the "musicdriver" in your openttd.cfg to "dmusic".
Custom vehicle type name is incorrectly aligned
Some NewGRFs use sprites that are bigger than normal in the "buy
vehicle" window. Due to this they have to encode an offset for the
vehicle type name. Upon renaming the vehicle type this encoded offset
is stripped from the name because the "edit box" cannot show this
encoding. As a result the custom vehicle type names will get the
default alignment. The only way to (partly) fix this is by adding
spaces to the custom name.
Clipping problems [FS#119]
In some cases sprites are not drawn as one would expect. Examples of
this are aircraft that might be hidden below the runway or trees that

View File

@ -1282,7 +1282,7 @@ struct QueryStringWindow : public QueryStringBaseWindow
QueryStringBaseWindow(maxsize)
{
GetString(this->edit_str_buf, str, &this->edit_str_buf[maxsize - 1]);
this->edit_str_buf[maxsize - 1] = '\0';
str_validate(this->edit_str_buf, &this->edit_str_buf[maxsize - 1], false, true);
if ((flags & QSF_ACCEPT_UNCHANGED) == 0) this->orig = strdup(this->edit_str_buf);

View File

@ -113,7 +113,7 @@ void str_validate(char *str, const char *last, bool allow_newlines, bool ignore)
/* Assume the ABSOLUTE WORST to be in str as it comes from the outside. */
char *dst = str;
while (*str != '\0') {
while (str <= last && *str != '\0') {
size_t len = Utf8EncodedCharLen(*str);
/* If the character is unknown, i.e. encoded length is 0
* we assume worst case for the length check.
@ -146,6 +146,16 @@ void str_validate(char *str, const char *last, bool allow_newlines, bool ignore)
/* Replace the undesirable character with a question mark */
str += len;
if (!ignore) *dst++ = '?';
/* In case of these two special cases assume that they really
* mean SETX/SETXY and also "eat" the paramater. If this was
* not the case the string was broken to begin with and this
* would not break much more. */
if (c == SCC_SETX) {
str++;
} else if (c == SCC_SETXY) {
str += 2;
}
}
}