summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-07-25 23:14:59 +0000
committerrubidium <rubidium@openttd.org>2010-07-25 23:14:59 +0000
commit80cc566553ca1eb33566e0b05a49b7112d98718d (patch)
treedefede1eb59600b47a413257d23c1642504c1da2
parentb38c4f897a05208b9c740cf5446069d6bf2cbd9c (diff)
downloadopenttd-80cc566553ca1eb33566e0b05a49b7112d98718d.tar.xz
(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
-rw-r--r--known-bugs.txt9
-rw-r--r--src/misc_gui.cpp2
-rw-r--r--src/string.cpp12
3 files changed, 21 insertions, 2 deletions
diff --git a/known-bugs.txt b/known-bugs.txt
index ac5b2c5c9..415604416 100644
--- a/known-bugs.txt
+++ b/known-bugs.txt
@@ -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
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp
index 2fa779760..3250a3d1b 100644
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
@@ -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);
diff --git a/src/string.cpp b/src/string.cpp
index 79bf72c2d..414abf944 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -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;
+ }
}
}