support for wide characters in Window::GetString()

This commit is contained in:
Andrzej Rybczak
2008-12-20 14:37:44 +01:00
parent 8785f77b18
commit 094c4e3ab3

View File

@@ -353,10 +353,10 @@ void Window::WriteXY(int x, int y, bool cte, const char *format, ...) const
string Window::GetString(const string &base, size_t length, size_t width) const string Window::GetString(const string &base, size_t length, size_t width) const
{ {
int input; int input;
size_t beginning, maxbeginning, minx, x, y, maxx; size_t beginning, maxbeginning, minx, x, real_x, y, maxx, real_maxx;
getyx(itsWindow, y, x); getyx(itsWindow, y, x);
minx = maxx = x; minx = real_maxx = maxx = real_x = x;
width--; width--;
if (width == size_t(-1)) if (width == size_t(-1))
@@ -367,22 +367,28 @@ string Window::GetString(const string &base, size_t length, size_t width) const
string tmp_in; string tmp_in;
wchar_t wc_in; wchar_t wc_in;
bool gotoend = 1;
mbstate_t state; mbstate_t state;
memset(&state, 0, sizeof(state)); memset(&state, 0, sizeof(state));
maxbeginning = beginning = tmp.length() < width ? 0 : tmp.length()-width;
maxx += tmp.length() < width ? tmp.length() : width;
x = maxx;
do do
{ {
maxbeginning = tmp.length() < width ? 0 : tmp.length()-width; maxbeginning = tmp.length() < width ? 0 : tmp.length()-width;
maxx = minx + (tmp.length() < width ? tmp.length() : width); maxx = minx + (Length(tmp) < width ? Length(tmp) : width);
real_maxx = minx + (tmp.length() < width ? tmp.length() : width);
if (beginning > maxbeginning) if (beginning > maxbeginning)
beginning = maxbeginning; beginning = maxbeginning;
if (gotoend)
{
real_x = real_maxx;
x = maxx;
gotoend = 0;
}
mvwhline(itsWindow, y, minx, 32, width+1); mvwhline(itsWindow, y, minx, 32, width+1);
mvwprintw(itsWindow, y, minx, "%ls", tmp.substr(beginning, width+1).c_str()); mvwprintw(itsWindow, y, minx, "%ls", tmp.substr(beginning, width+1).c_str());
@@ -402,7 +408,10 @@ string Window::GetString(const string &base, size_t length, size_t width) const
case KEY_RIGHT: case KEY_RIGHT:
{ {
if (x < maxx) if (x < maxx)
x++; {
real_x++;
x += wcwidth(tmp[beginning+real_x-minx-1]);
}
else if (beginning < maxbeginning) else if (beginning < maxbeginning)
beginning++; beginning++;
break; break;
@@ -415,7 +424,10 @@ string Window::GetString(const string &base, size_t length, size_t width) const
case KEY_LEFT: case KEY_LEFT:
{ {
if (x > minx) if (x > minx)
x--; {
real_x--;
x -= wcwidth(tmp[beginning+real_x-minx]);
}
else if (beginning > 0) else if (beginning > 0)
beginning--; beginning--;
if (input != KEY_BACKSPACE && input != 127) if (input != KEY_BACKSPACE && input != 127)
@@ -423,21 +435,25 @@ string Window::GetString(const string &base, size_t length, size_t width) const
} }
case KEY_DC: case KEY_DC:
{ {
if ((x-minx)+beginning == tmp.length()) if ((real_x-minx)+beginning == tmp.length())
break; break;
tmp.erase(tmp.begin()+(x-minx)+beginning); tmp.erase(tmp.begin()+(real_x-minx)+beginning);
if (beginning && beginning == maxbeginning && x < maxx) if (beginning && beginning == maxbeginning && real_x < maxx)
{
real_x++;
x++; x++;
}
break; break;
} }
case KEY_HOME: case KEY_HOME:
{ {
x = minx; real_x = x = minx;
beginning = 0; beginning = 0;
break; break;
} }
case KEY_END: case KEY_END:
{ {
real_x = real_maxx;
x = maxx; x = maxx;
beginning = maxbeginning; beginning = maxbeginning;
break; break;
@@ -453,18 +469,25 @@ string Window::GetString(const string &base, size_t length, size_t width) const
if ((int)mbrtowc(&wc_in, tmp_in.c_str(), MB_CUR_MAX, &state) < 0) if ((int)mbrtowc(&wc_in, tmp_in.c_str(), MB_CUR_MAX, &state) < 0)
break; break;
if ((x-minx)+beginning >= tmp.length()) else if ((real_x-minx)+beginning >= tmp.length())
{ {
tmp.push_back(wc_in); tmp.push_back(wc_in);
if (!beginning) if (!beginning)
{
real_x++;
x++; x++;
}
beginning++; beginning++;
gotoend = 1;
} }
else else
{ {
tmp.insert(tmp.begin()+(x-minx)+beginning, wc_in); tmp.insert(tmp.begin()+(real_x-minx)+beginning, wc_in);
if (x < maxx) if (x < maxx)
x++; {
real_x++;
x += wcwidth(wc_in);
}
else if (beginning < maxbeginning) else if (beginning < maxbeginning)
beginning++; beginning++;
} }