Ir para conteúdo
Fórum Script Brasil
  • 0

Ncurses e a janela do terminal?


jth.

Pergunta

Olá, sou um iniciante em C (primeiro semestre de eng. de computação =p) e no mundo Linux/GNU e estou tendo alguns problemas com a "ncurses".

O que está acontecendo parece bobagem, mas não sei resolver, já andei lendo por aí, mas até agora nada.

Quando uso ncurses e a função initscr(), para inicializar a biblioteca, ele cria uma nova "window" no terminal e é nessa window que o resto do programa roda usando funções de saída e entrada diferentes das habituais (printw() em vez de printf, por exemplo). Até aí tudo bem, o meu problema é que essa nova "window" não habilita a "barra de rolagem" quando necessário. Quando a janelinha "enche" a barra de rolagem não é ativada para continuar lendo as saídas que aparecem abaixo... Deu para entender?

Eis um exemplo de programa:

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

int main(void) {
   char r;
   initscr();
   do {
   printw("\n\n\tTestando...\n\n\n\n\n\n\n\n\tDeseja repetir? (s/n)");
   noecho();
   r = getch();
      while(r!='s' && r!='n') {
        printw("\n\tResponda usando 's' para 'sim' e 'n' para 'não'.\n\tE então? Deseja repetir?");
        r = getch();
      }
   } while('s' == r);
   endwin();
}

Nesse caso, se eu continuo apertando "s" a mensagem inicial se repete até que fica "cortada" pela tela, que não me deixa ver o "resto" da mensagem...

A imagem de como fica o terminal:

terminalsf2.png

Bom... é isso aí... O problema é com o terminal ou com o code? Se é o código o que tenho que fazer para habilitar essa "barra de rolagem"?

Até mais, ;)

P.S.: Estou usando o Ubuntu 8.10 como S.O. e o GCC para compilar os programas.

Editado por jth.
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Consegui fazer o que deseja usando scrollok:

http://www.linuxmanpages.com/man3/scrollok.3x.php

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

int main(void) {
char r;
WINDOW *win;
win = initscr();
scrollok(win, TRUE);
do {
printw("\n\n\tTestando...\n\n\n\n\n\n\n\n\tDeseja repetir? (s/n)");
noecho();
r = getch();
while(r!='s' && r!='n') {
printw("\n\tResponda usando 's' para 'sim' e 'n' para 'não'.\n\tE então? Deseja repetir?");
r = getch();
}
} while('s' == r);
endwin();
}

Mas a barra de rolagem não fica ativa. Aliás, acho que não dá para mantê-la ativa, pois a NCURSES é uma outra interface, apesar de usar a interface do Terminal

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela resposta rápida Beraldo. =D

O scrollok é uma saída, mas não é a mesma coisa né... É uma pena não poder usar a barra de rolagem com a ncurses.

Eu ainda estou fazendo a transição do win p/ o linux e essas dúvidas pintam direto.

Como estou aprendendo o básico sobre C, o uso da função getch() era bem freqüente antes de fazer a transição. Então fui buscar a mesma função na ncurses, mas aparentemente ela é uma biblioteca bem difrente e um pouco mais avançada para quem está começando agora... Bom, pelo menos essa é a minha impressão.

Até mais ;D

Link para o comentário
Compartilhar em outros sites

  • 0

Sua dúvida me fez ficar inquieto... :)

Deve haver uma forma de fazer o que você quer.

Cheguei a isto:

#include <curses.h>

int main()
{
    WINDOW *win;
    int i = 0, key;
    
    win = initscr();
    noecho();
    cbreak();
    keypad(win, TRUE);
    scrollok(win, TRUE);
    
    while ( (key = getch()) )
    {
        switch ( key )
        {
            case KEY_UP:
                scrl(-1);
                break;
            case KEY_DOWN:
                scrl(1);
                break;
            default:
                printw("%d................................\n", i++);
        }
        }
    
    endwin();
    
    return 0;
}

A rolagem funciona (com as setas do teclado), mas o conteúdo que foi "rolado" para além dos limites do terminal some.

Deve haver como fazer algo parecido com os comandos more ou less.

Vamos dar um jeito, sim. Se eu achar a resposta, coloco-a aqui. ;)

Editado por Beraldo
Link para o comentário
Compartilhar em outros sites

  • 0

Ráh! Fico feliz em saber que a minha dúvida pode inspirar algum tipo de "desafio". :D

Eu não conhecia nenhuma dessas funções que você apresentou para resolver o problema, meu inglês ainda é muito deficiente para estudar através dos "man", é uma pena, pois parece que é possível tirar muitas dúvidas apenas consultando esses manuais...

Obrigado novamente pelo esforço Beraldo.

Até mais, ;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...