2012-01-08 3 views
1

Я хакерство вместе 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.

+0

Можете ли вы написать очень короткую самостоятельную программу, которая демонстрирует поведение? На каком терминале вы работаете? Имейте в виду, что некоторые терминалы могут иметь ограниченные возможности, и в результате требуется, чтобы весь экран был перерисован, когда другие могут не работать. – Craig

+0

При этом я вижу преступника. Кажется, что wclear() вызывает обновление всего экрана! Без него я мерцаю. Почему это? https://gist.github.com/1605660 –

ответ

0

От wclear человек страницы:

Четкие и wclear процедуры, как стирают и WERASE, но они также вызов clearok, так что экран будет очищен полностью на следующий вызов в wrefresh для этого окна и перекрашены с нуля.

Смежные вопросы