본문 바로가기

About 배우고 익히는법/펌글

Linux] NCURSES란 ?

NCURSES란 ?


텍스트모드에서 Window, Panel, Menu, Mouse, Color등을 쉽게 사용할 수 있도록 도와주는 라이브러리입니다. curses라이브러리도 거의 같은 역할을 합니다. ncurses는 curses의 새로운 버전입니다.(new curses)


NCURSES설치?


NCURSES는 LINUX 라이브러리 이며, 현재 최신 버전의 리눅스의 경우 gcc같은 개발프로그램 설치시 자동으로 설치됩니다.


NCURSES를 사용하려면?

  #include <ncurses.h> //소스파일 안에 추가

  컴파일시

  gcc 소스파일네임 -lncurses


NCURSES FUNCTIONS


$설정 및 초기화 관련 함수


♦initscr()

 curses모드를 시작한다. curses를 사용하기 위해 반드시 써줘야 한다.


endwin()

 curses모드를 종료한다. curses모드를 사용하고 종료할 때 반드시 써줘야한다.

 만약 endwin()을 하지 않고 프로그램이 종료됐을 경우 텍스트 모드의 이상을

 가져 올수 있다.


raw() and cbreak()

 Line buffering을 사용할지의 유무를 설정한다. 사용할 경우 cbreak, 사용하지 않고자

할 경우 raw를 사용하면된다. 보통 기본설정은 사용을 하는 것으로 되어있다.


echo() and noecho()

 사용자로부터 입력을 받은 문자를 출력할지 여부를 결정한다. echo는 출력

noecho는 출력을 하지 않는다. (getch 함수 사용시)


keypad()

 F1, F2, 방향키 등과 같이 특수한 키들을 사용할 수 있게 해준다.

 keypad(stdscr, TRUE);

 KEY_F(1)~ KEY_F(12)

 KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN


color_start()

 color모드를 시작한다. 색깔을 넣고자 할때 전에 반드시 써주어야 하는 함수이다.

 (has_colors()의 리턴값이 TRUE 일때만 사용가능하다.)


&출력 관련 함수

refresh()

 화면에 찍은 내용을 갱신한다. curses 모드에서는 출력함수를 이용해 출력해도

 refresh()를 쓰기전까진 화면에 나타나지 않는다.


♦clear()

 화면을 깨끗이 지운다.


♦printw

 printf와 쓰임새와 사용방법이 같다.(curses 모드가 시작된 이후 종료되기 전까지는

 printf와 같은 일반 출력화수로는 화면에 출력할 수 없다.)

 ex)

         printw("string\n");

         printw("%s\n", "string");

         ....

♦addch

 putchar와 같이 char의 글자 하나를 출력할 때 사용한다. putchar와다른 점이라면         curses 모드에서 사용할 수 있는 옵션 줄 수 있다.

 ex)

 #include<ncurses.h>

 int main(void){

        int cnt;

        char s[] = "SPLUG";

        initscr();

        addch(s[0]|A_BOLD);

        for (cnt = 1; cnt < 5; cnt++)

                addch(s[cnt]);

        refresh();

        endwin();

 }

addstr()

 addstr(string) 해당 문자열을 출력한다.


move(y,x)

 y줄 x번째로 커서를 이동시킨다. x, y의 값은 0~화면의 최대크기 의 int 값을

갖는다. 화면의 범위를 벋어날 경우 세그멘테이션 오류가 날 수 있다.


mvprintw(), mvaddch()

 move한 뒤 printw, addch한것과 같은 결과를 출력한다.

 예를 들면

 move(10, 10);

 printw("This is 10, 10");

 이것은

 mvprintw(10, 10, "This is 10, 10");

 과 같다.


&입력 관련 함수


♦scanw() and mvscanw()

 scanw는 scanf와 사용방법과 쓰임이 같다. 해당 문자열이나 char int등을 입력 받는다.

 mvscanw는 mvprinw와 비슷하게 해당 좌표로 이동후 입력을 받는다.

 mvscanw(row, col, "%d", int *);


♦getstr()

 string입력을 받는다.

 ex) 

        char str[10];

        getstr(str);

 이렇게 하면 ‘\n'를 입력박기전까지의 문자열을 str에 저장한다.


getch()

 한 문자를 사용자로부터 입력을 받는다. getchar과는 달리 ‘\n'문자를 입력 받을 때까지

기다리지 않고 바로 입력받은 문자 하나를 리턴해주고 종료한다. 입력받은 문자의 표기 유무는 echo() : noecho() : 로 선택한다.


&&Attributes

 글자에 특수한 효과를 주기 위해 사용된다.

★attron() and attrset()

 글자에 특수한 효과를 준다. attron() 중첩사용하면 중첩효과를 attrset()은 그 밑으로 모두   설정을 attrset()로 해준다.

 ♦사용 방법

  attron(인자);

  한꺼번에 여러효과를 주고자할 때 |(OR)를 이용하면 된다.

  attron(인자1| 인자2);

  이렇게 하면 인자1과 인자2의 효과가 중첩되어 나타난다. 중첩갯수에 제한 없음.


♦인자들 

   A_NORMAL  : Normal display (no highlight)

   A_STANDOUT : Best highlighting mode of the terminal.

   A_UNDERLINE : Underlining

   A_REVERSE  : Reverse video

   A_BLINK : Blinking

   A_DIM : Half bright

   A_BOLD : Extra bright or bold

   A_PROTECT : Protected mode

   A_INVIS  : Invisible or blank mode

   A_ALTCHARSET : Alternate character set

   A_CHARTEXT : Bit-mask to extract a character

   COLOR_PAIR(n) : Color-pair number n


♦attroff()

 attron()이나 attrset()으로 준 효과를 끈다. 인자는 attron(), attrset()과 동일하다.

 ex)

   attron(A_BLINK);

   printw("HI!!\n");

   attroff(A_BLINK);


init_pair()

 컬러를 설정할 때 쓰인다.

 init_pair(int index, int font_color, int blink_color);

 여기서 index는 설정한 color쌍을 불러 낼때 쓰이게 되는번호이다. 1보다 크거나 같은수    지정 가능

 두 번째인자는 글씨색을 세 번째 색은 블록의 색깔을 의미한다.

 여기서 색은 ncurse라이브러리에 미리 정의 되어있다.

  COLOR_BLAACK  0

  COLOR_RED      1

  COLOR_GREEN   2

  COLOR_YELLOW  3

  COLOR_BLUE     4

  COLOR_MAGENTA 5

  COLOR_CYAN     6

  COLOR_WHITE    7





♦init_color()


  미리 정의되어 있는 색깔을 바꿀수 있다.

  예를 들어 COLOR_RED의 색깔을 재 정의 하고자 할 경우

  init_color(COLOR_RED, r, g, b);

  여기서 r, g, b는 각각 red, green, blue의 삼원색으로 0~ 1000사이의 값을 가진다.

♦COLOR_PAIR(n)

 attron(), attset(), attroff()의 인자로 쓰인다.

 여기서 n은 앞에서 init_pair()에서 첫 번째 인자로 숫자로 들어간 수와 일치 한다.

 0은 보통 모양을 의미 한다.


♦mvchgat()

 attron(COLOR_PAIR(n))과 유사한 효과를 내는 데 쓰인다.

 mvchgat(int start_Y, int start_X, int char_num, Attribute, int index, NULL)

 첫 번째와 두 번째는 효과를 주려고하는 곳의 시작 부분을 세 번째 인자는 효과를 주고자

 하는 문자의 숫자를 의미한다. 여기서 -1은 라인의 끝까지를 의미한다. Attribute는        A_BOLOD나 A_BLINK와 같은 효과를 의미한다. 네 번째 인자는 init_pair()에서 설정해준 color 쌍의 인덱스 번호와 일치한다. 역시 0은 기본 모양. 마지막인자는 항상 NULL이다.



