'리눅스'에 해당되는 글 8건

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 마지막회 여러가지 예제들 - 2009/02/09 17:14

이번 시간은 'NCURSE 로 만들어 보는 유저 인터페이스(UI)'의 마지막 회 시간으로서

 
이와 관련된 자료를 소개 하는 것으로 마무리 하려 합니다.
 
커스 교재
; ncurse 에 대하여 더 자세한 정보를 원하시는 분들은 참조하시면 좋을듯 싶습니다. 본 칼럼도 이를 적극적으로 참조 하여 작성 되었습니다.
 
커스 예제 관련 링크
; Towers of Hanoi(하노이 탑), Shuffle 등의 재미있는 예제들이 많이 있습니다. 직접 컴파일 하여 실행 시켜 보실 수 있습니다.
 
우리는 그 동안 ncurse 프로그램으로 화면에 글자를 뿌려보고 키보드 입력도 받아보고 또한 간단하게 나마 윈도우 라는 것도 만들어 보았습니다. 본 칼럼에서 소개 하지는 않았지만 ncurse 의 여러가지 API 들을 잘 활용하면 탑다운 방식으로 메뉴, 스크롤바, 버튼, 마우스인터페이스 등 간단한 UI 을 만들어 볼 수 있습니다.
다만, 본 칼럼을 통하여는 ncurse의 기본 API 와 응용 API 중 전자에 중심을 놓고 설명하였으며 위에 참조 링크를 알려 드린 것으로 미력하나마 이것으로 마무리 하고저 합니다.
 
임베디드 리눅스의 응용 프로그램 도구의 하나로서 ncurse 를 정리하여 소개 하였다는 데에 필자는 그 의의를 두고 싶습니다.
 
감사합니다.
 
posted by 가일(GUILE)
♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/28 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 7회 윈도우를 만들어 보자 - 2009/02/09 17:13

이번 시간은 커스를 이용한 윈도우 생성 방법과 그 의의를 알아 볼 것 입니다.

리스팅1은 예로써 사용될 NCURSE 프로그램이며 아래의 그림은 그 실행 결과(예제 window 실행 결과)입니다.

 
예제 window 실행 결과
 
리스팅 1


#include <ncurses.h>

//
// 가상 윈도우를 만들어 본다
//
#include <ncurses.h>

WINDOW *create_newwin(int height, int width, int starty, int startx);
void destroy_win(WINDOW *local_win);


int main(void)
{
        WINDOW *my_win;
        int startx, starty, width, height;
        int ch;


        initscr(); /* Start curses mode */

        keypad(stdscr, TRUE); /* I need that nifty F8 */

// sector #01
        cbreak(); /* Line buffering disabled, Pass on everty thing to me */

        height = 9;
        width = 30;

        starty = (LINES - height) / 2; /* Calculating for a center placement */
        startx = (COLS - width) / 2; /* of the window */

        printw("Press F8 to exit");
        refresh();

// sector #02
        my_win = create_newwin(height, width, starty, startx);

// sector #03
        while((ch = getch()) != KEY_F(8))
        {
                switch(ch)
                {
                        case KEY_LEFT:
// sector #04
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, starty, --startx);
// sector #05
                                wprintw(my_win,"left");
                                wrefresh(my_win);
                                break;
                        case KEY_RIGHT:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, starty,++startx);
                                wprintw(my_win,"right");
                                wrefresh(my_win);
                                break;
                        case KEY_UP:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, --starty,startx);
                                wprintw(my_win,"up");
                                wrefresh(my_win);
                                break;
                        case KEY_DOWN:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, ++starty,startx);
                                wprintw(my_win,"down");
                                wrefresh(my_win);
                                break;
                }
        }
        endwin(); /* End curses mode */
        return 0;
}


WINDOW *create_newwin(int height, int width, int starty, int startx)
{
        WINDOW *local_win;

// sector #06
        local_win = newwin(height, width, starty, startx);

// sector #07
#if 1
        box(local_win, 0 , 0); /* 0, 0 gives default characters for the vertical and horizontal lines */
#else
        wborder(local_win, '|', '|', '.', '.', '+', '+', '+', '+');
#endif
        wrefresh(local_win); /* Show that box */
        return local_win;
}


void destroy_win(WINDOW *local_win)
{
        /* box(local_win, ' ', ' '); : This won't produce the desired
        * result of erasing the window. It will leave it's four corners
        * and so an ugly remnant of window.
        */
// sector #08
        wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
        /* The parameters taken are
        * 1. win: the window on which to operate
        * 2. ls: 윈도우 좌 라인
        * 3. rs: 윈도우 우 라인
        * 4. ts: 윈도우 상 라인
        * 5. bs: 윈도우 하 라인
        * 6. tl: 윈도우 좌상 포인트
        * 7. tr: 윈도우 우상 포인트
        * 8. bl: 윈도우 좌하 포인트
        * 9. br: 윈도우 우하 포인트
        */
        wrefresh(local_win);
        delwin(local_win);
}

/* 07_window.c */



 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 '07_window.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

gcc -o window 07_window.c -lncurses

./window [엔터]


 
 
소스해설
 
cbreak()
이 함수는 일전의 예에서도 소개 되었지마는 제어문자까지도 응용 프로그램에서 가로 채어 사용 할 수 있게 해주는 기능을 가집니다.
 
create_newwin()
[sector #02]에서 보이는 이 사용자 정의 함수는 윈도우를 생성하고 사용하게 합니다. 함수의 인자를 보시면 됩니다만 윈도우의 가로, 세로폭과 원점 좌표를 입력 받게 됩니다.

KEY_F(8)
keypad() 함수를 이용하면 이런 문자도 입력 받아 처리(인식) 할 수 있게 됩니다. 특수키인 'F8' 을 확인 합니다.
'ncurses.h' 파일의 후반부를 보시면 이렇게 사용 할 수 있는 키보드 자판 입력이 다음과 같이 리스트 되어 있습니다.
 
#define KEY_DOWN 0402  /* down-arrow key */
#define KEY_UP  0403  /* up-arrow key */
#define KEY_LEFT 0404  /* left-arrow key */
#define KEY_RIGHT 0405  /* right-arrow key */
#define KEY_HOME 0406  /* home key */
#define KEY_BACKSPACE 0407  /* backspace key */
중략 . . .
 
destroy_win()
[sector #04]에서 보이는 이 사용자 정의 함수는 윈도우를 제거 합니다. 섹터#4 이후의 함수에서는 사용자 방향키 입력을 받아 윈도우를 새로 생성하고 기존의 윈도우는 제거 하도록 동작을 반복 하게 되어 있습니다.
 
newwin()
커스 API newwin() 함수는 윈도우를 신규로 생성합니다. [sector #07] 에서는 신규로 생성된 윈도우를 대상으로 경계벽을 그리고(drawing) 있습니다.
box() 함수로 실행 해 보시고, 코드를 수정하여 wborder() 함수로도 실행 해 보시면 그 차이를 확인 하실 수 있을 것입니다.
wborder() 안의 인자(argument) 8개에 대하여는  [sector #08] 안의 주석(remark)을 확인 하시면 되는데, 이는 윈도우 경계벽을 그릴 문자를 함수 인자로 넘겨 받고 있는 것입니다.
 
지금까지 ncurse 프로그램의 입력, 출력 방법을 알아 보았으며 이번 회로써 윈도우를 만드는 법까지 알아 보았습니다.
다음 회가 ncurse 연재 마지막 회가 될 것 같군요.
 
다음 시간에 뵙겠습니다.
NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/27 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 6회 사용자 입력 함수 - 2009/02/09 17:13

이번 시간은 사용자 키보드 입력 방법을 알아 볼 것 입니다.

리스팅1은 예로써 사용될 NCURSE 프로그램입니다.

 
리스팅 1


#include <string.h>
#include <ncurses.h>

//
// 버튼 키입력을 이용한 사용자 대화형 프로그램
//
int noWayOut(char* prompt);

 

int main(void)
{
        initscr();

// sector #01
        /* 펑션키의 사용을 위해 키패드 초기화 */
        keypad(stdscr, TRUE);

// sector #02
        /* set default init mode */
        noecho();
        cbreak();

        printw("Press any key to exit!    ");
        getch();

// sector #03
        while( !noWayOut("Confirm?[Y/N]") )
        {
                sleep(1);
        }

        sleep(1);
        endwin();
        return 0;
}

 

int noWayOut(char* prompt)
{
        int reply;

 

// sector #04
        // save current terminal state
        savetty();

        // set appropriate terminal mode
        noecho();
        raw();

// sector #05
        // clear message line
        move(LINES-1, 0);
        clrtoeol();

// sector #06
        // print prompt
        mvaddstr(LINES-1, 0, prompt);
        move(LINES-1, strlen(prompt)+1);
        refresh();

// sector #07
        // get response from user
        for(reply= -1; reply == -1;){
                switch(getch()){
                case 'y':
                case 'Y':
                        reply = 1;
                        break;
                case 'n':
                case 'N':
                        reply= 0;
                        break;
                case KEY_DOWN:
                        // down arrow key
                case KEY_UP:
                        // up arrow key
// sector #08
                default:
                        beep();
                        break;
                }
        }

// sector #09
        // display feedback string
        addstr(reply == 1? "[Yes]" : "[No]");
        refresh();

// sector #10
        // restore terminal state and return
        resetty();

        return(reply);
}

 

/* 06_getch.c */
 

 

 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 '06_getch.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

 

gcc -o getch 06_getch.c -lncurses

./getch [엔터]


 
 
소스해설
 
keypad()
방향 키(LEFT, RIGHT, UP, DOWN)나 F1, F2 등의 특수 키등을 프로그램에서 인식(사용)하도록 하려면 본 함수를 초기화시 한번 실행 시키면 됩니다.
 
cbreak(), noecho()
cbreak 함수는 raw() 와 상대적으로 사용되는 것으로서 일반문자 뿐만 아니라 'CTRL+C' 와 같은 제어문자 까지도 모두 응용 프로그램에서 가로채어 사용 할 수 있도록 하여 줍니다.
noecho() 는 사용자 키 입력의 반향(echo)을 제어 합니다. 현재의 세팅 값은 반향을 끄도록 합니다.

noWayOut()
[sector #03]의 함수 'noWayOut()'는  사용자 키 입력을 설명하기 위한 예제 함수 입니다.
 
savetty()
현재의 터미널 상태 정보를 저장(backup)합니다.
 
getch()
[sector #07]에서는 사용자 입력키 중 Y(혹은 y) 와 N(혹은 n) 만을 입력 받도록 하고 있습니다. 더불어 이외 키의 경우 beep() 을 이용하여 비프음을 발생하도록 합니다.
한편, [sector #09] 에서는 사용자 키 입력 정보를 YES 혹은 NO 문자로 확인 시켜 줍니다.
 
resetty()
현재의 터미널 상태 정보를 복원(restore)합니다.
 
마지막으로 금번의 예에서는 소개되지 아니 하였지마는 scanw() 나 getstr()도 키 입력을 받는 용도로 사용 할 수 있는 함수들 입니다.
NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/26 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 5회 폰트에 색(COLOR)을 입히자 - 2009/02/09 17:12

이번 시간은 컬러 문자 출력 방법을 알아 볼 것 입니다.

리스팅1은 예로써 사용될 NCURSE 프로그램이며 아래의 그림은 그 실행 결과(예제 color 실행 결과)입니다.

 
예제 color 실행 결과
 
리스팅 1


#include <ncurses.h>

/*
사용 가능한 색상의 속성 필드
======================================
#define COLOR_BLACK     0
#define COLOR_RED       1
#define COLOR_GREEN     2
#define COLOR_YELLOW    3
#define COLOR_BLUE      4
#define COLOR_MAGENTA   5
#define COLOR_CYAN      6
#define COLOR_WHITE     7
*/

//
// Ncurse 폰트 컬러 속성
//
int main(void)
{
        int y, x;

        initscr();

        /* set default init mode */
        noecho();
        raw();

// sector #01
        if(has_colors() == FALSE)
        {
                endwin();
                printf("Your terminal does not support color\n");
                exit(1);
        }
        start_color();

// sector #02
        if(init_color(COLOR_BLUE, 0, 0, 300) == ERR)
        {
                printw("your terminal cannot change the color definitions\n");
                printw("press any key to continue . . .\n");
                getch(); move(0,0);
        }

// sector #03
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_YELLOW, COLOR_BLACK);
        init_pair(4, COLOR_BLUE, COLOR_BLACK);
        init_pair(5, COLOR_MAGENTA, COLOR_BLACK);
        init_pair(6, COLOR_CYAN, COLOR_BLACK);
        init_pair(7, COLOR_WHITE, COLOR_BLACK);
        init_pair(8, COLOR_CYAN, COLOR_MAGENTA);

// sector #04
        attron(A_BOLD);

// sector #05
        attron(COLOR_PAIR(1));
        printw("What's your favorite color(COLOR_RED)\n");
        attron(COLOR_PAIR(2));
        printw("What's your favorite color(COLOR_GREEN)\n");
        attron(COLOR_PAIR(3));
        printw("What's your favorite color(COLOR_YELLOW)\n");
        attron(COLOR_PAIR(4));
        printw("What's your favorite color(COLOR_BLUE)\n");
        attron(COLOR_PAIR(5));
        printw("What's your favorite color(COLOR_MAGENTA)\n");
        attron(COLOR_PAIR(6));
        printw("What's your favorite color(COLOR_CYAN)\n");
        attron(COLOR_PAIR(7));
        printw("What's your favorite color(COLOR_WHITE)\n");
        attron(COLOR_PAIR(8));
        printw("What's your favorite color(NORMAL)\n");

        attrset(A_BOLD);
        getmaxyx(stdscr,y,x);
        mvprintw(y-1,0,"%s","Enter the any button to exit!");
        getch();

        endwin();
        return 0;
}

/* 04_color.c */



 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 '04_color.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

gcc -o color 04_color.c -lncurses

./color [엔터]


 
 
소스해설
 
has_colors()
리스팅1의 [sector #01]을 보시면 has_colors 라는 함수가 사용된 것을 알 수 있습니다. 현재의 단말기(Terminal)이 컬러를 지원 하는지 유무를 확인하는 함수 입니다. 단말기가 컬러를 표현하지 못한다면 당연지사 금번 칼럼에서의 예제는 정상 동작 하지 못하겠지요.
 
start_color()
이 함수는 컬러폰트를 사용 하기에 앞서 항상 해 줘야 하는 초기화 함수로 이해 하시면 됩니다.

init_pair()
[sector #03]을 먼저 설명 하도록 하지요. 리스트1의 상단을 보시면 컬러 값들이 상수 정의 된 것을 보실 수 있을 것입니다. 결론을 먼저 말씀 드리자면 ncurse 에서 사용 가능한 폰트 색상은 8가지 로 제한됩니다. 다만, 이들 컬러를 이용하여 폰트 전경색, 배경색 조합하여 다양한 표현을 할 수는 있습니다.
init_pair 함수는 이 색상 테이블을 만들때 사용 하는 함수입니다. 일종의 폰트 색상 팔레트로 보시면 정확 할 듯 싶군요.
하나만 예를 들어 보자면, init_pair(1, COLOR_RED, COLOR_BLACK); 의 경우 팔레트 넘버 '1'로서 폰트의 전경색(Fore ground color)은 적색으로 그리고 배경색(Back ground color)은 검정색으로 선언 하고 있습니다.
만들 수 있는 팔레트의 최대(MAX) 갯수는 해 보지 않아서 모르겠습니다. 관심 있으신 분은 실제로 만들어 보시면 확인 하 실수 있겠습니다. [sector #03]에서는 실제로 팔레트를 8개 까지만 만들고 있지만 그 이상도 얼마든지 만들 수 있다는 이야기 였습니다.
 
COLOR_PAIR()
COLOR_PAIR 함수와 이전 시간에 공부 하였던 attron 함수의 합작품이군요. [sector #05]을 보시죠. 원하는 색상을 내가 만든 색상 팔레트에서 찾아서 그 팔레트 번호를 확인하여 이런 식으로 사용 하면 됩니다.
attron(COLOR_PAIR(1)); 폰트의 색상을 팔레트 '1'을 참조 하였으니까?. 그러니까 . . . 적색이겠군요. 그 배경색은 BLACK 이겠구요.
하나만 더 해 볼까요? attron(COLOR_PAIR(6)); 팔레트 '6'번 이군요. 그러니까 CYAN 이겠습니다.
 
지금까지 ncurse의 출력 함수들을 다루어 보았으며 이로서 ncurse 가 하는 일(용도)의 윤곽이 어느 정도 드러난 셈이 되었습니다.
따라서 이제 부터 이야기의 전개가 한결 편해 질 듯 싶군요.

NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/25 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 4회 폰트에 변화를 주자 - 2009/02/09 17:11

이번 회와 다음 회에 걸쳐 문자 출력 폰트들에 다양한 효과를 줄 수 있는 방법들을 알아 볼 것 입니다.

리스팅1은 예로써 사용될 NCURSE 프로그램이며 아래의 그림은 그 실행 결과(예제 attr 실행 결과)입니다.

 
예제 attr 실행 결과
 
리스팅 1


#include <ncurses.h>

/*
사용 가능한 폰트의 속성 필드
======================================
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
*/

//
// Ncurse 출력 속성
//
int main(void)
{
        int y, x;
        char c= 'V';
        int atts;

        initscr();


        /* set default init mode */
        noecho();
        raw();


// sector #01
        addch(c|A_BOLD);


// sector #02
        atts= A_BLINK|A_BOLD;
        attrset(atts);  // 속성 세팅 '볼드체'
        move(3, 0);
        addstr("hello, world");


// sector #03
        attroff(atts);  // 속성 변경 'OFF'
        move(4, 0);
        addstr("hello, world");


// sector #04
        attron(atts);   // 속성 변경 'ON'
        move(5, 0);
        addstr("hello, world");


// sector #05
        attrset(A_UNDERLINE);   // 속성 세팅 '밑줄'
        move(6, 0);
        addstr("hello, world");


// sector #06
        attrset(A_NORMAL);      // 속성 '보통체'
        move(8, 0);
        printw("Life is life(A_NORMAL)\n");

        attrset(A_STANDOUT);    // 속성 '강조'
        printw("Life is life(A_STANDOUT)\n");

        attrset(A_REVERSE);     // 속성 '역상'
        printw("Life is life(A_REVERSE)\n");

        attrset(A_BLINK);       // 속성 '깜빡임'
        printw("Life is life(A_BLINK)\n");

        attrset(A_DIM); // 속성 '연한밝기'
        printw("Life is life(A_DIM)\n");

        attrset(A_BOLD);        // 속성 '볼드체'
        printw("Life is life(A_BOLD)\n");

        attrset(A_UNDERLINE);   // 속성 '밑줄'
        printw("Life is life(A_UNDERLINE)\n\n");

        refresh();


        attrset(A_BOLD);
        getmaxyx(stdscr,y,x);
        mvprintw(y-1,0,"%s","Enter the any button to continue!");
        getch();


// sector #07
        move(8,0);
        chgat(-1, A_REVERSE, 0, NULL);

        mvprintw(y-1,0,"%s","Enter the any button to exit!    ");
        getch();


        endwin();
        return 0;
}

/* 03_attr.c */



 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 '03_attr.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

gcc -o attr 03_attr.c -lncurses

./attr [엔터]


 
 
소스해설
 
addch()
리스팅1의 [sector #01]을 보시면 addch 라는 함수가 사용된 것을 알 수 있습니다. 현재의 커서 위치에 1 글자를 출력하는 함수 입니다.
글자의 속성(attr)도 부여 할 수가 있어서 'A_BOLD' 라는 글자 속성으로 표현하고 있습니다. 이 방법은 현재 출력한 문자(열)에만 속성이 부여 된다는 점이 앞으로 설명할 함수들과 차이점 정도가 될 것입니다.
A_BOLD 이외에 사용 할 수 있는 문자 속성 필드들은 리스팅1의 상단 '사용 가능한 폰트의 속성 필드'를 참고 하시거나 혹은,  사용중인 시스템의 '/usr/include' 나 이에 상응하는 표준 헤더 파일 경로내에서 'ncurses.h' 을 찾으신 후 그 파일 내용을 참고 하시기 바랍니다.
 
attrset()
이 함수는 폰트의 속성을 결정 짓습니다. 한번의 세팅으로 이후의 모든 출력은 이 속성 값의 지배를 받게 됩니다. 이 함수는 이전의 속성값을 무시하고 새롭게 속성을 재 정의 하게 되므로 이에 주의를 하고 사용 하여야 할 것입니다.

attron(),  attroff()
attron 함수는 지정한 속성을 이전의 속성에 더해줍니다('+'의 특징). 예를 들어 기존의 속성이 'A_UNDERLINE' 이었고 attron(A_REVERSE); 라고 실행 하였을 경우 새로운 속성은 'A_UNDERLINE | A_REVERSE' 가 될 것입니다.
이에 반하여 attroff 는 그와 반대로 ('-'의 특징)을 갖습니다. 예를 들어 기존의 속성이 'A_UNDERLINE | A_REVERSE' 이었고 attroff(A_UNDERLINE); 라고 실행 하였을 경우 새로운 속성은 'A_REVERSE' 가 될 것입니다.
 
chgat()
이 함수는 이미 화면상에 디스플레이 되어 있는 폰트의 속성에 변화를 줄 수 있습니다.  [sector #07]처럼  chgat(-1, A_REVERSE, 0, NULL); 하였을 경우 첫째인수는 현재 커서 위치부터 속성 변경코저 하는 문자의 수가 됩니다. 특별히 -1로 하였을 경우 이는 해당 라인의 모든 문자를 대상으로 합니다. 두번째인수는 변경할 속성 값입니다. 세번째인수는 보통은 '0'입니다.(COLOR 모드에서는 '1'). 네번째는 항상 NULL 입니다.
 
attrget()
본 예 에서는 사용되지 않았고 한편, 자주 사용 되지는 않지만 필요시 요긴하게 사용 할 수도 있습니다. 현재의 속성값을 읽어오는 함수 입니다.

다음 시간에는 ncurse 에서 를 사용하는 방법들을 다룹니다.
NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/24 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 3회 여러가지 출력함수 - 2009/02/09 17:10

이번 시간에는 ncurse 에서 사용 할 수 있는 여러가지 출력 함수들의 유형을 살펴보도록 합니다.

리스팅1은 예로써 사용될 NCURSE 프로그램입니다.

 
리스팅 1


#include <string.h>
#include <ncurses.h>

//
// Ncurse 출력 함수
//
int main(void)
{
        int y, x;
        int cb[]={'n', 'c', 'u', 'r', 's', 'e'};
        char* string= "Welcome to the curse programming";


        initscr();


        /* set default init mode */
        noecho();
        raw();


// sector #01
        addch(cb[0] | A_BOLD | A_UNDERLINE);
        addch(cb[1]);
        addch(cb[2] | A_BOLD | A_UNDERLINE);
        addch(cb[3]);
        addch(cb[4] | A_BOLD | A_UNDERLINE);
        addch(cb[5]);


// sector #02
        move(3,4); /* 커서를 가로축(x) 4, 세로축(y) 3 위치로 이동시킨다 */
        addch('s');


// sector #03
        mvaddch(3,5,'q');


// sector #04
        addstr(string);
        mvaddstr(y, x, string);


// sector #05
        printw("\nHello Ncurse!\n");


// sector #06
        getmaxyx(stdscr,y,x);
        mvprintw(y/2,(x-strlen(string))/2,"%s",string);


// sector #07
        refresh();
//      while(1);


        getch(); // 사용자 키 입력을 대기
        endwin();
        return 0;
}

/* 02_text.c */



 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 02_text.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

gcc -o text 02_text.c -lncurses

./text [엔터]


 
 
소스해설
 
noecho(), raw()
이 함수 들은 모두 초기화 코드들로 불리우며 터미널(단말)의 속성을 결정 짓는 기능을 수행합니다. 이후의 칼럼들(후반부)에서 다루어 지게 될 것입니다.
 
addch()
리스팅1의 [sector #01]을 보시면 addch 라는 함수가 사용된 것을 알 수 있습니다. 현재의 커서 위치에 1 글자를 출력하는 함수 입니다.
글자의 속성(attr)도 부여 할 수가 있어서 'A_BOLD | A_UNDERLINE' 라는 글자 속성으로 표현하고 있습니다. curse 에서는 이 말고도 여러가지 속성 기능이 있으며 심지어 글자에 색(COLOR)도 입힐 수가 있습니다. 이는 다음회 칼럼에서 곧 다루어 지게 될 것입니다.
한편, addch 함수가 현재의 커서 위치에 문자를 출력하는 함수라고 한다면 [sector #02] 와 같은 방법을 이용하면 내가 원하는 좌표(y,x)에 글자를 출력할 수도 있습니다. 이는 기존에 우리가 알고 있는 표준출력함수 printf()나 putc() 와는 다른 ncurse 만의 특징이라 할 수 있겠습니다. 예상 하시다시피 move(y,x) 는 현재의 커서 위치를 내가 원하는 행(ROW, y)과 열(COL, x) 위치로 이동 시킵니다.
 
mvaddch()
mvaddch(y,x,ch) 을 이용하면 이를 좀 더 편하게 할 수도 있습니다. [sector #03] 참조. 이 함수는 내가 원하는 좌표상에 문자를 출력합니다.

addstr(),  mvaddstr()
addch 와 mvaddch의 스트링 버젼입니다. 이 함수들을 이용하여 문자열을 출력 할 수 있습니다. [sector #04] 참조

printw()
표준 출력 함수인 printf()와 사용법은 같습니다. 현재의 커서 위치에 문자열을 출력 해 줍니다. [sector #05] 참조
 
getmaxyx(), mvprintw()
getmaxyx 함수는 현재 터미널의 가로, 세로 크기를 얻어 옵니다. [sector #06] 에서는 이를 이용하여 출력한 예를 보입니다.
mvprintw 함수는 printw 에 좌표 지정 기능이 추가된 기능입니다.
 
refresh()
지난 시간 칼럼에서 refresh 함수는 실제 화면상에 그 내용을 출력해 주는 기능으로 설명 한 바있습니다.
[sector #07] 에서 주석으로 처리되어 있는 // while(1); 문장을 활성화 시킨 후 다시 컴파일 하여 동작 시켜 보세요. 화면상에 아무 내용도 출력 되지 않을 것입니다.
마지막으로 다음처럼 한가지를 더 해 보세요. [sector #07] 의 코드 2줄을 모두 비 활성화 한 후 다시 컴파일 하여 동작 시켜 보세요.
.
.동작 결과를 보고 한번 곰곰히 생각해 보신 후 아래 내용을 보세요
.
.
.
.
.
getch() 함수에는 refresh 의 동작도 겸하고 있는듯 합니다. 어쨋든 이로써 우리는 ncurse 프로그래밍시 유의 해 야할 것들을 다시금 확인 한 셈이 됩니다.
결론적으로 우리는 refresh()을 적재 적소에 넣어 주는 것을 게을리 하지 않아야 합니다.
 
다음 시간에는 ncurse 의 글자에 속성을 부여하는 기능들을 다룹니다.
NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/23 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 2회 'Hello Ncurse!' - 2009/02/09 17:10

이번 시간에는 ncurse 프로그램의 가장 간단한 형태인 이른바 'Hello world' 을 만들어 보고 그 내용을 파악해 보도록 하겠습니다.

리스팅1은 전형적인 NCURSE 프로그램의 예를 보이고 있습니다.

 
리스팅 1

 

#include <ncurses.h>

//
// 화면상에 "Hello Ncurse!" 문자열을 디스플레이 한다
//
int main(void)
{
        initscr();
       
        /* main body */
        printw("Hello Ncurse!");
        refresh();

        getch();
        endwin();

        return 0;
}

/* 01_curse.c */

 

 

 
본 칼럼에서 사용된 예제를 직접 동작 시켜보기 위하여는 '01_curse.c' 라는 새 파일을 만드신 후 리스트1의 소스를 카피 해 넣으시고 아래의 컴파일및 실행요령을 따라 하시면 되겠습니다.
 
컴파일및 실행요령

 

gcc -o curse 01_curse.c -lncurses

./curse [엔터]


 
 
소스해설
 
initscr()
커스 터미널의 초기화 코드입니다. 이 함수는 화면을 지우고 공백 상태로 만듭니다. 커스 프로그램의 어떤 함수보다도 먼저 실행되어야 합니다.
보통 프로그램의 시작부에 놓이게 됩니다.
 
printw()
printf 와 동일한 기능을 하는 문자열 포맷출력 함수입니다. 현재의 커서 위치(y,x) 좌표상에 문자열을 출력해 줍니다. 부언한다면 문자열 출력버퍼상에 해당 문자들이 채워지며 이는 이후의 refresh() 함수에 의하여 실제 화면상에 표시되게 됩니다.

refresh()
printf 류의 함수들은 가상의 윈도우 버퍼상에 문자열을 출력하며 refresh() 함수가 실행 되었을때 비로소 그 내용이 화면상에 출력되게 됩니다.
이러한 특성은 잦은 화면 출력으로 생길수 있는 시스템의 성능 감소를 방지하며 사용자에게 때로는 편리함을 제공하기도 합니다.
반면, 사용자가 실수로 이 함수를 추가하는것을 잊게 된다면 화면상에는 의도한 출력이 일어 나지 않게 되므로 주의가 필요한 부분이기도 합니다.

endwin()
ncurse 프로그램의 종료시에 항상 호출되어야 합니다. 이 함수에서는 ncurse 사용 동적메모리를 반납하고 터미널을 다시 일반 모드로 전환 시킵니다.
고의로 혹은 부주의로 이를 빼먹었을 경우 터미널은 이상한 상태로 빠져 버릴 수도 있습니다.
 
ncurse 프로그램은 항상 다음과 같은 틀(Template)로 코드를 작성합니다.
 
ncurse 프로그램 템플리트

 

initscr();
 
본문내용을 여기에 . . .

endwin();



다음 시간에는 ncurse 의 여러가지 출력함수를 다룹니다.
NEXT . . .
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/22 관련글 쓰기
Name
Password
Homepage
Secret

NCURSE 로 만들어 보는 유저 인터페이스(UI) - 1회 - 2009/02/09 17:08

임베디드 리눅스 커널 컴파일시에 사용 되는 툴의 모습입니다. 콘솔상에서 'make menuconfig' 라고 입력하면 '[그림1] ncurse가 사용된 프로그램의 예' 과 같은 모습의 프로그램이 화면에 보이고 간단한 메뉴 조작으로써 사용자의 입력을 받아들이고 이를 처리하도록 만들어져 있다는 것을 아주 잠시동안 이나마 바라보고 있노라면 이내 짐작 할 수 있습니다.

 

[그림1] ncurse가 사용된 응용 프로그램의 예
 
마찬가지로 '[동영상1]. ncurse 라이브러리가 사용된 또 다른 프로그램의 예' 을 하나 더 보시면 금번 칼럼에서 의도하는 바를 짐작하시는데 도움이 될 것입니다.

[동영상1] ncurse 라이브러리가 사용된 또 다른 프로그램의 예

 

ncurse란?

curse 라는 것은 일종의 라이브러리로서 단말기(terminal) 독립적인 사용자 입출력 인터페이스를 제작하는데 사용됩니다. 단순한 문자 입출력 뿐만이 아니고 커서를 이동한다든지, 문자의 속성(볼드/이탤릭/색상)을 변경하고 윈도우를 만들고 원하는 좌표상에 문자열을 디스플레이 할 수도 있습니다.
이를 이용하면 사용자는 텍스트 방식이나마 간단한 UI 을 제작 할 수 있게 됩니다. 또한, 금번 기획칼럼에서 다루고저 하는 주제인 ncurse 라이브러리는 System V Release 4.0(SVr4) curse 의 확장판 정도로 생각 할 수 있습니다.
 

ncurse을 사용하려면 준비사항은?

해당 시스템 혹은 크로스 컴파일 환경 상에서 ncurse 라이브러리가 설치 되어 있어야 합니다.
그렇지 않을 경우 설치용 패키지는 다음의 경로에서 구할 수 있습니다. ftp://ftp.gnu.org/pub/gnu/ncurses
 
컴파일및 설치 요령

tar zxvf ncurses<version>.tar.gz   ; unzip and untar the archive
cd ncurses<version>    ; cd to the directory
./configure      ; configure the build according to your environment
make       ; make it
su root       ; become root
make install       ; install it


 
rpm으로 설치 하시기 위하여는 http://rpmfind.net 에서 NCURSES RPM 을 찾으시면 됩니다. 설치는 다음처럼 합니다.

rpm -i <downloaded rpm>


 
다음 시간에는 ncurse 의 첫번째 예제가 소개 됩니다.
SEE YOU ! ♡
posted by 가일(GUILE)

♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요->

Trackback Address :: http://www.hongikcom.com/trackback/21 관련글 쓰기
  • BlogIcon muzie | 2009/07/09 23:14 | PERMALINK | EDIT/DEL | REPLY

    블로그 쭉 둘러 보고 있습니다. 임베디드 쪽 공부하는 학생이라 정말 주옥같은 자료가 많네요 ^^ㅋ
    모쪼록 하고 계시는일 건승 기원합니다 :-)

Name
Password
Homepage
Secret