ncurses初始化函式:raw(),cbreak(),echo(),noecho(),keypad(),halfdelay()

Koma_Wong發表於2018-06-20
  • Copyright(C) NCURSES Programming HOWTO

初始化函式

我們現在知道在程式中呼叫initscr()函式,螢幕就會初始化並進入curses 模式。本章我們會介紹其它的初始化函式,這些函式可以根據我們自己的要求在初始化後定製curses 會話(curses session)的功能及模式。例如:終端模式(terminal mode)、彩色顯示模式(colormode)、滑鼠操作模式(mouse mode)等。當然,我們還可以定製混合模式。這章就讓我們來討論這些在initscr()函式之後呼叫的初始化函式。

raw()函式和cbreak()函式

通常情況下,終端驅動程式會緩衝使用者輸入的字元,直到遇到換行符或回車符後,這些字元才可以被使用。但是大多數程式要求字元在輸入時就可以被使用。raw()cbreak()兩個函式都可以禁止行緩衝(line buffering)。區別是:在raw()函式模式下,處理掛起(CTRLZ)、中斷或退出(CTRLC)等控制字元時,將直接傳送給程式去處理而不產生終端訊號;而在cbreak()模式下,控制字元將被終端驅動程式解釋成其它字元。就我個人而言,比較喜歡使用raw()函式,因為用它可以做一些一般使用者無法進行的控制操作。

echo()函式和noecho()函式

這兩個函式用來控制是否將從鍵盤輸入的字元顯示在終端上。呼叫noecho()函式禁止輸入的字元出現在螢幕上。也許程式設計師希望使用者在進行控制操作時,需要遮蔽掉控制字元(如組合鍵操作),或呼叫getch()函式讀取鍵盤字元時,不想顯示輸入的字元(如在控制檯輸入登陸密碼)。大多數的互動式應用程式在初始化時會呼叫noecho()函式,用於在進行控制操作時不顯示輸入的控制字元。這兩個函式給予程式設計師很大的靈活性,使程式設計師可以在視窗中的任意地方,實現輸入字元的顯示和遮蔽,而不需要重新整理螢幕。

keypad()函式

這個函式允許使用功能鍵,例如:F1、F2、方向鍵等功能鍵。幾乎所有的互動式程式都需要使用功能鍵,因為絕大多數使用者介面主要用方向鍵進行操作。使用keypad(stdscr,TURE)就為“標準螢幕”(stdscr)啟用了功能鍵。你將會在以後的章節中學習到如何使用功能鍵。

halfdelay()函式

halfdelay()函式會啟用半延時模式(halfdelaymode)。和cbreak()函式一樣,當程式需要使用者輸入字元時,輸入的每個字元都是可用的。給halfdelay()傳遞一個整型引數(以0.1 秒為單位),它就會在這個引數時間內等待輸入。如果沒有有效的輸入,則返回ERR。 一般來說,這個函式在需要等待輸入的程式中會用到。如果使用者沒有在規定時間內給出有效輸入,程式就可以去處理其它事情。最常見例子就是在輸入密碼時做出超時響應。

其它的初始化函式

上面提到的函式用來定製curses 在初始化後的行為,因此這些函式只能在整個curses 會話的開始部分(即初始化時)呼叫,而不能在程式的其它地方呼叫。

示例程式

讓我們寫一個程式用來說明這些函式的用法。

#include <ncurses.h>
/*
Compile: gcc main.c -lncurses
*/
int main()
{
    int ch;
    initscr();              /* 開始curses 模式*/
    raw();                  /* 禁用行緩衝*/
    keypad(stdscr, TRUE);   /* 開啟功能鍵響應模式*/
    noecho();               /* 當執行getch()函式的時候關閉鍵盤迴顯*/
    printw("Type any character to see it in bold\n");
    ch = getch();           /* 如果沒有呼叫raw()函式,
                               我們必須按下enter 鍵才可以將字元傳遞給程式*/
    if(ch == KEY_F(1))      /* 如果沒有呼叫keypad()初始化,將不會執行這條語句*/
        printw("F1 Key pressed");
                            
    else                    /* 如果沒有使用noecho() 函式,一些控制字元將會被列印到螢幕上*/
    { 
        printw("The pressed key is ");
        attron(A_BOLD);
        printw("%c", ch);
        attroff(A_BOLD);
    }
    refresh();              /* 將緩衝區的內容列印到顯示器上*/
    getch();                /* 等待使用者輸入*/
    endwin();               /* 結束curses 模式*/
    return 0;
}

這個程式很簡單,但還是有一些在前面的章節沒有介紹的函式。getch()函式用來取得使用者輸入的字元,它等價於通常的getchar()函式,只是我們在呼叫getchar()函式時要禁止行緩衝以避免在輸入完成後按enter 鍵。在後面的章節中我們將討論到輸入函式。attron()attroff()函式分別作為修飾的開頭和結尾,修飾其間輸出的字元。例如在本例中加粗(即使用A_BOLD作為函式引數)使用者輸入的字元。在後面的章節中我們也將會詳細討論這些函式。

相關文章