Dans le cadre d'un projet, je dois développer un éditeur de texte de type Vi. Pour cela, j'utilise la bibliothèque ncurses. J'arrive ainsi à gérer sans problèmes le curseur, à le déplacer, à insérer du texte, à supprimer des lignes, ...
Mais, lorsque j'insère du texte à la volée, j'ai un problème assez déconcertant : le texte se décale par endroits, et un retour à la ligne est observé (alors que l'insertion devrait s'arrêter). De plus, si j'insère à la volée sur plusieurs lignes, l'écart se présente souvent au même endroit.
Je vous livre ici le source, si quelqu'un voit ce qui pourrait m'aider, je l'en remercie d'avance...
#include <curses.h>
#include <signal.h>
#include "affichage.h"
int globalx;
int globaly;
////////////////////////////
// Initialise l'affichage //
////////////////////////////
void init_affichage()
{
(void) signal(SIGINT, arret_affichage);
(void) initscr();
keypad(stdscr, TRUE);
(void) nonl();
(void) cbreak();
(void) noecho();
globalx = 0;
globaly = 0;
}
////////////////////////////////////////////////
// Déplace le curseur à la position souhaitée //
////////////////////////////////////////////////
int dep_curseur(int x, int y)
{
int retour=0; // Renvoie 1 en cas de dépassement de coordonnées
if ((x>=COLS) || (y>=LINES) || (x<0) || (y<0)) retour=1;
else {
move(y,x);
globalx = x;
globaly = y;
refresh();
}
return retour;
}
/////////////////////////////////////////////////////
// Insere le caractere a la ligne l, en position x //
/////////////////////////////////////////////////////
int insereCar_affichage(char caractere, int ligne, int position)
{
int retour=0;
int ancienx=globalx;
int ancieny=globaly;
// On vérifie que l'on n'est pas en fin de ligne
if (1+position>=COLS) retour=1;
else {
// On affiche le caractère
dep_curseur(position, ligne);
//insch(caractere);
insch((char) (globalx/10) +'0');
dep_curseur(ancienx, ancieny);
refresh();
}
return retour;
}
//////////////////////////////////////
// Boucle principale de l'affichage //
//////////////////////////////////////
int affichage()
{
char chaineCar[2];
int i;
for(;;)
{
int c = getch();
case 'i': // insérer un texte au niveau du curseur
c=getch();
while ((c!='\e') && (globalx<COLS))
{
(void) insereCar_affichage((char) c, globaly, globalx);
(void) dep_curseur(globalx+1, globaly);
c=getch();
}
break;
case 'z': // arrêt de l'éditeur et enregistrement du fichier
return;
break;
default:
break;
}
}
}
static void arret_affichage(int sig)
{
endwin();
exit(0);
}
int main()
{
init_affichage();
affichage();
arret_affichage(0);
}
Pour compiler, je lance la commande suivante : gcc -lncurses affichage.c -o affichage