Как я могу использовать Getch от проклятий без очистки экрана?
Вопрос
Я учусь программировать в 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
. Анкет Еще лучше, выберите описание терминала, которое делает то, что вы хотите.
Дальнейшее чтение:
- Почему экран не проясняется при запуске VI? (XTerm FAQ)
По сути, проклятия предназначены для захвата экрана (или окна, в случае оконного терминала). Вы не можете действительно смешивать проклятия со stdio, и вы не можете использовать проклятия, чтобы просто вводить или выводить что -то, не связываясь с остальной частью экрана. Есть частичные обходные пути, но вы никогда не сможете заставить его работать так, как вы хотите. Извиняюсь.
Я бы предложил либо переписать вашу программу, чтобы использовать проклятия повсюду, либо исследовать альтернативы, такие как READLINE.