NCurses Texteditor - Backspace Taste?

Diskutiere NCurses Texteditor - Backspace Taste? im Developer Network Forum im Bereich Hardware & Software Forum; Guten Tag. Ich habe mir mal als Ziel gesetzt, einen Texteditor in C mit der ncurses.h (unter Linux) zu schreiben. Es klappt alles auch ganz gut...
  • NCurses Texteditor - Backspace Taste? Beitrag #1
Cheddar

Cheddar

Bekanntes Mitglied
Dabei seit
05.04.2009
Beiträge
453
Reaktionspunkte
0
Ort
Cheddar (Somerset)
Guten Tag.
Ich habe mir mal als Ziel gesetzt, einen Texteditor in C mit der ncurses.h (unter Linux) zu schreiben. Es klappt alles auch ganz gut, nur bei der Backspace-Taste hänge ich. Wenn ich einen Buchstaben eingebe, wird dieser zwar angezeigt, aber löschen kann ich ihn durch Backspace nicht.
Hier habe ich mal eine gekürzte Version des Codes geschrieben:
Code:
#include <curses.h>
#include <stdlib.h>

void quit(void)
{
  endwin();
}

void start(void)
{
	mvprintw(1,1,"Welcome to a new generation of text based text editing.");
	mvprintw(2,1,"Press Esc to exit.");
}

int main(void)
{
  initscr();
  atexit(quit);
  clear();
  noecho();
  curs_set(0);
  cbreak();
  keypad(stdscr, TRUE);
  int m=4;
  int n=2;
  refresh();
  int i=0;
  start();
  int col=1;
  while(i==0)
  {
	  mvprintw(m,0,"%d",col);
	  curs_set(0);
	  switch(getch()){
		///Escape:
		case 0x1B:
			i=1;
			break;
		///Backspace:
		case 0x8:
			mvprintw(m,n-1,"");
			fprintf(data,"\b");
			break;
		
		///(hier stehen case-Marken für alle Buchstaben und Zahlen
		}
		n++;
		if(n>COLS)
		{
			col++;
			if(col<10)
				n=2;
			if(col>9)
				n=3;
			if(col>99)
				n=4;
			m++;
		}
		///when all lines have been written:
		if(m==LINES)
		{
			clear();
			start(); 
			m=4; 
			n=2;
		}
  }
  return(0);
}

Wenn ich Backspace drücke, werden nur Leerzeichen "sichtbar" und der Cursor rückt nach vorne statt nach hinten zu rücken.
Ich denke mal, dass ich den falschen Code für Backspace eingegeben habe.
Mit "KEY_BACKSPACE" habe ich es auch schon versucht, es passiert genau das selbe.

Wie bekomme ich das hin?
Danke im Voraus,
Cheddar.
 
  • NCurses Texteditor - Backspace Taste? Beitrag #2
willikufalt

willikufalt

Bekanntes Mitglied
Dabei seit
28.08.2001
Beiträge
1.481
Reaktionspunkte
0
1. Die Abfrage auf Backspace funktioniert so nicht.

Unter Linux konnte ich das testweise mit case KEY_BACKSPACE: abfragen.


2. Du musst auch die Cursorposition anpassen. Die wird im Moment einfach eine Position weiter nach rechts verschoben, muss aber in Wirklichkeit ja um eine Position nach links gesetzt werden.

Zeilumbrüche, etc. mal ganz ausser Acht gelassen....
 
  • NCurses Texteditor - Backspace Taste? Beitrag #3
Cheddar

Cheddar

Bekanntes Mitglied
Dabei seit
05.04.2009
Beiträge
453
Reaktionspunkte
0
Ort
Cheddar (Somerset)
Mit case KEY_BACKSPACE: habe ich es auch schon versucht, nichts ist passiert.

