Я не понимаю, какие функции использовать для перекраски экрана, когда пользователь нажимает Ctrl-L или Ctrl-R. Какая разница между использованием clearok()
, redrawwin()
, или же wrefresh()
с curscr
как аргумент? Из справочных страниц OpenBSD:
Если clearok вызывается с TRUE в качестве аргумента, следующий вызов wrefresh с этим окном полностью очистит экран и перерисовает весь экран с нуля. Это полезно, когда содержимое экрана неопределенное, или в некоторых случаях для более приятного визуального эффекта. Если в качестве аргумента win для clearok используется глобальная переменная curscr, то следующий вызов wrefresh для любого окна приводит к очистке и перерисовке экрана с нуля.
…
Если аргумент win для wrefresh является глобальной переменной curscr, экран немедленно очищается и перекрашивается с нуля.
…
Подпрограмма wredrawln указывает проклятиям, что некоторые строки экрана повреждены и должны быть выброшены, прежде чем что-либо будет записано поверх них. Касается указанных линий (пометка их изменена). Подпрограмма redrawwin () касается всего окна.
«OpenBSD manpages» являются Ncurses. Связки клавиш не имеют значения.
Вы спрашивали о трех функциях:
Но они разные
clearok()
вы не говорите проклятиям, что вы потеряли след на том, что на экране, но говорите, что лучше очистить это (и проклятия сделают это), ноredrawwin()
перекрашивает не весь экран, а окно. Ваше приложение может сделать это, если оно имитирует библиотеку панелей, перекрывая некоторые окна и желая «поднять» затемненное окно над остальными. В заключение,curscr
явно говорит проклятия, чтобы обойти обычную последовательность печати в окне или на stdscr
, затем применяя изменения из stdscr
на newscr
, и применяя различия между newscr
а также curscr
в curscr
. Что касается проклятий, curscr
имеет все, что положено на физический экран. Поэтому, когда вы модифицируете curscr
, curses обновляет физический экран, как только его просят обновить.Для чего это стоит, curscr
функция предшествует ncurses, хотя я должен был бы указать на исходный код чтобы показать это. Это упоминается в этом запись в журнале изменений за 1995 год хоть:
src/curses/resizwin.c
:
обновить curscr для принудительного обновления экрана в ncurses
Обычно то, что происходит при нажатии Ctrl + L или Ctrl + R, зависит от вашей оболочки или используемой программы, в этом случае программа отправит последовательность символов, которую ваш терминал будет интерпретировать, когда (терминал) очистит ваш экран.
Как получить эту последовательность:
#include <curses.h>
#include <term.h>
#include <termios.h>
#include <sys/ioctl.h>
void init_term(void)
{
static struct termios term_new;
setupterm(NULL, 1, NULL);
ioctl(0, TCGETS, &term_new);
}int main(void)
{
// init the ncurses
init_term();
// get the sequence for "clear" command then print it
printf("%s", tigetstr("clear"));
// and flush the buffer
fflush(stdout);
return (0);
}