summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2005-01-06 15:54:09 +0000
committerdarkvater <darkvater@openttd.org>2005-01-06 15:54:09 +0000
commitbecd9c224e7bc322135c865b51ba080d1dba055e (patch)
tree38eba60cdfc61d054a660899e829960a11e1a5eb
parent5b7e224f468be596b231ac577144029fd9070e76 (diff)
downloadopenttd-becd9c224e7bc322135c865b51ba080d1dba055e.tar.xz
(svn r1398) -Feature: CTRL+V (Paste) now works on all editboxes. This includes 'Add Server', chat, etc. Feature is Windows only.
-rw-r--r--misc_gui.c65
1 files changed, 50 insertions, 15 deletions
diff --git a/misc_gui.c b/misc_gui.c
index 0dcd3a3c9..71727ebb7 100644
--- a/misc_gui.c
+++ b/misc_gui.c
@@ -772,9 +772,25 @@ void SetHScrollCount(Window *w, int num)
if (num < w->hscroll.pos) w->hscroll.pos = num;
}
+/* Get the count of characters in the string as well as the width in pixels
+ * [IN]buf: string to be checked
+ * [OUT]count: gets set to the count of characters
+ * [OUT]width: gets set to the pixels width */
+static void GetCurrentStringSize(const byte *buf, int *count, int *width)
+{
+ *count = 0;
+ *width = -1;
+
+ do {
+ if (*++buf == 0)
+ break;
+ (*count)++;
+ (*width) += _stringwidth_table[*buf - 32];
+ } while (1);
+}
+
int HandleEditBoxKey(Window *w, int wid, WindowEvent *we)
{
- byte *p;
int width,count;
int key = we->keypress.ascii;
@@ -784,16 +800,37 @@ int HandleEditBoxKey(Window *w, int wid, WindowEvent *we)
return 2;
} else if (we->keypress.keycode == WKC_RETURN) {
return 1;
+#ifdef WIN32
+ } else if (we->keypress.keycode == (WKC_CTRL | 'V')) {
+ if (IsClipboardFormatAvailable(CF_TEXT)) {
+ const byte* data;
+ HGLOBAL cbuf;
+
+ OpenClipboard(NULL);
+ cbuf = GetClipboardData(CF_TEXT);
+ data = GlobalLock(cbuf); // clipboard data
+
+ GetCurrentStringSize(WP(w,querystr_d).buf - 1, &count, &width);
+
+ /* IS_INT_INSIDE = filter for ascii-function codes like BELL and so on [we need an special filter here later] */
+ for (; (IS_INT_INSIDE(*data, ' ', 256)) && // valid ASCII char
+ (count < WP(w,querystr_d).maxlen - 1 && // max charcount; always allow for terminating '\0'
+ width + _stringwidth_table[(int)(*data) - 32] <= WP(w,querystr_d).maxwidth); ++data) { // max screensize
+
+ // append data and update size parameters
+ WP(w,querystr_d).buf[count] = *data;
+ count++;
+ width += _stringwidth_table[*data - 32];
+ }
+ WP(w,querystr_d).buf[count + 1] = '\0';
+
+ GlobalUnlock(cbuf);
+ CloseClipboard();
+ InvalidateWidget(w, wid);
+ }
+#endif
} else {
- width = -1;
- p = WP(w,querystr_d).buf - 1;
- count = 0;
- do {
- if (*++p == 0)
- break;
- count++;
- width += _stringwidth_table[*p - 32];
- } while (1);
+ GetCurrentStringSize(WP(w,querystr_d).buf - 1, &count, &width);
if (we->keypress.keycode == WKC_BACKSPACE) {
if (count != 0) {
@@ -801,15 +838,13 @@ int HandleEditBoxKey(Window *w, int wid, WindowEvent *we)
InvalidateWidget(w, wid);
}
} else if (IS_INT_INSIDE((key = we->keypress.ascii), 32, 256)) {
- if (count < WP(w,querystr_d).maxlen && width + _stringwidth_table[key-32] <= WP(w,querystr_d).maxwidth) {
+ if (count < WP(w,querystr_d).maxlen && width + _stringwidth_table[key - 32] <= WP(w,querystr_d).maxwidth) {
WP(w,querystr_d).buf[count] = key;
- WP(w,querystr_d).buf[count+1] = 0;
+ WP(w,querystr_d).buf[count + 1] = '\0';
InvalidateWidget(w, wid);
}
- } else {
- // key wasn't caught
+ } else // key wasn't caught
we->keypress.cont = true;
- }
}
return 0;