support for wide characters in Window::GetString()
This commit is contained in:
@@ -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++;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user