Die Position wird nach links verschoben, siehe
Code:
mvprintw(m,n-1,"");
Der Cursor rückt nach vorne, weil es eine getch()-Abfrage ist. Wenn ich z.B. # eingeben würde (ein Zeichen, das im Code noch nicht integriert ist), würde das selbe passieren. Das bedeutet, dass die Backspace-Taste von getch() anscheinend nicht mit eingelesen wird... gibt es vielleicht eine Alternative zu getch()?
 
  • NCurses Texteditor - Backspace Taste? Beitrag #4
willikufalt

willikufalt

Bekanntes Mitglied
Dabei seit
28.08.2001
Beiträge
1.481
Reaktionspunkte
0
Hi !

1. Also, wie ich bereits geschrieben habe, habe ich den Code wie beschrieben angepasst und das funktioniert auch soweit wie gewünscht.

2. Die Cursorposition wird doch durch die Variable n repräsentiert.
n wird aber aber bei der Eingabe JEDES Zeichens um eins erhöht.
Das ist natürlich falsch!

3. Du solltest erst mal herausfinden, ob die Backspace-Taste nun erkannt wird, oder nicht einfach mal in dem entsprechenden Case-Fall ein mprint(m,n-1,"Test") einfügen, damit du auch sicher etwas siehst.

4. Allgemein solltest du natürlich auch mprint(m,n-1,"") durch mprint(m,n-1," ")ersetzen - du willst ja schließlich etwas löschen.
Hatte ich wohl noch vergessen, zu erwähnen.
 
  • NCurses Texteditor - Backspace Taste? Beitrag #5
Cheddar

Cheddar

Bekanntes Mitglied
Dabei seit
05.04.2009
Beiträge
453
Reaktionspunkte
0
Ort
Cheddar (Somerset)
3. Du solltest erst mal herausfinden, ob die Backspace-Taste nun erkannt wird, oder nicht einfach mal in dem entsprechenden Case-Fall ein mprint(m,n-1,"Test") einfügen, damit du auch sicher etwas siehst.

Ich habe das ebenfalls ausprobiert, aber es hat irgendwie nicht funktioniert. In einem normalen Texteditor funktioniert die Backspace-Taste, in nCurses-Anwendungen ebenfalls. Nur in meinem Editor nicht.
 
  • NCurses Texteditor - Backspace Taste? Beitrag #6
willikufalt

willikufalt

Bekanntes Mitglied
Dabei seit
28.08.2001
Beiträge
1.481
Reaktionspunkte
0
Ich habe dir mal meinen Testcode ´reinkopiert.
Kannst ja mal checken, ob der bei dir funktioniert.

Code:
#include <curses.h>
#include <stdlib.h>

using namespace std;

void quit(void)
{
  endwin();
}

void start(void)
{
    mvprintw(1,1,"Welcome to a new generation of text based text editing
.");
    mvprintw(2,1,"Press Esc to exit.");
}

int main(void)
{
  initscr();
  atexit(quit);
  clear();
  noecho();
  curs_set(0);
  cbreak();
  keypad(stdscr, TRUE);
  int m=4;
  int n=2;
  refresh();
  int i=0;
  start();
  int col=1;
  while(i==0)
  {
    mvprintw(m,0,"%d",col);
    curs_set(0);
    switch(getch()){
      // Escape:
    case 0x1B:
      i=1;
      break;
      // Backspace:
    case KEY_BACKSPACE:
      mvprintw(m,n-1," ");
      // fprintf(data,"\b");
      n--;n--;
      break;
    case 'c':
      mvprintw(m,n,"c");
      break;
    case 'I':
      mvprintw(m,n,"I");
      break;
    case 'h':
      mvprintw(m,n,"h");
      break;
    }
    n++;
    if(n>COLS)
      {
    col++;
    if(col<10)
      n=2;
    if(col>9)
      n=3;
    if(col>99)
      n=4;
    m++;
      }
    ///when all lines have been written:
      if(m==LINES)
    {
      clear();
      start(); 
      m=4; 
      n=2;
    }
  }
  return(0);
}
 
Thema:

NCurses Texteditor - Backspace Taste?

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben