Podepnę się pod temat. Piszę w ncurses funkcję umożliwiającą wygodne edytowanie zmiennych i pojawił się problem. Polega na tym, że jak przełączę się w tryb KEYPAD, to DELETE i "J" najwyraźniej uzyskują te same kody i przy włączonym keypadzie i zdefiniowanym KEY_DC w switchu próba wpisania "J" kasuje mi znak, a przy niezdefiniowanym mogę klawiszem DELETE wpisywać "J" : /
Kod (Definicje UNICODE są po to, żeby dla użytkowników tego kodowania pojawiały się na ekranie polskie znaki):
#include <ncurses.h>
#include <string>
#include <vector>
using std::string;
using std::vector;
string getstring(string base, int length)
{
string str;
noecho();
cbreak();
keypad(stdscr,TRUE);
char input;
vector<char> tmp;
string tmpstr;
float x,y, maxx;
int minx, wc, real_x, real_maxx;
getyx(stdscr,y,x);
minx = real_maxx = real_x = maxx = x;
for (string::const_iterator it = base.begin(); it != base.end(); it++)
{
tmp.push_back(*it);
#ifdef UNICODE
if (int(*it) < 0)
maxx += 0.5;
else
#endif
maxx++;
}
real_maxx = base.length()+x;
addstr(base.c_str());
wc = 0;
do
{
move(y,x);
refresh();
input = getch();
switch (input)
{
case KEY_UP:
case KEY_DOWN: break;
case KEY_LEFT:
{
if (x > minx) x--;
break;
}
case KEY_RIGHT:
{
if (x < maxx) x++;
break;
}
case KEY_DC:
{
if ((maxx-x) < 1) break;
tmp.erase(tmp.end()-(real_maxx-x));
delch();
maxx--;
real_maxx--;
break;
}
case 10: break;
default:
{
if (maxx == x)
tmp.push_back(input);
else
tmp.insert(tmp.end()-(real_maxx-x),input);
#ifdef UNICODE
if (int(input) < 0)
{
wc++;
tmpstr += input;
if (wc == 2)
{
wc = 0;
insstr(tmpstr.c_str());
tmpstr.clear();
}
x += 0.5;
maxx += 0.5;
real_x++;
real_maxx++;
}
else
#endif
{
insch(input);
x++;
maxx++;
real_x++;
real_maxx++;
}
}
}
}
while (input != 10);
for (vector<char>::const_iterator it = tmp.begin(); it != tmp.end(); it++)
str += *it;
return str;
}
int main()
{
setlocale(LC_ALL,"");
initscr();
addstr("Wpisz cos: ");
string var = "editme.";
var = getstring(var,50);
mvprintw(2,0,"wpisales: %s\n",var.c_str());
getch();
endwin();
return 0;
}
Kod jest niedokończony i nie działa poprawnie we wszystkich przypadkach (np. nie ma ograniczenia długości), ale chodzi tylko o ten problem litery "J".
flabra, w twoim programie działa i wpisywanie litery "J" i kasowanie znaków przy pomocy DELETE, ale nie dopatrzyłem się niczego, co wpływa na to, że u ciebie to działa, a u mnie nie :(