2012-01-08 58 views
1

我一起黑客它使用5個窗口,一個ncurses的應用程序:Ncurses:刷新非重疊窗口會刷新整個屏幕。如何避免這種情況?

  • 狀態欄窗口 - 1 x欄就在屏幕的底部。
  • 標題欄窗口 - 右側X COLS在屏幕頂部。
  • 3個內容窗口 - LINES - 2個COLS,位於狀態欄和標題欄之間。

請注意,有3個內容窗口,它們完全相互重疊。我正在手動決定要重繪哪一個。標題欄和狀態欄窗口不與任何其他窗口重疊。

一個使用案例是讓用戶使用其中一個內容窗口中的菜單選擇要上傳到網絡守護程序的文件。選擇一個文件後,狀態欄將作爲一個粗略的進度條,繪製一些哈希值以指示文件上傳的距離。

什麼將此歸結爲使用:

  • wclear(狀態);
  • mvwprintw(status,...);
  • wrefresh(status);

這是有效的,但由於某種原因導致整個屏幕被重繪,導致一個可怕的flickery混亂。閱讀手冊後,我不明白爲什麼會這樣;只要狀態欄不與其他窗口重疊,重畫狀態欄不應該導致整個屏幕重繪?

我說得對嗎,還是我誤解了?有沒有辦法來防止這種情況?

的代碼是在這裏: https://github.com/vext01/hgd/blob/master/nchgdc.c#L812

注意,代碼極大地未完成,缺乏潤色=)

我ncurses的實施是爲OpenBSD的。

+0

你能寫一個非常短的獨立程序來演示行爲嗎?你在使用什麼終端?請注意,某些終端的功能可能有限,因此需要重新繪製整個屏幕,而其他人可能不會。 – Craig 2012-01-12 16:55:42

+0

這樣做,我看到罪犯。 wclear()似乎會導致整個屏幕更新!沒有它,我無閃爍。爲什麼是這樣? https://gist.github.com/1605660 – 2012-01-13 11:30:56

回答

0

從wclear手冊頁:

清澈且wclear程序是像擦除和WERASE,但他們也 呼叫clearok,使屏幕上的下一個呼叫 徹底清除,以wrefresh爲窗口和從頭開始重新繪製。