Beginning Linux Programming Part6-Curses

여기서 윈도우라는건 콘솔에서 하는겁니당..
터미널 상에서 상자만드는것이죠
GTK,QT,API 이런거 아닙니다..

C대충 아시는 분은 뭐하는지 아실겝니다..
어짜피 다른거라고 해봤자 함수좀 쓰는거니까..
Curses는 도스랑도 꽤나 비슷한가 보군요 구글링 하니까 비슷하더라는..

다음은 요약본

*******윈도우 속성*************

#include<curses.h>

WINDOW initscr(void); //윈도우를 연다
int endwin(void); //윈도우를 닫는다

int move(int x,int y) //커서를 이동한다 x,y 좌표에 따라서,도스의 gotoxy랑 하는짓?은 비슷하다
printw(char *format...)//걍 문자열 출력 일반적 윈도우에서 쓰는 printf 라고 생각하자

int refresh(void);화면 다시 쓰기 (화면 새로 고침)

attron(chtype attribute);//해당 문자 속성을 켠다(A_BOLD,A_UNDERLINE,A_REVERSE.....)
attroff(chtype attribute);//해당 문자 속성을 끈다(옵션은 같이 붙여주면 됨)

ex>
     7     initscr();//윈도우 시작
     8
     9     move(10,10);//Move..
    10     printw("MAC vs Windows");//글자
    11     refresh();//화면 reflash 해야 글자가 보임
    12     sleep(1);
    48
    49     endwin();//윈도우 종료

*아래에 해당되는 함수는 윈도우의 시작과 끝 사이에 위치해야한다
(initscr();~endwin() 사이에)

int echo(void)//echo 켜기(print)
int noecho(void)//echo 끄기
int cbreak(void)//글자를 누르자 마자 직접 반응
int nocbreak(void)//cbreak 끄기
int raw(void) //특수문자 처리가 꺼짐(방향키등)
int noraw(void)//특수문자 처리가 가능

int getch(void) //설명이 필요 없다
int getstr(char *string) //문자열을 입력받는다
int getnstr(char *string,int stringsize)//n개의 문자를 입력받는다(Bufferoverflow 방지)
(strncmp memnset 같은 n 종류)

******Window 건드리기********

기본적인 순서는
1윈도우를 정의한다
2윈도우에 출력할 내용을 정한다
3표준화면에 윈도우를 적용한다

ex>

    10     WINDOW *win1,*win2;//윈도우 구조체 선언(직접 건들진 못한다)
    ....
    24     win1=newwin(10,20,15,12); //새창의 윈도우
    25     mvwprintw(win1,2,2,"%s","Hello World! ");//들어갈 내용
    26
    27     win2=newwin(30,30,30,30);
    28     mvwprintw(win2,2,3,"%s","ABCDEF~");
    29
    30     wrefresh(win2);
    31     wrefresh(win1);//화면에 적용

아까 printw를 예로들자면
wprintw(WINDOW *winpointer,char *format,...);
mvprintw(int x,int y,char *format,...);
mvwprintw(WINDOW *winpointer,int y,int x,char *format,...);

w->WINDOW 포인터
mv->window mv(이동)
mvw->위에꺼 두개 합친것

box(WINDOW *winpointer,char x,char y) ?
상자를 만든다 x,y에다가는 각 테두리를 장식할 문자를 정해주면 된다

*******키패드**********

보통 initscr 했을때 키패드는 이스케이프 문자를 잠근다고 한다
이것을 풀기위해선
keypad()함수를 사용하면 된다

int keypad(WINDOW *winpoiter,TRUE/FALSE);
TRUE,FALSE 중 하나를 택하여 키패드 모드을 on/off한다
뭐 특별히 정해줄거 없으면 stdscr으로 해도 된다

보통 getch();로 받아서 이것을 swich문으로 Check하는데
거기서 키패드가 뭐가 눌렸는지 알수 있는 매크로는 다음과 같다

LOCAL_ESCAPE_KEY
KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT
KEY_END,KEY_BEG
척 보면 다 아니깐 설명은 생략

ex> 설명은 귀찮아서 안해
    14     do
    15     {
    16         mvprintw(10,15,"UP DOWN RIGHT LEFT Press Key....:");
    17         refresh();
    18
    19         ch=getch();
    20
    21         clear();
    22         move(10,50);
    23
    24         if(ch>='a' && ch <='z')
    25             printw("%c",(char)ch);
    26         else if(ch>='A' && ch <='Z')
    27             printw("%c",(char)ch);
    28         else if(ch>='0' && ch <='9')
    29             printw("%c",(char)ch);
    30
    31         else
    32         switch(ch){
    33             case(KEY_RIGHT):
    34                 printw("RIGHT");
    35                 break;
    36             case(KEY_LEFT):
    37                 printw("LEFT");
    38                 break;
    39             case(KEY_UP):
    40                 printw("UP");
    41                 break;
    42             case(KEY_DOWN):
    43                 printw("DOWN");
    44                 break;
    45             default:
    46                 printw("KEY VALUE:%d",ch);
    47         }
    48
    49     }while(ch != 'q');

*************색깔(color)****************

소스를 보면서 설명

    18     has_colors(); //터미널이 색깔을 쓸수 있는지 확인
    19     start_color(); //색깔쓰기 시작 안되면 에러메세지

    20     init_pair(1,COLOR_RED,COLOR_BLACK); //여기서 부터 번호대로 색깔을 정의한다
    21     init_pair(2,COLOR_BLUE,COLOR_WHITE);
    22     init_pair(3,COLOR_CYAN,COLOR_YELLOW);
    23     init_pair(4,COLOR_GREEN,COLOR_RED);
    24     init_pair(5,COLOR_WHITE,COLOR_MAGENTA);
    25     init_pair(6,COLOR_BLACK,COLOR_WHITE);
    26     init_pair(7,COLOR_RED,COLOR_GREEN);
    27     init_pair(8,COLOR_MAGENTA,COLOR_CYAN);
//RED,BLACK..이런 건 아마 curses.h에 메크로로 존재하는거 같다~!

    29     for(i=1;i<9;i++){
    30         attrset(COLOR_PAIR(i) | A_BOLD);//
    31         //wattron(stdscr,COLOR_PAIR(i) | A_BOLD );
//일정 WINDOW 포인터에 적을때 사용지금은 그냥 stdscr이므로 위의 함수와 하는일이 같다

    32         mvprintw(13+i,10,"%s%d              %s%d",str1,i,str2,i);
//일정한 위치에 글자를 찍어라 앞에서도 봤던 함수 %d %s %c 같이  printf의 포맷과 비슷하다

    33         refresh(); //전에도 말했지만 변경사항을 적용할려면 refresh함수를 써야한다
    34         sleep(1); //바로 지나가므로 결과를 확인할수 있게 잠시 늦춤
    35     }

********** 패드 (pad) **************

에 그러니까.. 패드라는건.. 나도 뭔가 했는데..
책에서 논리화면 물리화면 어쩼네~ 이러는건.. 이해가 안되서..
내가 내맘대로 이해한게 화면을 쓸수 있는 범위랄까 .. 그런걸 지정한다고
해버림

WINDOW *newpad(int number_of_lines,int number_of_columns);
뭐.. 설명이 필요할까

#include<curses.h> //외워 버렸네..
int prefresh(WINDOW *pad-ptr,int pad_row,int pad_column,
                       int screen_row_min,int screen_col_min,
                       int screen_row_max,int screen_col_min)

아따 길다.. 뭐이리 길어... 이것도 다 적혀있으니깐 해설은 Pass~

ex> //설명이구 뭐구 할께 없다.. 그 자체
사실 나도 별내용 없는거 같아서 책 내용 그대로 쳐봤다..

    28     prefresh(pad,5,7,2,2,9,9);
    29     sleep(1);
    30
    31     prefresh(pad,LINES +5,COLS +7,5,5,21,19);
    32     sleep(1);
    33     delwin(pad); //윈도우를 지운다

뒤에 뭐 CD  응용프로그램 만든다고 하는데..
나는 갈길이 바뻐서.. 뭐 이것도 넘어가기로 한다

아~ 그러니깐 이번 파트 끝이넹.. 이것도 2틀이나 걸렸다..(터미널이랑 같다?)
정말 의외로 시간이 정말 오래 걸리는군... 하아.. 뭐.. 이정도 속도로가면 한 3주내에
빠르면 2주만에 끝낼수도 잇을텐데.. (뭐.. 빼먹을 부분이 좀 있는지라)

다음은 11장 프로세스~

'Programming > System' 카테고리의 다른 글

MBR(?) 출력 하기  (2) 2007.06.17
screen attach dettach 구별법  (2) 2007.02.12
ls -al  (0) 2006.06.21
Beginning linux programming  (6) 2006.03.01
VIRUS 제작~  (6) 2006.01.03