Pular para o conteúdo

Precisso de ajuda com função da curses.h

Responder tópico
  • Denunciar
  • Indicar

1. Precisso de ajuda com função da curses.h

Enviado em 07/12/2012 - 18:18h

Ola, estou desenvolvendo um editor de textos para modo texto, a principio consegui fazer quasi tudo apenas com as bibliotecas do C ANSI, porém na hora de editar o texto ja existente dentro de um arquivo e mover o cursor fui obrigado a recorrer a lib curses.h ai consegui me virar ate o ponto que o editor so ta faltando e fazer page down e page up para ser algo que preste já que mesmo conseguindo mover o cursor e editar o arquivo e salvar e tudo ele apenas mostra o primeiro trecho do arquivo aberto na tela e não sei como fazer o page down e page up, diferente de quando estava fazendo sem a lib curses onde o texto era aberto todo no terminal usando o scroll.

Por favor alguem me de uma luz. Obrigado desde já.

Responder tópico

2. Re: Precisso de ajuda com função da curses.h

Enviado em 08/12/2012 - 00:02h

O que você não soube fazer? Scroll das linhas? Obter as teclas de PageUp/PageDown? Calcular que partes de que linhas mostrar?

Sua questão ficou muito vaga, e uma resposta útil requer que você seja mais específico.

3. Re: Precisso de ajuda com função da curses.h

Enviado em 08/12/2012 - 19:43h

Na verdade vou me explicar melhor: eu uso uma estrutura switch case com uma variavel opCode que tem o valor das teclas presionadas no teclado. Porem tenho todos os comando como apagar caratere, apagar linha, mover cursor, ir selecionar tudo, selecionar linha, etc. O que ta me faltando é esta parte:

case KEY_PGDOWN:
case k:
qual função chamar aqui();
break;
case KEY_PGUP:
case l:
que função chamar aqui();
break;

....

ou caso não exista uma funçao especifica para isso na curses.h que é a lib que estou usando, Por favor me dem uma luz de como devo proceder para poder avançar e retroceder de pagina.

Obrigado desde já;

4. Re: Precisso de ajuda com função da curses.h

Enviado em 08/12/2012 - 19:53h

Eu não sou especialista em curses, mas uma coisq que eu garanto que vai funcionar é você redesenhar a tela com as linhas que devem aparecer. Por exemplo: se o arquivo tem 500 linhas mas a tela apenas 25, e a primeira linha mostrada é a linha 1, quando o usuário apertar PgDn, você manda escrever a 26ª linha do arquivo no topo da tela, a 27ª logo abaixo dela, e assim por diante, até a 50ª linha.

5. Re: Precisso de ajuda com função da curses.h

Enviado em 09/12/2012 - 20:06h

Obrigado consegui entender a logica do que voce falo mais não sei como implementar isso sera que se eu postar o codigo voce possa me ajudar vou le mostrar como ta meu codigo ate agora.

#include <stdio.h>
#include <curses.h>

#define CTRL(c) ((c) & 037)

/*Variavel gobal para definir a posição do cursor com cordenada x, y*/
int row, col;

int main(int argc,char **argv)
{
extern void perror(), exit();
int i, n, l;
int c;
int line = 0;
FILE *fd;

if (argc != 2)
{
fprintf(stderr, "Usage: %s file\n", argv[0]);
exit(1);
}

fd = fopen(argv[1], "r");
if (fd == NULL)
{
perror(argv[1]);
exit(2);
}

initscr();
cbreak();
nonl();
noecho();
idlok(stdscr, TRUE);
keypad(stdscr, TRUE);

/* Ler de dentro do arquivo */
while ((c = getc(fd)) != EOF)
{
if (c == '\n')
line++;
if (line > LINES - 2)
break;
addch(c);
}
fclose(fd);

move(0,0);
refresh();
edit();

/* Escrever no arquivo */
fd = fopen(argv[1], "w");
for (l = 0; l < LINES - 1; l++)
{
n = len(l);
for (i = 0; i < n; i++)
putc(mvinch(l, i) & A_CHARTEXT, fd);
putc('\n', fd);
}
fclose(fd);

endwin();
return 0;
}

len(int lineno)
{
int linelen = COLS - 1;

while (linelen >= 0 && mvinch(lineno, linelen) == ' ')
linelen--;
return linelen + 1;
}
edit()
{
int c;

while(1)
{
move(row, col);
refresh();
c = getch();

/* comandos do editor */
switch (c)
{

/* move o cursor nos quatro sentidos */
case 'h':
case KEY_LEFT:
if (col > 0)
col--;
else
flash();
break;

case 'j':
case KEY_DOWN:
if (row < LINES - 1)
row++;
else
flash();
break;

case 'k':
case KEY_UP:
if (row > 0)
row--;
else
flash();
break;

case 'l':
case KEY_RIGHT:
if (col < COLS - 1)
col++;
else
flash();
break;
/* i:entra em modo de entrada*/
case KEY_IC:
case 'i':
input();
break;

/* x: deleta um carater */
case KEY_DC:
case 'x':
delch();
break;

/* o: cria uma nova linha e entra em modo de entrada */
case KEY_IL:
case 'o':
move(++row, col = 0);
insertln();
input();
break;

/* d: deleta uma linha */
case KEY_DL:
case 'd':
deleteln();
break;

/* ^L: redesenha a tela */
case KEY_CLEAR:
case CTRL('L'):
wrefresh(curscr);
break;

/* w: salva e sai */
case 'w':
return;
/* q: sai sem salvar */
case 'q':
endwin();
exit(2);
default:
flash();
break;
}
}
}

/*
* modo de entrada aceita comando e pode sair dele com ^D or EIC
*/
input()
{
int c;

standout();
mvaddstr(LINES - 1, COLS - 20, "INPUT MODE");
standend();
move(row, col);
refresh();
for (;;)
{
c = getch();
if (c == CTRL('D') || c == KEY_EIC)
break;
insch(c);
move(row, ++col);
refresh();
}
move(LINES - 1, COLS - 20);
clrtoeol();
move(row, col);
refresh();
}

Acredito que me dando mais uma força vou conseguir :)

6. Re: Precisso de ajuda com função da curses.h

Enviado em 10/12/2012 - 10:54h

Outra coisa que estive vendo e que talvez seja melhor e ate mais simples é envez de usar page down e page up como o editor nano faz usar tipo uma rolagem como o editor vim faz porem to com o codigo do vim aqui mais não to conseguindo achar a parte onde ele faz essa rolagem. Espero que alguem me de uma dica. Obrigado

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder