From 69511102de9b0f3ec6ad555baf2a01d9ee1c3dfd Mon Sep 17 00:00:00 2001 From: Magnus Auvinen Date: Sat, 13 Jun 2009 08:22:37 +0000 Subject: improved the font system even futher. utf8 is now used everywhere. it uses less memory as well --- src/game/client/lineinput.cpp | 49 ++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 15 deletions(-) (limited to 'src/game/client/lineinput.cpp') diff --git a/src/game/client/lineinput.cpp b/src/game/client/lineinput.cpp index 40c47d41..f8c9d7e7 100644 --- a/src/game/client/lineinput.cpp +++ b/src/game/client/lineinput.cpp @@ -21,23 +21,30 @@ void LINEINPUT::set(const char *string) cursor_pos = len; } -void LINEINPUT::process_input(INPUT_EVENT e) +void LINEINPUT::manipulate(INPUT_EVENT e, char *str, int str_max_size, int *str_len_ptr, int *cursor_pos_ptr) { + int cursor_pos = *cursor_pos_ptr; + int len = *str_len_ptr; + if(cursor_pos > len) cursor_pos = len; - char c = e.ch; + int code = e.unicode; int k = e.key; // 127 is produced on Mac OS X and corresponds to the delete key - if (!(c >= 0 && c < 32) && c != 127) + if (!(code >= 0 && code < 32) && code != 127) { - if (len < sizeof(str) - 1 && cursor_pos < sizeof(str) - 1) + char tmp[8]; + int charsize = str_utf8_encode(tmp, code); + + if (len < str_max_size - charsize && cursor_pos < str_max_size - charsize) { - memmove(str + cursor_pos + 1, str + cursor_pos, len - cursor_pos + 1); - str[cursor_pos] = c; - cursor_pos++; - len++; + memmove(str + cursor_pos + charsize, str + cursor_pos, len - cursor_pos + charsize); + for(int i = 0; i < charsize; i++) + str[cursor_pos+i] = tmp[i]; + cursor_pos += charsize; + len += charsize; } } @@ -45,22 +52,34 @@ void LINEINPUT::process_input(INPUT_EVENT e) { if (k == KEY_BACKSPACE && cursor_pos > 0) { - memmove(str + cursor_pos - 1, str + cursor_pos, len - cursor_pos + 1); - cursor_pos--; - len--; + int new_cursor_pos = str_utf8_rewind(str, cursor_pos); + int charsize = cursor_pos-new_cursor_pos; + memmove(str+new_cursor_pos, str+cursor_pos, len - charsize + 1); // +1 == null term + cursor_pos = new_cursor_pos; + len -= charsize; } else if (k == KEY_DELETE && cursor_pos < len) { - memmove(str + cursor_pos, str + cursor_pos + 1, len - cursor_pos); - len--; + int p = str_utf8_forward(str, cursor_pos); + int charsize = p-cursor_pos; + memmove(str + cursor_pos, str + cursor_pos + charsize, len - cursor_pos - charsize + 1); // +1 == null term + len -= charsize; } else if (k == KEY_LEFT && cursor_pos > 0) - cursor_pos--; + cursor_pos = str_utf8_rewind(str, cursor_pos); else if (k == KEY_RIGHT && cursor_pos < len) - cursor_pos++; + cursor_pos = str_utf8_forward(str, cursor_pos); else if (k == KEY_HOME) cursor_pos = 0; else if (k == KEY_END) cursor_pos = len; } + + *cursor_pos_ptr = cursor_pos; + *str_len_ptr = len; +} + +void LINEINPUT::process_input(INPUT_EVENT e) +{ + manipulate(e, str, sizeof(str), &len, &cursor_pos); } -- cgit 1.4.1