Как я могу использовать Getch от проклятий без очистки экрана?

StackOverflow https://stackoverflow.com/questions/4772061

  •  23-10-2019
  •  | 
  •  

Вопрос

Я учусь программировать в C и хочу иметь возможность вводить символы в терминал, пока мой код работает без нажатия возвращаться. Анкет Моя программа работает, однако, когда я звоню 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 (стабильный) и гноме-концевой, если это помогает.

Это было полезно?

Решение

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

Другие советы

Расширяя ответ Mike.dld, это работает для меня на MacOS X 10.6.6 (GCC 4.5.2) с библиотекой Curses System - без очистки экрана. Я добавил возможность записывать набранные символы (зарегистрированный в файл «x») и возможность печатать Контроль-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;
}

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

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

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

Дальнейшее чтение:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top