Как использовать getch из проклятий, не очищая экран? - PullRequest
9 голосов
/ 23 января 2011

Я учусь программировать на C и хочу набирать символы в терминале, пока мой код работает без нажатия return . Моя программа работает, однако, когда я звоню initscr(), экран очищается - даже после вызова filter(). Документация для filter предлагает отключить очистку, однако для меня это не так.

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

int main(void) {

    int ch;

    filter();
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    while((ch = getch()) != EOF);

    endwin();

    return 0;
}

Почему приведенный выше код все еще очищает экран, и что можно сделать, чтобы это исправить?

Я использую Debian Lenny (стабильный) и gnome-терминал, если это поможет.

Ответы [ 4 ]

4 голосов
/ 23 января 2011

Расширение ответа mike.dld, это работает для меня на MacOS X 10.6.6 (GCC 4.5.2) с библиотекой системных проклятий - без очистки экрана. Я добавил возможность записывать набранные символы (записанные в файл "x") и возможность набирать CONTROL-D и останавливать программу, вместо того чтобы заставлять пользователя прерывать.

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

#define CONTROL(x)  ((x) & 0x1F)

int main(void)
{
    FILE *fp = fopen("x", "w");
    if (fp == 0)
        return(-1);
    SCREEN *s = newterm(NULL, stdin, stdout);
    if (s == 0)
        return(-1);
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    int ch;
    while ((ch = getch()) != EOF && ch != CONTROL('d'))
        fprintf(fp, "%d\n", ch);

    endwin();

    return 0;
}
3 голосов
/ 23 января 2011

Используйте newterm() вместо initscr(), тогда все будет в порядке. И не забывайте о delscreen(), если вы последуете этому совету.

2 голосов
/ 24 июля 2016

Вы увидите, что ваш экран очищен в приложении curses по одной из следующих причин:

  • ваша программа вызывает initscr (который очищает экран) или newterm без первого вызова filter, или
  • , инициализация терминала очищает экран (или делает его доступным для очистки, переключаясь на альтернативный экран).

В последнем случае вы можете отключить функцию альтернативного экрана в ncurses, сбросив указатели enter_ca_mode и exit_ca_mode на NULL , как это было сделано в dialog.А еще лучше, выберите описание терминала, которое делает то, что вы хотите.

Дополнительная информация:

1 голос
/ 02 марта 2014

По сути, curses предназначен для захвата экрана (или окна, в случае оконного терминала).Вы не можете реально смешивать проклятия со stdio, и вы не можете использовать проклятия, чтобы просто вводить или выводить что-то, не мешая остальной части экрана.Есть частичные обходные пути, но вы никогда не сможете заставить это работать так, как вы хотите.Извините.

Я бы предложил переписать вашу программу, чтобы использовать проклятия, или изучить альтернативы, такие как readline.

...