ncurses 04 – 초기화

hello world를 출력하면서, 일단 초기화를 위해서 initscr() 함수를 이용하는 것에 대해서 다룬 적이 있다. 이러한 초기화 함수들이 ncurses에서는 여러가지가 존재한다. 화면 클리어화부터 시작해서 키보드 입력 초기화, 마우스 입력 초기화 등 다양한 함수들이 존재한다. 이 중에서도 일단 초기화에 필요한 함수들을 몇 가지 보고 실제로 조금씩 써보는 예제까지 만들어 보겠다.

  • raw() 함수와 cbreak() 함수

일반적으로 터미널 드라이버는 새 줄이나 캐리지 리턴이 발생할 때까지 사용자가 입력하는 문자를 버퍼링한다. 그러나, 대부분의 프로그램에서는 사용자가 입력하는 즉시 문자를 사용할 수 있어야 한다. 그래야 사용자가 사용을 하고 있다는 것을 알 수 있다. 그래서 이 두 함수를 이용하여 라인 버퍼링을 비활성화하는 데 이용한다. 두 함수의 차이는 일시 중단(ctrl + z), 인터럽트 및 종료(ctrl + c)와 같은 제어 문자가 프로그램에 전달되는 방식의 차이가 있다. raw() 함수 모드에서는 이러한 문자는 신호를 생성하지 않고 프로그램에 직접 전달한다. 반면에 cbreak() 함수 모드에서는 이러한 제어 문자는 터미널 드라이버에 의해 다른 문자로 해석된다. 어떤 함수를 이용하던 상관은 없지만, 주로 raw() 함수를 사용하는 것을 추천한다. 사용자가 하는 일을 보다 더 잘 제어할 수 있기 때문에 추천한다. (제어를 보다 단순하고 직관적으로 할 수 있다. 중요한 사항이다.)

  • echo() 함수와 noecho() 함수

이 함수는 사용자가 터미널에 입력한 문자에 대해 반응을 한다. noecho() 함수는 반응을 하지 않는다.  사용자가 getch() 함수와 같은 함수를 통해 입력을 가져오는 동안 반응을 제어하거나 불필요한 반응을 하지 않도록 하기 위해서는 noecho() 함수를 이용하는 것이 좋다. 그러나 대부분의 대화형 프로그램은 초기에 초기화를 할 때에는 noecho()를 호출하고 나중에 제어된 반응을 보여주기 위해 echo() 함수를 이용한다. 반응에 대해서는 좌표 업데이트와 상관 없이 창의 모든 위치에서 문자를 출력 반응을 하도록 유연하게 동작할 수 있다.

  • keypad() 함수

이 함수는 F1, F2, 화살표 키 등의 기능키를 읽을 수 있는 함수이다. 거의 모든 대화형 프로그램에서 이용하는 주요 부분에 이용된다. 사용자 인터페이스의 제어에도 이용하기 때문에 상당히 자주 이용된다. keypad(stdscr, TRUE) 라고 사용하여 일반 화면에서의 제어 기능을 활성화 할 수 있다. 이것은 실제 예제를 보고 알면 될 것이다.

  • halfdelay() 함수

자주 사용하는 함수는 아니지만 유용한 기능이다. 이름 그대로 반 지연 모드를 활성화하기 위해 호출하는 함수이다. 이 함수 모드는 입력 된 문자를 즉시 프로그램에서 사용할 수 있다는 점에서 cbreak() 함수와 유사하다. 그러나 입력을 위해 몇 초 동안 대기 한 다음 사용 가능한 입력이 없으면 ERR를 리턴한다. 몇 초라는 것은 halfdelay() 함수에 전달 된 시간 초과 값이다. 이 함수를 이용하여 사용자에게 입력을 요청할 때 특정 시간에 응답하지 않으면 다른 작업을 수행할 수 있도록 할 수 있다.

이 외에도 여러모로 초기화 함수가 존재하는데, 함수가 너무 많기 때문에 일단 자주 보이는 함수에 대해서만 작성을 하였다. 그리고 이를 통해 예제도 작성해보았다. 입력된 키가 F1 키일 경우에는 F1이 눌렸다는 문장을 출력하고, 그냥 일반 키가 입력되면 입력된 키를 출력하는데, 출력을 볼드(두껍게)하도록 출력하였다. 이를 위해 keypad 함수를 이용하였고, F1 기능키를 확인할 수 있는 조건문을 통해서 특수키가 어떻게 제어되는지 간단히 보여줬다.

스크린샷 2017-10-28 오후 3.40.24

이를 실행하기 위해 간단하게 빌드를 진행하였다.

스크린샷 2017-10-28 오후 2.22.11

실행을 우선 두 가지로 진행하였다. 첫 번째는 F1을 눌렀을 때 어떻게 되는지 보여준다.

스크린샷 2017-10-28 오후 3.18.35

그리고 나서 다른 키를 또 누르면 실행이 끝난다. 계속 실행되도록 하질 않아서 그런다.

두 번째로는 A를 입력하였을 때, A가 볼드 처리되어 출력되는 것을 볼 수 있다.

스크린샷 2017-10-28 오후 3.18.46

볼드 처리를 위해서 attron, attroff를 통해 문자 처리도 어떻게 되는지 볼 수 있다.

초기화에 대해서는 어떻게 되는 지 보고 간단한 예제만 보더라도 어떻게 실행되는지를 먼저 알아두는 게 좋다. 이제 이걸 나중에 계속 짜봐야 좀 알게된다.

“ncurses 04 – 초기화”의 2개의 생각

  1. 안녕하세요. 혹시 ncurses에 대해서 잘 아시는지요?

    snake 게임을 c++로 짜야 하는데 엄두가 안나서 문의를 드립니다.
    혹시 도움을 받을수 있을런지요?

    1. 블로그 준비하면서 간만에 들어왔는데 댓글이 달렸군요.
      미완중인 내용에 관심 보여서 연락 주신 건 감사합니다만
      혹시 과제 관련 질문이나 도움이라면 죄송하지만 정중하게 거절하고 있습니다.
      더 찾아보시면서 알아가시면 잘 하실 수 있을꺼라 봅니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.