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

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

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

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á.


  


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

Paulo
paulo1205

(usa Ubuntu)

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

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

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

Paulo
paulo1205

(usa Ubuntu)

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

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

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

Jose Maria Micoli
Cr4sh_Dump

(usa Debian)

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






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts