Notanik w ncurses - kilka pytań

0

No to jeszcze kilka pytań, piszę edytor tekstu w ncurses, oprogramowałem już edytowanie tekstu (Enter, Delete, kursory, Backspace i te sprawy), ale diabeł tkwi w szczegółach.

  1. Jeśli włączę kolory start_color() no to tło terminala staję się czarne i wprowadzony tekst będzie jasno szary. A ja bym chciał żeby to wróciło to białego tła i czarnego tekstu. Co prawda można użyć attrset(), ale ona zmienia tło tylko wprowadzonych znaków. A ja potrzebuje funkcji która by zmieniła całość.

  2. Jeśli stworze nowe okno to ono przykryję mi pewną część starego, czy jest możliwe usunięcie nowego okna i odkrycie tego co zasłoniło?

  3. Jeszcze jedne dość duży problem. Przy wprowadzaniu tekstu jeśli dojdziemy do końca ekranu to tekst przechodzi do następnego wiersza. A w notatniku tak być nie może. Tekst musi przechodzić poza prawą krawędź ekranu. Na dodatek okno musi się przesuwać jeśli chce dojść do część tekstu która jest zasłonięta. I to samo z dolna krawędzią ekranu.

Może ktoś coś doradzić?

0
  1. masz linuksa, wiec masz mana
  2. refresh/redraw na oknach ponizej, jesli znasz inny sposob, albo sposob na zapamietanie tla okna, to sam chetnie o tym uslysze.
  3. wrzucasz do okna dokladnie tyle znakow ile trzeba, ni mniej ni wiecej.

http://carramba.ath.cx/ftp/4programmers/ncurses-widgets/nc.c - simpleedittext (sorki za styl, mialem dziwna opcje zeby to w ten posob napisac)

0

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 :(

0

man getch

#include <curses.h>

int getch(void);
int wgetch(WINDOW *win);

a ty co masz ?

char input;

sam sobie obcinasz zakres

1 użytkowników online, w tym zalogowanych: 0, gości: 1