Я хакерство вместе Ncurses приложения, которое использует 5 окон:Ncurses: Обновление неперекрывающегося окна обновляет весь экран. Как этого избежать?
- статусного окно - 1 X COLS вправо в нижней части экрана.
- titlebar window - 1 X COLS прямо в верхней части экрана.
- 3 окна содержимого - LINES - 2 X COLS, между столбцом состояния и заголовком.
Обратите внимание, что есть 3 окна содержимого, которые полностью перекрывают друг друга. Я вручную решаю, что нужно перерисовать. Окна заголовка и окна состояния не перекрываются ни с каким другим окном.
Одним из вариантов использования является выбор файла для загрузки на сетевой демон с помощью меню в одном из окон содержимого. После выбора файла панель состояния действует как грубая панель прогресса, рисуя некоторые хэши, чтобы указать, как далеко загружен файл.
Что это сводится к тому, использует:
- wclear (статус);
- mvwprintw (статус, ...);
- wrefresh (status);
Это работает, но по какой-то причине приводит к перерисованию всего экрана, что приводит к ужасающему дрожанию. Прочтя руководство, я не понимаю, почему это должно быть так; до тех пор, пока строка состояния не перекрывает другие окна, перерисовка строки состояния не должна вызывать всплеск всего экрана?
Правильно ли я, или я неправильно понял? Есть ли способ предотвратить это?
Код здесь: https://github.com/vext01/hgd/blob/master/nchgdc.c#L812
Обратите внимание, что код значительно незавершенной и не хватает для ногтей =)
Моя реализация Ncurses является то, что OpenBSD.
Можете ли вы написать очень короткую самостоятельную программу, которая демонстрирует поведение? На каком терминале вы работаете? Имейте в виду, что некоторые терминалы могут иметь ограниченные возможности, и в результате требуется, чтобы весь экран был перерисован, когда другие могут не работать. – Craig
При этом я вижу преступника. Кажется, что wclear() вызывает обновление всего экрана! Без него я мерцаю. Почему это? https://gist.github.com/1605660 –