&현재 정보를 얻는 함수들


getmaxyx()

 현재 화면의 가로 세로의 크기를 구한다.

 getmaxyx( win, max_y, max_x);

 win의 y값의 크기와 x값의 크기를구해 각각 max_y, max_x에 넣어준다.

 역기서 win은 window포인터를 의미하며 표준화면은 stdscr을 넣어주면 된다.


♦getyx()

 현재 커서의 위치를 구한다.

 getyx(win, y, x);

 win(window pointer)의 커서의 위치를 찾아 y, x에 넣어준다.


&ACS 문자들(특수문자)

ncurses에서는 여러 가지 특수한 문자들을 ACS_xxx 이런식으로 미리 정의해 놓았다. 여기서 원하는 문자를 찍고자할 때

미리 정의된 것을 이용하면 손쉽게 찍을 수 있다.


$커서 설정

curs_set() 이용하여 설정하며 0~2사이의 인자값을 가진다. 0에 가까울수록 커서가 안보인다.

 ex ) curs_set(0);



&마우스 이벤트

간단한 마우스 이벤트도 ncurses를 통해서 제어 할 수 있다.


♦이벤트 얻기(getmouse())


 MEVENT event;

 ch = getch();

 if(ch == KEY_MOUSE)

        if(getmouse(&event) == OK)

        /*Do some thing with the event*/

}


ncurses에서는 MEVENT 라는 구조체가 미리 정의 되어있다.


구조체를 살펴보면


typedef struct {

       short id;      //device id

        int x, y, z;    //마우스의 커서 위치

        mmask_t bstat; //버튼의 상태 비트를 나타낸다.

}


사용방법은 event라고 선언된 구조체에 마우스 이벤트를 받았다면

마우스버튼 1을 눌렀는지를 검사하려면


if(event.bstat & BUTTON1_PRESSED)

  printw("Left button pressed");

이런식으로 해주면 된다.



 

 



    Name            Description

       ---------------------------------------------------------------------

       BUTTON1_PRESSED          mouse button 1 down

       BUTTON1_RELEASED         mouse button 1 up

       BUTTON1_CLICKED          mouse button 1 clicked

       BUTTON1_DOUBLE_CLICKED   mouse button 1 double clicked

       BUTTON1_TRIPLE_CLICKED   mouse button 1 triple clicked

       BUTTON2_PRESSED          mouse button 2 down

       BUTTON2_RELEASED         mouse button 2 up

       BUTTON2_CLICKED          mouse button 2 clicked

       BUTTON2_DOUBLE_CLICKED   mouse button 2 double clicked

       BUTTON2_TRIPLE_CLICKED   mouse button 2 triple clicked

       BUTTON3_PRESSED          mouse button 3 down

       BUTTON3_RELEASED         mouse button 3 up

       BUTTON3_CLICKED          mouse button 3 clicked

       BUTTON3_DOUBLE_CLICKED   mouse button 3 double clicked

       BUTTON3_TRIPLE_CLICKED   mouse button 3 triple clicked

       BUTTON4_PRESSED          mouse button 4 down

       BUTTON4_RELEASED         mouse button 4 up

       BUTTON4_CLICKED          mouse button 4 clicked

       BUTTON4_DOUBLE_CLICKED   mouse button 4 double clicked

       BUTTON4_TRIPLE_CLICKED   mouse button 4 triple clicked

       BUTTON_SHIFT             shift was down during button state change

       BUTTON_CTRL              control was down during button state change

       BUTTON_ALT               alt was down during button state change

       ALL_MOUSE_EVENTS         report all button state changes

       REPORT_MOUSE_POSITION    report mouse movement

 


[출처] NCURSES란 ? |작성자 벤치