2016-08-29 31 views
2

我不明白當用戶按下Ctrl-L或Ctrl-R時用於重新繪製屏幕的功能。使用clearok()redrawwin()wrefresh()curscr作爲參數有什麼區別?從OpenBSD的手冊頁:正確的重繪整個屏幕的方法?

如果clearok被調用,TRUE作爲參數,下次調用這個窗口wrefresh將徹底清除屏幕,並從頭開始重新繪製整個屏幕。當屏幕的內容不確定時,或者在某些情況下會出現更令人滿意的視覺效果時,此功能非常有用。如果clearok的win參數是全局變量curscr,那麼使用任何窗口下一次調用wrefresh會導致屏幕被清除並從頭開始重新繪製。

...

若獲勝參數wrefresh是全局變量curscr,屏幕立刻清零,從頭粉刷一新。

...

的wredrawln例行指示詛咒,有些網線已損壞,任何事情寫在他們之前,必須扔掉。它觸及指示的線條(標記它們已更改)。例程redrawwin()觸及整個窗口。

+2

我不明白。 Ctrl + L和Ctrl + R?你從哪裏得到這些關鍵組合?你想做什麼? –

+0

這些技術之間的區別在引號中描述。你的問題很不清楚。 –

+2

@LightnessRacesinOrbit Ctrl-L是一個非常常見的「重畫屏幕」命令,可以通過「more」,「less」,「vi」,「dialog」,「screen」等基於curses的程序識別(使用Ctrl-A前綴) ,'lynx','info' ......幾乎所有與用戶使用整個屏幕交互的東西。 Ctrl-R可能不太常見的替代品。在新程序中想要將Ctrl-L和/或Ctrl-R與此函數關聯的原因並不清楚,只是爲了與用戶從所有其他程序中學到的內容保持一致。 –

回答

7

"OpenBSD manpages"ncurses。鍵綁定是無關緊要的。
你問三個特點:

  1. clearok()
  2. redrawwin(),或
  3. wrefresh()與curscr作爲參數?

但這些都是不同的:

  • clearok(),你是不是告訴你已經忘記了在屏幕上什麼詛咒,但說這是最好清除它(和詛咒會做),但是
  • redrawwin()不是重新繪製整個屏幕,而是窗口。你的應用程序可能會這樣做,如果它正在模仿面板庫,使一些窗口重疊,並希望將一個模糊的窗口「提升」到其他窗口之上。最後,
  • 刷新curscr明確地告訴詛咒繞過印刷到一個窗口的正常順序,或者到stdscr,然後從stdscr應用改變到newscr,和newscrcurscr之間施加差異curscr。就詛咒而言,curscr擁有任何物理屏幕。因此,當您修改curscr時,curses在要求刷新時立即更新物理屏幕。

對於它的價值,在curscr功能早ncurses的,但我不得不指出source-code證明。它在這changelog entry from 1995雖然提到:

src/curses/resizwin.c: 刷新curscr以迫使ncurses的屏幕更新

0

通常什麼時,按Ctrl + L或Ctrl + R按下happend是你的shell的事或正在使用的程序,在這種情況下,程序將發送一系列字符,當(終端)清除屏幕時,終端將進行交互。

如何獲得這個序列:

#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); 
} 
相關問題