본문 바로가기

About 배우고 익히는법/펌글

[Linux] Charater Cell Graphics

8. 문자단위 그래픽스 (Character Cell Graphics)

이장은 화소(pixel)를 기본으로 하지않는, 문자를 기본으로 하는 화면 입력과 출력을 다룬다. 우리가 문자(character)를 말할 때, 문자는 문자집합(charset)에 따라 변화되는 화소(pixel)의 조합을 의미한다. 텍스트(text)가 화소(pixel) 그래픽보다 매우 빨리 처리되기 때문에 그래픽 카드(graphic card)는 이미 한개이상의 문자집합(charset)을 제공하고, 기본적으로 텍스트(charset) 모드에서 동작한다. 간단(무딘)하고 지겨운 텍스트 표시하는 것 이상으로 단말기를 다룰 수 있다. 리눅스 단말기(terminal), 특히 콘솔(console)이 제공하는 특별한 특징들을 어떻게 사용할 것인가에 대해 설명하고자 한다.

  • printf, sprintf, fprintf, scanf, sscanf, fscaf
    이러한 함수들을 가지고 (표준출력 standard output), (표준에러 standard error), 또는 FILE *stream (files, 예를 들면)와 같은 다름 스트림(stream)에 형태가 지정된(formatted) 문자열을 출력할 수 있다. Scanf(...)는 비슷한 방법으로 형태가 지정된(formatted) 입력을 제공한다.
  • termcap
    단말기 능력 데이타베이스 (The TERMinal CAPabilites database)는 /etc/termcap 이라는 ASCII 파일에 들어있는 단말기 특징 개체(terminal description entries)들의 집합이다. 여기서 특수문자들을 어떻게 표시하는가, 어떻게 동작(delete,insert characters or line)들을 수행하는가 그리고 단말기를 어떻게 초기화 하는가에 대한 정보를 찾을 수 있다. 이 데이타베이스는, 예를들면, vi 에디터에 의해 사용된다. 단말기 능력(terminal capabilities) (termcap(3x))을 사용하고 읽을 수 있는 view 라이브러리 함수들이 있다. 이 데이타베이스를 가지고, 프로그램은 같은 코드를 가진 단말기에서 다양한 작업을 할 수 있다. termcap 데이타베이스와 라이브러리 함수들의 사용은 단말기에 대해 오직 하위 수준의 접근 (low level access)을 제공한다. 속성(attributes)과 색상(colors)과 매개변수화된(parameterized) 출력을 바꾸는 것은 프로그래머에 의해 수행되어야만 한다.
  • terminfo database
    단말기 정보 데이타베이스(the TERMinal INFOrmation database)는 termcap database를 기초로 하고 단말기 능력(terminal capabilities)을 설명하고 있지만, termcap보다는 더높은 수준(higher level)이다. terminfo를 사용하여, 프로그램은 화면 속성(screen attributes), 펑션키(function keys)와 같은 특별한 키의 사용과 그외의 것들을 쉽게 바꿀 수 있다. 데이타베이스는 /usr/lib/terminfo/[A-z,0-9]*에서 찾을 수 있다. 모든 파일은 한 단말기를 설명한다.
  • curses
    Terminfo는 프로그램안에서 단말기(terminal)를 다루기(handling) 위한 좋은 기초이다. (BSD-)CURSES 라이브러리는 단말기에 대해 상위 수준의 접근(high level access)을 가능하게 하며, terminfo database를 기초로 한다. curses는 화면상의 윈도우를 열고 조종할 수 있도록 하며, 입력과 출력 함수들의 완벽한 집합을 제공하고 150개 이상의 단말기에 대해 단말기의 독립적인 방식의 비디오 속성을 변경시킬 수 있다. curses 라이브러리는 /usr/lib/libcurses.a에서 찾을 수 있다. 이것은 curses의 BSD 버전이다.
  • ncurses
    Ncurses는 한단계 향상된 것이다. 1.8.6 버전에서는 SYSVR4에서 정의된 AT&T curses와 호환 되어야만 하고 색상 조종(color manipulation), 출력을 위한 특별한 최적화(special optimization for output), 단말기 지정 최적화(terminal specific optimizations) 등과 같은 확장을 가져야만 한다. 이것은 SUN-OS, HP, Linux와 같은 많은 시스템들에서 테스트 되어 왔다. 다른 것들을 대신해서 ncurses를 사용할 것을 추천한다. SYSV 유닉스 시스템(SUN의 Solaris같은) 상에서는 nurses와 같은 기능을 갖는 curses 라이브러리가 존재해야 한다. (실제로 solaris curses는 마우스 지원과 보다 많은 기능을 가지고 있다.)
다음의 장에서 단말기를 다루기 위해 다른 패키지들을 어떻게 사용하는가에 대해 설명하겠다. 리눅스는 termcap의 GNU-버전을 가지고 있고 우리는 curses 대신에 nurses를 사용할 수 있다.


8.1 libc안의 I/O 함수 (I/O Function in libc)


8.1.1 형식화된 출력 (Formatted Output)

  printf(...) 함수는 형식이 있는 출력을 제공하고 아규먼트의 변형을 허락한다.

  • int fprintf(FILE *stream, const char *format, ...),
    은 출력을 변형시키고 stream에 쓴다. format안에 정의된 형태(format)로 쓰여진다. 이 함수는 쓰여진 문자들의 갯수를 반환하거나 에러시는 음수값을 반환한다.

    format는 두 종류의 객체를 포함한다.

    1. 출력을 위한 정상적인 문자들과
    2. 아규먼트를 어떻게 변형시키고 형식화할 것인가의 정보
    형식 정보 (format information)는 %로 시작하여 뒤에 형식을 지정하는 값과 변형을 위한 문자가 따라와야 한다. (%자체를 인쇄하기 위해 %%를 사용한다.) 형식에서 사용가능한 값들:

    • Flags
      • -
        형식화된 아규먼트는 왼쪽 여백에 인쇄된다. (디폴트는 아규먼트 필드의 오른쪽 여백이다.)
      • +
        모든 숫자가 부호를 가지고 인쇄된다. (예, +12, -2.32)

       

    • Blank
      첫번째 문자가 부호를 가지고 있지 않으면, 공백이 삽입된다.
    • 0
      숫자 변환을 위해 필드의 폭은 왼쪽 편이 0으로 채워진다.
    • #
      아규먼트를 위한 변환에 따라 출력을 바꾼다.
      • o 에 대해, 첫번째 숫자는 0.
      • x, X 에 대해, 0x 또는 0X가 아규먼트의 앞에 인쇄된다.
      • e, E, f, F 에 대해, 출력은 소수점을 갖는다.
      • g, G 에 대해, 아규먼트의 끝에 제로(zeroes)가 인쇄된다.

       

    • 최소한의 필드 폭을 위한 수
      변형된 아규먼트는 아규먼트 자체의 가장 최소한의 크기를 갖는 필드안에 인쇄된다. 이 수(number)를 가지고 필드의 폭을 더 크게 만들 수 있다. 형식화된 아규먼트가 더 작은 경우, 필드의 폭은 제로 또는 공백으로 채워진다.
    • 필드의 폭과 정확도를 나누기 위한 점.
    • 정확도를 위한 수.

     

  • int printf(const char *format, ...)
    fprintf(stdout,...)와 같음
  • int sprintf(char *s, const char *format, ...)
    출력이 문자(character) 포인터인 s (끝에 \0를 갖는)에 쓰인다는 것을 제외하곤 printf(...)와 같음

    (Note: s를 위한 충분한 메모리를 할당해야한다.)

  • vprintf(const char *format, va_list arg)
    vfprintf(FILE *stream, const char *format, va_list arg)
    vsprintf(char *s, const char *format, va_list arg)
    오직 arg에 아규먼트 리스트가 지정된 것일뿐, 위의 함수들과 같음

8.1.2 형식화된 입력 (Formatted Input)

  형식화된 출력을 위해 printf(...)를 사용하는 것처럼 형식화된 입력을 위해 scanf(...)를 사용할 수 있다.

  • int fscanf(FILE *stream, const char *format, ...)
    fscanf(...)는 stream으로 부터 읽어서 format에서 정의된 규칙에 따라 입력을 변환한다. 결과는 주어진 아규먼트 안에 위치하게 된다. (Note:아규먼트들은 포인터여야만 한다.) format안에 더이상의 변환 규칙이 없을 때까지 읽는다. fscanf(..)는 첫번째 변환이 파일의 끝에 도달했거나 에러가 발생했을 때 EOF를 반환한다. 그렇지 않으면, 변환된 아규먼트의 수를 반환한다.

    format은 입력 아규먼트를 어떻게 형식화할 것인가에 대한 규칙을 포함한다. 이것은 또한 포함한다.:

    • 공백(spaces)이나 탭(tab)은 무시된다.
    • (%를 제외한) 일반적인 문자. 문자들은 연관된 위치의 입력안에 있어야 한다.
    • %, 부가적인 문자 *(이것은 fscanf(..)가 아규먼트를 지정하는 것을 허락한다), 부가적인 숫자, 부가적인 문자 h,l 또는 L (이것은 타겟의 길이이다) 과 변환 문자로 조합된 변환 규칙들
  • int scanf(const char * format, ...)
    fscanf(stdin,...)과 같음
  • int sscanf(char *str, const char *format, ...)
    scanf(...)와 같지만, 입력은 str로 부터 온다.

8.2 Termcap 라이브러리 (The Termcap Library)


8.2.1 소개 (Instruction)

termcap 라이브러리는 /etc/termcap/에서 찾을 수 있는 termcap database에 대한 API이다. 이 라이브러리 함수들은 다음의 동작을 허용한다.:

  • 현재 단말기의 설명(description)을 얻는다 : tgetent(...)
  • 정보를 위한 설명을 검색한다 : tgetnum(...), tgetflag(...), tgetstr(...)
  • 단말기의 지정 형태안에 숫자 파라미터들을 암호화한다 : tparam(...), tgoto(...)
  • 충전물을 계산하고 수행한다 : tputs(...)

termcap 라이브러리를 사용하는 프로그램은 .h를 포함(include)하고 연결(link)되어야만 한다.

Termcap 함수들은 단말기에 독립적인 루틴들이지만 프로그래머들에게 단말기에 대한 하위 수준의 접근을 가능하게 한다. 보다 높은 패키지를 위해서는, curses나 ncurses가 사용되어야만 한다.

 

8.2.2 단말기 내용 찾기 (Find a Terminal Description)

  • int tgetent(void *buffer, const char *termtype)
    리눅스 운영체제 시스템상에서 현재 단말기 이름은 환경변수 안에 포함된다. 그래서, termtype는 (3)의 호출의 결과이다.

    termcap의 GNU 버전을 사용할 때 버퍼를 위한 메모리의 할당은 없다. 이것은 리눅스 하에서 우리가 가정할 수 있는 것이다. 그렇지 않으면, 2048 바이트를 할당해야만 한다. (전에는 버퍼는 오직 1024 바이트만이 필요했었지만, 그 크기가 두배가 되었다.)

    tgetent(...)는 성공시 1을 반환하고 데이타베이스가 발경되었지만 TERM을 위한 개체(entry)가 없을 때 0을 반환한다. 나머지 에러들은 다른 값들을 반환한다.

    다음의 예제는 tgetent(...)를 어떻게 사용하는지 설명해야만 한다.:

    디폴트로 termcap은 데이타베이스처럼 /etc/termcap/을 사용한다. 한예로, 환경변수 TERMCAP이 $HOME/mytermcap로 지정되어 있으면, 모든 함수들은 /etc/termcap을 대신하여 사용한다. TERMCAP안에 선행하는 슬래쉬(slash)가 없는 정의된 값은 단말기에 대한 이름처럼 사용된다.

8.2.3 단말기 내용 살펴보기 (Look at a Terminal Description)

정보의 모든 조각들은 능력(capability)이라 불리어 진다. 모든 능력(capability)은 두 글자 코드이고, 모든 두 글자 코드는 능력(capability)을 위한 값에 의해 다음과 같다. 가능한 타입들:

  • 숫자(Numeric):예를 들어 co - 컬럼의 수
  • 논리적 자료 또는 플래그(Boolean or Flag):예를 들어 hc - 하드카피 단말기(hardcopy terminal)
  • 문자열(String):예를 들어 st - 탭 위치 지정

각각의 능력(capability)은 단일 값 타입과 연관되어있다. (co는 항상 숫자, hc는 항상 플래그 그리고 st는 항상 문자열) 값들에는 세게의 다른 타입이 있고 그것들에게 질문하기위한 세개의 함수가 있다. char *name은 능력(capability)를 위한 두 글자 코드이다.

  • int tgetnum(char *name)
    co와 같은 숫자(numeric) 능력(capability) 값(value)을 얻는다. tgetnum(...)는 능력을 사용가능하다면, 숫자값을 반환하고 그렇지 않으면 1을 반환한다. (Note:반환되는 값은 음수가 아니다.)
  • int tgetflag(char *name)
    논리적(boolean) 자료 (또는 플래그(flag))인 능력 값을 얻는다. 플래그가 존재하면 1, 그렇지 않으면 0을 반환한다.
  • char *tgetstr(char *name, char **area)
    문자열인 능력값을 얻는다. 문자열에 대한 포인터를 반환하고 존재하지 않으면 NULL을 반환한다. GNU 버전에서, 영역이 NULL이면, termcap은 스스로 메모리를 할당할 것이다. termcap은 결코 그 포인터를 다시 참조하지 않는다. 그러므로 프로그램을 떠나기 전에 name을 풀어주는 것을 잊지말아라. 우리가 포인터를 위해 얼마나 많은 공간이 필요한지를 모르기 때문에, termcap이 이러한 일을 하도록 하는 것이 더 좋다.

8.2.4 Termcap 능력들 (Termcap Capabilities)



Boolean Capabilities

5i 프린터가 화면에 echo를 하지 않는다. am 자동 줄 바꿈을 의미하는 자동 마진 bs Control-H(8 dec)는 backspace를 수행한다. bw 왼쪽 여백에 대한 backspace는 이전의 라인과 오른쪽 여백을 가린다. da 표시(display)가 화면 위로 유지된다. db 표시(display)가 화면 아래로 유지된다. eo 공백이 커서 위치의 모든 문자들을 지운다. es Escape sequences와 특수문자들은 상태줄(ststus line)에서 작업한다. gn 일반적인 장치 hc 이것은 hardcopy 단말기이다. HC 커서는 바닥줄에 있지 않을 때 보기 어렵다. hs 상태줄(status line)을 갖는다. hz Hazel tine bug, 단말기는 물결(tilde) 문자들을 인쇄할 수 없다. in 단말기는 흰색공백을 채우기위해 공백이 아닌 NULL을 삽입한다. km 단말기는 메타 키(meta key)를 갖는다. mi 커서의 움직임은 삽입 모드에서 동작한다. ms 커서의 움직임은 표준출력/밑줄 모드에서 동작한다. NP pad 문자는 없다. NR ti는 te로 바뀌지 않는다. nx padding 없이, XON/XOFF를 사용해야만 한다. os 단말기는 overstrike 할 수 있다. ul overstrike 될 수 없을 지라도 단말기는 밑줄 그어 진다. xb Beehive glitch, f1는 ESCAPE를 보낸다, f2는 ^C를 보낸다. xn Newline/wraparound glitch xo 단말기는 xon/xoff 프로토콜을 사용한다. xs 표준출력을 통한 텍스트는 표준출력으로 표시되어진다. xt Teleray glitch, destructive tabs and odd standout mode 


Numeric Capabilities


String Capacilies

 

8.3 Ncurses - 소개 (Introduction)

다음 용어들은 이 장에서 사용될 것이다.:

  • window - 화면의 부분 이미지를 포함하는 내부적 표현이다. WINDOW는 .h에 정의되어있다.
  • screen - 전체 화면(좌측 상단에서 부터 우측 하단까지) 크기를 갖는 창(window)이고 화면들이다.
  • terminal - 화면이 현재 무엇처럼 보이는지에 대한 정보를 가지고 있는 특별한 화면(screen)이다.
  • variables - 다음의 변수들과 상수들은 in.h에 정의되어있다.
    • WINDOW *cursor - 현재 화면(current screen)
    • WINDOW *stdscr - 표준 화면(standard screen)
    • int LINES - 단말기(terminal)상의 라인들
    • int COLS - 단말기(terminal)상의 컬럼들
    • bool TRUE - true flag, 1
    • bool FALSE - false flag, 0
    • int ERR - error flag, -1
    • int OK - ok flag, 0
  • functions - 함수안에서 아규먼트에 대한 묘사는 다음의 타입이 있다:
    • win - WINDOW*
    • bf - bool
    • ch - chtype
    • str - char*
    • chstr - chatype*
    • fmt - char*
    • otherwise int

대개 ncurses 라이브러리를 사용하는 프로그램은 이처럼 보인다.:

.h를 포함하는(including) 것은 WINDOW와 함수원형(function prototype)와 같이 ncurses를 위한 변수들과 타입들을 정의한다. 자동적으로 .h,.h,.h,.h를 포함한다.

initscr()는 ncurses 자료 구조들을 초기화하고 적당한 terminfo 파일을 읽는데 사용된다. 메모리는 할당되어진다. 에러가 발생한다면, initscr는 ERR를 반환한다 그렇지않으면 포인터가 반환되어진다. 부가적으로, 화면은 지워지게 되고 초기화 되어질 것이다.

endwin()은 ncurses로 부터 할당된 모든 자원들을 청소하고 tty 모드에 initscr()을 호출하기 전 상태를 저장한다. initscr()은 curses로 부터 다른 어떤 함수이전에 호출되어져야 하고 endwin()는 프로그램을 끝내기 전에 호출되어져야 한다. 한 단말기 이상에 출력을 하고자 할 때는 initscr() 대신에 newterm(...)를 사용할 수 있다.

프로그램 컴파일하기:

플래그 안에 당신이 좋아하는 것을 포함할 수 있다(gcc(1)). ncurses.h를 위한 경로가 수정되었으면 다음 줄을 포함(include)하여야 한다.

그렇지 않으면, ncurses.h,nterm.h,termcap.h,unctrl.h은 찾을 수 없을 것이다. Linux에서 사용가능한 다른 플래그들:

2는 gcc에게 최적화(optimization)하라고 말한다, -ansi는 ansi에 일치하는 c-code용이다, -Wall는 모든 경고(warning)를 인쇄할 것이다, -m486는 인텔 486를 위한 최적화된 code를 사용할 것이다.(binary는 인텔 386상에서도 사용될 수 있다.).

ncurses 라이브러리는 /usr/lib에서 찾을 수 있다. ncurses 라이브러리는 세 버전이 있다.

  • libncurses.a 표준 ncurses 라이브러리
  • libdcurses.a 디버깅(debugging)을 위한 ncurses
  • libpcurses.a profiling를 위한 ncurses (1.8.6 libpcurses.a 이래 더이상 존재하지 않는다 ?)
  • libcurses.a 네번째 버전은 아니지만, 최초의(original) BSD curses이다. (내 슬랙웨어 2.1.0에서는 bsd 패키지이다).

화면(screen)을 위한 자료구조는 .h에 정의된 것처럼 윈도우즈(Windows)라 불리어 진다. 윈도우는 프로그래머가 단말기에 출력하는 것없이 조종할 수 있는 메모리 안에 있는 문자 배열과 같은 것이다. 디폴트 윈도우는 단말기의 크기이다. newwin(...)를 가지고 다른 윈도우를 만들 수 있다.

최상으로 물리적인 단말기를 업데이트하기 위해, ncurses는 선언된 또 다른 윈도우를 가지고 있다. 이것은 단말기가 실제로 어떻게 보여지는가의 이미지이고 단말기가 어떻게 보여져야만 하는가의 이미지이다. refresh()가 호출될 때 출력되어질 것이다. ncurses는 안에 있는 정보를 가지고 물리적인 단말기를 업데이트할 것이다. 라이브러리 함수들은 업데이트 프로세스를 위해 내부의 최적된 것을 사용할 것이므로 가장 최적의 방법으로 다른 윈도우들을 변화시키고 한번에 화면을 업데이트할 수 있다.

ncurses 함수들을 가지고 자료 구조체 window를 조종할 수 있다. w로 시작하는 함수들은 당신이 윈도우(window)를 지정하는 것을 허용하는 반면, 다른 것들은 일반적으로 작용한다. mv로 시작하는 함수들은 커서를 처음의 y,x 위치로 이동시킨다.

문자는 속성(attributes)에 대한 부가적인 정보를 저장하는 long unsigned int값인 chtype 타입을 갖는다.

ncurses는 데이타베이스를 사용한다. 일반적으로 데이타베이스는 /lib/terminfo에 위치하고 ncurses는 지역 단말기 정의를 거기서 찾는다. 원래의 terminfo를 변화시키지 않고 단말기에 대한 몇몇 다른 정의들을 테스트하기를 원한다면, 환경변수(environment variable)를 지정(set)하라. ncurses는 이 변수들을 체크하고 /usr/lib/terminfo/를 대신하여 거기에 저장된 정의들을 사용할 것이다.

현재 ncurses 버전은 1.8.6()이다.

이장의 끝에서 BSD-Curses,ncurses와 Sun-OS 5.4의 curses에 대한 개관(overview)이 담긴 표를 발견할 수 있다. 지정된 함수와 그것이 구현된 곳을 찾고자 할 경우에 참조하라.

 

8.4 초기화 (Initializing)

  • WINDOW *initscr()
    이것은 ncurses를 사용하는 프로그램으로 부터 일반적으로 호출되는 첫번째 함수이다. 몇몇 경우에 있어서 slk_init(int), filter(), ripoffline(...) 또는 initscr() 이전의 use_env(bf) 호출은 유용하다. 여러개의 단말기를 사용할 때 (또는 능력(capabilities)을 테스트하는 경우), initscr()을 대신하여 newterm(...) 를 사용할 수 있다.

    initscr()는 적당한 terminfo 파일을 읽고 ncurses 자료 구조를 초기화하고 메모리를 할당하고 단말기가 가지고 있는 값들을 지정(set)할 것이다. 이것은 포인터를 반환하거나 에러가 발생했을 때 ERR를 반환한다. 포인터를 초기화할 필요는 없다.

    initscr()는 당신을 위해 이것을 할 것이다. 반환값이 ERR이면, 당신의 프로그램은 ncurses 함수가 작업할 수 없으므로 종료해야만 한다.

     

  • SCREEN *newterm(char *type, FILE *outfd, FILE *infd)
    다수의 단말기 출력을 위해 initscr()를 대신하여 ncurses를 가지고 접근하기 위해 각각의 단말기에 대해 newterm(...)를 호출한다. type은 $TERM안에 포함되어 있는 단말기의 이름(예:ansi, xterm, vt100)이고 outfd는 출력 포인터(output pointer)이고 infd는 입력을 위해 사용되는 포인터이다. newterm(...)에 의해 열려진 각 단말기에 대해 endwin()를 호출하라.

     

  • SCREEN *set_term(SCREEN *new)
    set_term(SCREEN)를 가지고 현재의 단말기를 바꿀(switch) 수 있다. 모든 함수들은 set_term(SCREEN)에 의해 지정된 현재의 단말기에 작용할 것이다.

     

  • int endwin()
    endwin()는 청소를 하고 initscr()를 호출하기 전의 상태로 단말기 모드를 저장하고 커서를 좌측하단으로 이동시킬 것이다. 프로그램을 종료하기 위해 endwin()을 호출하기 전에 열려진 모든 윈도우를 닫는 것을 잊지 말아라.

    endwin()후에 부가적으로 refresh()를 호출하는 것은 initscr()를 호출하기 전에 가지고 있는 상태로 단말기를 저장할 것이다(visual-mode). 그렇지 않으면 clear될 것이다(non-visual-mode).

     

  • int isendwin()
    다음에 refresh()를 가지고 endwin()이 호출되면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환한다.

     

  • void delscreen(SCREEN* sp)
    SCREEN이 더이상 필요하지 않을 때, endwin() 후에 점유하고 있는 자원들을 모두 풀어주기 위해 delscreen(SCREEN)을 호출하라. (Note:아직 구현되지 않음)

8.5 윈도우 (Windows)

윈도우즈(windows)는 생성되고 삭제되고 이동되고 복사되고 사용되고 중복되어질 수 있다.

  • WINDOW *newwin(nlines, ncols, begy, begx)
    begy와 begx는 좌측상단 구석의 윈도우 좌표이다. nlines는 라인 수를 나타내는 정수이고 ncols는 컬럼 수를 나타내는 정수이다.

    그림 8.1:Ncurses - newwin을 위한 스키마(scheme)

    우리의 윈도우의 좌측상단 구석은 10라인의 10컬럼이고 위도우는 10라인과 60컬럼을 갖는다. nlines가 제로이면, 윈도우는 LINES-begy개의 row를 갖을 것이다. 같은 방법으로 ncols이 제로이면 윈도우는 COLS-begx개의 컬럼을 갖을 것이다.

    모든 아규먼트에 제로를 가지고 newwin(...)를 호출할 때:

    열려진 윈도우는 화면의 크기를 갖을 것이다.

    어떤 차원(demension)을 가지고 있건 화면의 중앙에 윈도우를 열고자 할 때:

    이것은 화면의 중앙에 22라인과 70컬럼을 가진 위도우를 열 것이다. 윈도우를 열기 전에 화면의 크기를 체크하라. 리눅스 콘솔에서 우리는 25 이상의 라인과 80이상의 컬럼을 갖지만, xterms에서는 이것은 일정하지 않다(resizable하다).

    더 자세한 설명을 위해 예제 디렉토리에 있는 .c를 봐라.

  • int delwin(win)
    윈도우 win을 삭제하라. 서브윈도우들이 있으면 win 전에 그것들을 삭제하라. win에 의해 점유되어진 모든 자원들은 자유로와 질 것이다. endwin()를 호출하기 전에 열려져 있는 모든 윈도우를 삭제하라.
  • int mvwin(win, by, bx)
    by,bx 좌표로 윈도우를 이동시킨다. 화면의 가장자리 밖으로 윈도우를 이동하고자 한다면, 아무것도 수행되지 않고 ERR가 반환된다.
  • WINDOW *subwin(origwin, nlines, ncols, begy,begx)
    origwin의 중앙에 서브윈도우를 반환한다. 두 윈도우들(origwin 또는 new one) 중 하나를 바꾸고자 할 때 이 변화는 양쪽 윈도우 모두에 반영될 것이다. 다음의 refresh() 전에 touchwin(origwin)를 호출하라.

    begy와 begx는 origwin이 아니라 화면에 비례한다.

  • WINDOW *derwin(origwin, nlines, ncols, begy, begx)
    subwin(...)와 같이 화면에서 begy, begx와 연관된 윈도우 origwin을 제외한다.
  • int mvderwin(win, y, x)
    win을 부모 윈도우 안으로 이동시킨다. (NOTE:아직 구현되지 않음)
  • WINDOW *dupwin(win)
    윈도우 win을 복사한다.
  • int syncok(win, bf)
    void wsyncup(win)
    void wcursyncup(win)
    void wsyncdown(win)
    (Note:아직 구현되지 않음)
  • int overlay(win1, win2)
    int overwrite(win1, win2)
    overlay(...)는 모든 텍스트를 공백은 복사하지 않고 win1에서 win2로 복사한다. overwrite(...)는 공백을 복사하는 것을 제외하고는 같다.
  • int copwin(win1, win2, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, overlay)
    overlay(...), overwrite(...)와 비슷하지만 윈도우의 어떤 영역으로 복사할 것인지 통제권(control)을 제공한다.

8.6 출력 (Output)

  • int addch(ch)
    int waddch(win, ch)
    int mvaddch(y, x, ch)
    int mvwaddch(win, y, x, ch)
    이러한 함수들은 윈도우에 문자 출력을 위해 사용된다. 함수들은 윈도우를 조종할 것이고 화면에 출력하기위해 refresh()을 호출해야 한다. addch(...)waddch(...)는 윈도우나 win안에 ch 문자를 출력한다. mvaddch(...)mvwaddch(...)은 y, x의 위치로 커서를 이동하는 것을 제외하고는 똑같이 동작한다.
  • int addstr(str)
    int addnstr(str, n)
    int waddstr(win, str)
    int waddnstr(win, str, n)
    int mvaddstr(y, x, str)
    int mvaddnstr(y, x, str, n)
    int mvwaddstr(win, y, x, str)
    int mvwaddnstr(win, y, x, str, n)
    이러한 함수들은 윈도우에 문자열을 쓰며 addch(...)의 호출을 연속적으로 수행하는 것과 같다. str은 널(null)로 끝나는 문자열이다("blafoo\0"). 다른 함수들이 그냥 쓰는 반면에 w를 가진 함수들은 윈도우 win에 문자열 str을 쓴다. n을 가진 함수들은 str 중 n개의 문자를 쓴다. n이 -1이면, 전체 문자열이 쓰여진다.
  • int addchstr(chstr)
    int addchnstr(chstr, n)
    int waddchstr(win, chstr)
    int waddchnstr(win, chstr, n)
    int mvaddchstr(y, x, chstr)
    int mvaddchnstr(y, x, chstr, n)
    int mvwaddchstr(win, y, x, chstr)
    int mvwaddchnstr(win, y, x, chstr, n)
    이러한 함수들은 chstr을 윈도우 이미지(또는 win)로 복사한다. 시작하는 위치는 현재 커서의 위치이다. n을 가진 함수들은 chstr 중 n개의 문자를 쓴다. n이 -1이면, 전체 문자열 chstr이 쓰여진다. 커서는 옮겨지지 않고 컨트롤 문자 체크(control character check)는 이루어 지지 않는다. 이러한 함수들은 addstr(...) 루틴들보다 더 빠르다. chstr은 chtype 배열의 포인터이다.
  • int echochar(ch)
    int wechochar(win, ch)
    refresh()(wrefresh(win))에 의해 따라오는 addch(...)(waddch(...)) 호출과 같다


8.6.1 형식화된 출력 (Formatted Output)

  • int printw(fmt, ...)
    int wprintw(win, fmt, ...)
    int mvprintw(y, x, fmt, ...)
    int mvwprintw(win, y, x, fmt, ...)
    int vwprintw(win, fmt, va_list)
    이러한 함수들은 printf(...)와 연관이 있고 아주 닮았다.

    패키지 안에서 printf(...)은 형식화된 출력을 위해 사용되어진다. 출력 문자열을 정의할 수 있고 그안에서 다른 타입의 변수들을 포함할 수 있다. 더 자세한 것은 8.1.1장을 참조하라

    vwprintw(...)을 사용하기 위해 .h를 포함(include)해야한다.

8.6.2 문자/줄 입력 (Insert Characters/Lines)

  • int insch(c)
    int winsch(win, c)
    int mvinsch(y, x, c)
    int mvwinsch(win, y, x, c)
    문자 ch는 커서의 왼쪽에 삽입되고 모든 문자들은 오른쪽으로 한자리씩 이동된다. 줄의 오른쪽 끝에 있는 문자를 잃어버릴 수도 있다.
  • int insertln()
    int winddelln(win, n)
    양수 n에 대해 이러한 함수들은 적절한 윈도우에 n개의 줄을 커서의 위쪽에 삽입한다.(그래서 n개의 바닥쪽의 줄을 잃어버리게 된다.) n이 음수인 경우, 커서 아래의 n개의 줄이 삭제되고 나머지가 위로 이동한다.
  • int insstr(str)
    int insnstr(str, n)
    int winsstr(win, str)
    int winsnstr(win, str, n)
    int mvinsstr(y, x, str)
    int mvinsnstr(y, x, str, n)
    int mvwinsstr(win, y, x, str)
    int mvwinsnstr(win, y, x, str, n)
    이러한 함수들은 현재 줄안에 커서의 왼쪽에 str을 삽입한다.(줄에 꼭 맞을 만큼의 문자들) 커서의 오른쪽에 있는 문자들은 오른쪽으로 이동하고 줄의 끝에 도달하게 되면 잃어 버리게 된다. 커서의 위치는 변하지 않는다.

    y와 x는 str이 삽입되기 전에 커서가 이동할 좌표이고 n은 삽입될 문자의 수이다. (n=0이면 전체 문자열이 삽입된다.)

8.6.3 문자/줄 지우기 (Delete Characters/Lines)

  • int delch()
    int wdelch(win)
    int mvdelch(y, x)
    int mvwdelch(win, y, x)
    커서 왼쪽의 문자를 지우고 커서 오른쪽의 남아있는 문자들을 왼쪽으로 한자리씩 위치를 이동시킨다.

    y와 x는 삭제하기 전에 커서가 이동할 좌표이다.

  • int deleteln()
    int wdeleteln(win)
    커서 아래의 줄을 지우고 모든 나머지 줄들을 한자리씩 위로 위치를 이동시킨다. 부가적으로, 윈도우의 바닥 줄은 지워질 것이다.

8.6.4 상자와 줄 (Boxes and Lines)

  • int border(ls, rs, ts, bs, tl, tr, bl, br)
    int wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
    int box(win, vert, hor)
    윈도우(또는 win)의 가장자리 주위에 경계를 그린다. 다음의 테이블에서 box(...) 호출시 제로(zero)일 때, 그들의 디폴트 값과 문자를 볼 수 있다.

    Table 8.3:Ncurses - border characters

    Figure 8.2:Ncurses - box characters

     

  • int vline(ch, n)
    int wvline(win, ch, n)
    int hline(ch, n)
    int whline(win, ch, n)
    이러한 함수들은 현재 커서 위치에서 시작하는 수직선 또는 수평선을 그린다. ch는 사용하는 문자이고 n은 그려지는 문자의 수이다. 커서 위치는 변하지 않는다.

8.6.5 백그라운드 문자 (Background Character)

  • void bkgdset(ch)
    void wbkgdset(win, ch)
    백그라운드(background) 문자와 화면 또는 윈도우의 속성을 지정한다. ch안의 속성은 윈도우 안에 있는 모든 공백이 아닌 문자와 OR되어진다. 백그라운드는 윈도우의 일부이고 스크롤링, 입력, 출력 에 의해 변하지 않는다.
  • int bkgd(ch)
    int wbkgd(win, ch)
    백그라운드 문자를 ch의 속성으로 바꾼다.

8.7 입력 (Input)

  • int getch()
    int wgetch(win)
    int mvgetch(y, x)
    int mvwgetch(win, y, x)
    getch()는 지연 모드(delay mode)가 지정되었는지 아닌지에 따른 방식으로 단말기로 부터 입력을 읽는다. 지연(delay)이 on인 경우, getch()는 키가 눌려질 때까지 기다리고 그렇지 않으면 입력 버퍼안의 키를 반환하고 버퍼가 비어있으면 ERR을 반환한다. mvgetch(...)mvwgetch(...)는 먼저 y,x 위치로 커서를 이동시킨다. w 함수들은 윈도우 win과 연관된 단말기로 부터 입력을 읽는다.

    keypad(...)가 enable되어 있으면, getch()는 기능키(function key)가 눌려질 때 .h에 KEY_* 매크로 처럼 정의된 코드를 반환한다. ESCAPE가 눌려질 때(이것이 기능키의 시작일 수 있음) ncurses는 one second timer를 시작시킨다. 이 시간 안에 keystroke의 나머지가 끝나지 않는다면, 키는 반환된다. 그렇지 않으면, 기능키값이 반환된다. (필요하다면, second timer를 사용하지 않기위해 notimeout()을 사용하라)

  • int ungetch(ch)
    입력 버퍼의 뒤에 ch 문자를 넣는다.
  • int getstr(str)
    int wgetstr(win, str)
    int mvgetstr(y, x, str)
    int mvwgetstr(win, y, x, str)
    int wgwrnstr(win, str, n)
    이러한 함수들은 newline을 받을 때까지 getch()의 호출을 연속적으로 수행한다. 문자들은 str안에 놓여있다.(getstr(...)를 호출하기 전에 문자 포인터(character pointer)를 위해 메모리를 할당하는 것을 잊지 말아라) echo가 enable되어 있으면 문자열은 echo되어지고 (echo를 사용하지 않기위해 noecho()를 사용하라) 사용자의 kill과 문자들의 삭제는 해석되어진다.
  • chtype inch()
    chtype winch(win)
    chtype mvinch(y, x)
    chtype mvwinch(win, y, x)
    이러한 함수들은 화면이나 윈도우로 부터 문자를 반환한다. 반환값의 타입은 속성 정보를 포함하는 chtype이기 때문이다. 이 정보는 A_* 상수를 사용하는 문자로 부터 추출되어질 수 있다. (표 8.4를 참조하라)
  • int instr(str)
    int innstr(str, n)
    int winstr(win, str)
    int winnstr(win, str, n)
    int mvinstr(y, x, str)
    int mvinnstr(y, x, str, n)
    int mvwinstr(win, y, x, str)
    int mvwinnstr(win, y, x, str, n)
    화면 또는 윈도우로 부터 character string을 반환한다.(Note:아직 구현되지 않음)
  • int inchstr(chstr)
    int inchnstr(chstr, n)
    int winchstr(win, chstr)
    int winchnstr(win, chstr, n)
    int mvinchstr(y, x, chstr)
    int mvinchnstr(y, x, chstr, n)
    int mvwinchstr(win, y, x, chstr)
    int mvwinchnstr(win, y, x, chstr, n)
    화면 또는 윈도우로 부터 chtype string을 반환한다. 문자열안에 모든 문자에 대한 속성 정보가 포함되어있다. (Note:아빅 구현되지 않음. lib_inchstr은 ncurses lib에 포함되지 않음)

8.7.1 형식화된 입력 (Formatted Input)

  • int scanw(fmt, ...)
    int wscanw(win, fmt, ...)
    int mvscanw(y, x, fmt, ...)
    int mvwscanw(win, y, x, fmt, ...)
    int vwscanw(win, fmt, va_list)
    이것들은 scanf(...)와 비슷하다.(8.1.2장을 참조하라) wgetstr(...)은 호출되어지고 그 결과는 scan를 위한 입력처럼 사용되어진다.

8.8 선택사항 (Options)


8.8.1 출력 선택사항 (Output Options)

  • int idlok(win, bf)
    void idcok(win, bf)
    윈도우의 단말기의 삽입/삭제 특성을 사용 가능하게(enable) 하거나 사용 불가능하게(disable) 한다. (idlok(...)는 줄(line)에 대해 idcok(...)은 문자에 대해 사용) (Note:idcok(...)은 아직 구현되지 않음)
  • void immedok(win, bf)
    TRUE로 지정되면, 윈도우 win에 대한 모든 변화는 물리적인 화면을 refresh하게 만든다. 이것은 프로그램의 성능을 감소시킬 수 있다. 따라서 디폴트 값은 FALSE이다. (Note:아직 구현되지 않음)
  • int clearok(win, bf)
    bf가 TRUE이면, wrefresh(win)의 다음 호출은 화면을 clear하고 완벽하게 다시 그릴 것이다. (vi 에디터에서 CTRL+L을 눌렀을 때처럼)
  • int leaveok(win, bf)
    기본 동작(default behavior)은 ncurses가 물리적인 커서를 윈도우의 마지막 refresh가 발생한 같은 장소에 놓는 것이다. 커서를 사용하지 않는 프로그램들은 leaveok(...) TRUE를 지정할 수 있고 커서를 움직이는데 필요한 일반적인 시간을 줄일 수 있다. 게다가, ncurses는 단말기 커서를 안보이게 만들려고 할 것이다.
  • int nl()
    int nonl()
    newline을 위한 변환을 통제한다. nl()은 출력에서 carriage return과 line feed를 newline으로 변환시킨다. nonl()은 변환을 하지 않는다. 변환을 하지않토록된 ncurses는 커서 이동을 더 빠르게 할 수 있다.

8.8.2 입력 선택사항 (Input Options)

  • int keypad(win, bf)
    TRUE이면, 입력을 위해 기다리고 있을 때 사용자 단말기의 키보드 상에서 키패드의 사용이 가능하다. Ncurses는 키패드의 기능(function)과 화살표(arrow) 키들을 위해 KEY_* 처럼 .h에 정의된 키 코드를 반환할 것이다. 이것은 숫자 블록(numerical block)과 커서 키들을 사용할 수 있으므로 PC 키보드에서 매우 유용하다.
  • int meta(win, bf)
    TRUE이면, getch()로 부터 반환되는 키 코드들은 8-bit-clean이다. (최상위 비트는 떼어낼 수 없다.)
  • int cbreak()
    int nocbreak()
    int crmode()
    int nocrmode()
    cbreak()nocbreak()은 단말기의 CBREAK 모드를 on 또는 off로 전환시킬 것이다. CBREAK가 on일 때, 읽기로 부터의 입력은 즉시 프로그램에서 사용가능하고 off일 때, 입력은 newline이 발생할 때까지 버퍼에 저장될 것이다. (Note:crmode()nocrmode()은 향상된 호환성이 있지만, 그들을 사용하지 말아라)
  • int raw()
    int noraw()
    RAW 모드를 on 또는 off로 만든다. RAW는 RAW 모드에서는 특수 문자 처리가 이루어지지 않는다는 것을 제외하고는 CBREAK와 같다.
  • int echo()
    int noecho()
    사용자에 의해 타이핑된 입력을 echo하기위해 echo()를 지정하고 침묵하기 위해서는 noecho()를 지정한다.
  • int halfdelay(t)
    cbreak()처럼 t 초간 지연(delay)한다.
  • int nodelay(win, bf)
    단말기는 차단(blocking) 모드로 지정되지 않는다. cetch()는 입력이 준비되어있지 않으면 ERR을 반환할 것이다. FALSE가 지정되어 있으면, getch()는 키가 눌려질 때까지 기다릴 것이다.
  • int timeout(t)
    int wtimeout(win, t)
    halfdelay(t)nodelay(win,bf) 대신 이러한 함수들의 사용이 추천된다. getch()의 결과는 t의 값에 따라 결정된다. t가 양수이면, 읽기는 t milliseconds 간 차단되어진다(blocked). t가 제로이면, 차단(blocking)은 수행되지 않는다. t가 음수일 때 프로그램은 입력이 가능할 때까지 차단한다.
  • int notimeout(fd)
    bf가 TRUE이면, getch()는 ESCAPE과 같은 키로 시작하는 시퀀스(sequence)를 입력받고 번역하기 위해 특별한 (1초 길이의)타이머를 사용할 것이다.
  • int typeahead(fd)
    fd가 -1이면 typeahead 체크는 수행되어지지 않을 것이고, 그렇지 않으면 ncurses는 이러한 체크를 위해 파일 식별자(file descriptor) fd를 사용할 것이다.
  • int intrflush(win, bf)
    bf가 TRUE로 사용가능할 때 단말기 상에서 눌려진 인터럽트(interrupt) 키(quit, break, ...)는 tty 드라이버(driver) 큐(queue) 안의 모든 출력을 몰아낼 것이다.
  • void noqiflush()
    void qiflush()
    (Note:아직 구현되지 않음)

8.8.3 단말기 속성 (Terminal Attributes)

  • int baudrate()
    bps로 단말기의 속도를 반환한다.
  • char erasechar()
    현재 erase 문자를 반환한다.
  • char killchar()
    현재 kill 문자를 반환한다.
  • int has_ic()
    int has_il()
    has_ic()는 단말기가 문자를 삽입/삭제할 능력을 가지고 있으면 TRUE를 반환한다. has_il()는 단말기가 줄을 삽입/삭제할 능력을 가지고 있으면 TRUE를 반환한다. 그렇지 않으면 함수들은 ERR를 반환한다. (Note:아직 구현되지 않음)
  • char *longname()
    반환된 포인터는 현재의 단말기의 기술에 접근권을 준다.
  • chtype termattrs()
    (Note:아직 구현되지 않음)
  • char *termname()
    사용자 환경으로 부터 TERM의 내용을 반환한다.(Note:아직 구현되지 않음)

8.8.4 사용 선택사항 (Use Options)

윈도우와 단말기의 사용을 성멸하기 위해 윈도우 선택사항(option)과 단말기 모드에 대해 살펴 보았다.

먼저, 리눅스상에서 키패드를 사용할 수 있어야 한다. 이것은 PC 키보드 상에서 커서 키와 숫자 블럭의 사용을 허락한다.

입력의 중요한 두 가지 타입이 있다.:

  1. 프로그램은 사용자가 키를 입력(enter)하기를 원하고 이 키에 따라 함수를 호출할 것이다. (예를 들면, "끝내려면 'q'를 누르시오"와 같이 그리고 'q'를 기다린다.)

     

  2. 프로그램은 화면상의 마스크 안에서 사용자에 의해 타이핑된 문자들의 문자열을 원한다. 예를 들면: 데이타베이스 안의 디렉토리 또는 어드레스(address).

첫째로 우리는 다음의 선택사항(option)과 모드들을 사용하고 while loop는 정확하게 작업할 것이다.

프로그램은 키가 눌려질 때까지 멈추어 있을 것이다. 키가 q이면 우리는 끝내기(quit) 함수를 호출하고 그렇지 않으면 다른 입력을 기다린다.

switch 문장은 우리가 바라는 것과 일치하는 입력함수를 가질 때까지 확장될 수 있다. 한 예로, 특별한 키를 체크하기 위해 KEY_* 매크로들을 사용하라.

키보드에서 커서 키들을 위해. 파일 뷰어(viewer)를 위해 loop가 이것처럼 보일 수 있다.:

둘째로, 우리는 echo()를 지정할 필요가 있고 사용자에 의해 타이핑된 문자들은 화면에 인쇄되어질 것이다. 원하는 위치에 문자가 인쇄되도록 하기위해 move 또는 wmove(...)를 사용하라.

또는 우리는 마스크를 가지고 윈도우를 열 수 있고 (윈도우의 것들보다 다른 몇몇 색상들이 이것을 수행할 것이다) 사용자에게 문자열 입력을 요청한다.

보다 자세한 설명을 위해 예제 디렉토리에 있는 .c를 보아라.

 

8.9 윈도우와 줄 지우기 (Clear Window and Lines)

  • int erase()
    int werase(win)
    werase(...)erase()는 윈도우 win상의 모든 위치에 공백을 복사한다. 예를 들어, 윈도우에 색상 속성을 지정하고 werase()를 호출할 때, 윈도우는 color가 될 것이다. 흰색 위에 검정색처럼 다른 속성을 정의하여 자신만의 erase 함수를 만들때 COLOR_PAIRS에 약간의 문제가 있다. (이것은 WINDOW 구조에 접근하는 하위 수준(low level)이다.):

    문제는 ncurses가 때때로 화면이 공백일 때 윈도우 속성들을 사용할 수 없다는 것이다. 예를 들어, _clrtoeol.c 안에 BLANK는 정의되어 있다.

    그래서 다른 윈도우 속성들은 줄이 지워지는 동안에 잃어버린다.

  • int clear()
    int wclear(win)
    erase와 같지만 clearok()를 지정할 것이다. (화면은 다음 refresh에 의해 지워(clear)진다.)
  • int clrtobot()
    int wclrtobot(win)
    현재 커서 줄(시작점은 커서의 오른쪽 한 문자이다)과 커서 아래의 줄을 지운다(clearing).
  • int clrtoeol()
    int wclrtoeol(win)
    커서로 부터 끝까지 현재 줄의 오른쪽을 지운다.

8.10 단말기 업데이트 (Updating the Trminal)

개요에 쓰였던 것처럼, ncurses 윈도우들은 메모리 안에 있는 이미지들이다. 이것은 윈도우에서의 어떤 변화가 refresh가 수행될 때까지 물리적인 화면에 인쇄되지 않는다는 것을 의미한다. 이것은 많은 조종이 있을 수 있기 때문에 화면에 대한 출력을 최적화하고 화면에 그것을 인쇄하기 위해 refresh를 한번 호출한다. 그렇지 않으면, 모든 변화가 화면에 인쇄되어 지고 프로그램의 성능 (performance)를 감소시킨다.

  • int refresh()
    int wrefresh(win)
    refresh()는 단말기로 복사를 하고 wrefresh(win)는 윈도우 이미지로 복사한다.
  • int wnoutrefresh(win)
    int doupdate()
    wnoutrefresh(win)는 오직 윈도우 win으로 복사한다. 이것은 단말기에 대한 출력이 수행되지는 않지만 가상의 화면에 실제적으로 프로그래머가 원하는 대로 보여짐을 의미한다. doupdate()는 단말기에 출력을 수행할 것이다. 프로그램은 여러가지 윈도우들을 바꿀 수 있고 모든 윈도우에 대해 wnoutrefresh(win)를 호출할 수 있고 오직 한번 물리적인 화면을 업데이트하기 위해 doupdate()를 호출할 수 있다.

    예를 들어, 두개의 윈도우를 가지는 다음의 프로그램이 있다. 텍스트의 몇몇 줄을 변경하여 양쪽 윈도우들을 바꾼다. wrefresh(win)을 가지고 changewin(win)를 write할 수 있다.

    이것은 ncurses가 단말기를 두번 업데이트하게 하여 실행을 느리게 한다. doupdate()를 가지고 changewin(win)와 main 함수를 변경시키고 성능(performance)을 향상시킨다.

     

  • int redrawwin(win)
    int wredrawln(win, bline, nlines)
    몇몇 줄이나 전체 화면이 새로운 것을 쓰기 전에 없어져야 할 때, 이러한 함수들을 사용한다. (아마도 몇몇 줄이 쓸모없어 졌을 때)
  • int touchwin(win)
    int touchline(win, start, count)
    int wtouchln(win, y, n, changed)
    int untouchwin(win)
    ncurses에 전체 윈도우 win 또는 start up으로 부터 start+count까지 줄들이 조종되었음을 알린다. 예를 들어, 몇몇 윈도우가 중첩되었을 때, 한 윈도우에 대한 변화는 다른 것들로 부터 이미지에 영향을 받지 않을 것이다.

    wtouchln(...)은 y로 부터 시작하여 n개의 줄을 건드릴 것이다. change가 TRUE이면 그 줄들은 변경되고(touched,changed) 그렇지 않으면 변경되지 않는다(untouched,unchanged).

    untouchwin(win)refresh의 마지막 호출 이후 윈도우 win에 unchanged 표시를 할 것이다.

  • int is_linetouched(win, line)
    int is_wintouched(win)
    이러한 함수들을 가지고 줄 line 또는 윈도우 win이 refresh()의 마지막 호출 이후에 변경이 있었는지를 체크할 수 있다.

8.11 비디오 속성과 색상 (Video Attributes and Color)

속성은 화면에 문자를 인쇄할 때 사용되는 특별한 단말기 속성이다. 문자들은 굵게,밑줄,깜빡임 등으로 인쇄될 수 있다. ncurses에서 출력을 보다 좋게 보이도록 속성들을 on 또는 off로 전환할 수 있는 능력을 갖는다. 사용가능한 속성들이 다음의 표에 정리되어 있다.

표 8.4:Ncurses - 속성들

ncurses는 칼라를 지원하는 단말기에서 사용할 수 있는 8가지 색상을 정의한다. 먼저, start_color()를 가지고 색상 자료 구조(color data structures)를 초기화하고 has_colors()를 가지고 단말기의 능력을 체크한다. start_color()COLORS, 단말기가 지원하는 최대 색상수와 COLOR_PAIR, 정의할 수 있는 색상 쌍(color pairs)의 최대수 를 초기화한다.

표 8.5:Ncurses - colors

속성은 OR operator를 가지고 조합되어질 수 있다.

int color_content(color, r, g, b)
색상을 위해 r,g,b의 색상 구성요소(components)를 얻는다.

어떻게 속성과 색상을 어떻게 조합할 것인가? 리눅스에서의 콘솔처럼 몇몇 단말기는 칼라를 갖고 몇몇은 그렇지 않다(xterm,vs100 등등). 다음의 코드는 그 문제를 해결해야만 한다.

먼저, CheckColor 함수는 start_color()를 가지고 색상을 초기화한다. 현재 단말기가 색상을 가지고 있다면 has_colors() 함수는 TRUE를 반환할 것이다. 우리는 이것을 체크하고 포그라운드(foreground)와 백그라운드(background) 색상들을 조합하기 위해 init_pair(...) 와 지정된 윈도우를 위해 이러한 쌍(pairs)을 지정하기 위해 wattrset(...)를 호출한다. 또 한편으로, 흑백 단말기를 가지고 있다면, 속성을 지정하기 위해 wattrset(...)를 혼자 사용할 수 있다.

xterm에서 색상(color)을 얻기 위해 내가 발견한 가장 좋은 방법은 Midnight Commander로 부터 terminfo 개체를 얻는 ansi_xterm을 사용하는 것이다. ansi_xterm과 Midnight Commander (mc-x.x.tar.gz)의 소스를 구하라. ansi_xterm을 컴파일하고 mc-x.x.tar.gz acchive로 부터 xterm.ti와 vt100.ti를 가지고 tic을 사용하라. ansi_xterm을 실행시켜보고 테스트 해 보아라.

 

8.12 커서와 윈도우 좌표 (Cursor and Window Coordinates)

  • int move(y, x)
    int wmove(win, y, x)
    move()는 커서를 y, x로 이동시키고, wmove(win)는 윈도우 win으로 부터 커서를 이동시킨다. 입력/출력 함수들을 위해 지정된 함수들이 호출되기 전에 커서를 이동시키는 부가적인 매크로들이 정의된다.
  • int curs_set(bf)
    이것은 단말기아 이러한 능력을 가지고 있다면, 커서의 눈에 보이는 상태를 on 또는 off로 전환시킬 것이다.
  • void getyx(win, y, x)
    getyx(...)는 현재의 커서 위치를 반환할 것이다.(Note:이것은 매크로이다.)
  • void getparyx(win, y, x)
    win이 서브 윈도우일 때, getparyx(...)는 부모 윈도우와 연관된 윈도우 좌표를 y와 x에 저장할 것이다. 그렇지 않으면 y와 x는 -1이다. (Note:아직 구현되지 않음)
  • void getbegyx(win, y, x)
    void getmaxyx(win, y, x)
    int getmaxx(win)
    int getmaxy(win)
    win의 시작과 크기 좌표를 y와 x에 저장한다.
  • int getsyx(int y, int x)
    int setsyx(int y, int x)
    가상 화면의 커서을 y와 x에 저장하거나 커서를 지정한다. y와 x가 -1이고 getsyx(...)를 호출할 때, leaveok가 지정되어진다.

8.13 스크롤 (Scrolling)

  • int scrollok(win, bf)
    TRUE이면, 윈도우 win의 텍스트는 커서가 하단 오른쪽 구석에 있고 한문자가 타이핑 되어질 때 (또는 newline) 한 줄씩 위로 스크롤 되어질 것이다. FALSE이면, 커서는 같은 위치에 남겨진다.

    on으로 전환될 때 윈도우의 내용들은 다음의 함수들을 가지고 스크롤 되어질 수 있다. (Note:윈도우의 마지막 줄에 new line이 인쇄되면, 또한 스크롤 되어질 것이다. scrollok(...)는 주의해야 한다 그렇지 않으면 터무니없는 결과를 얻을 것이다.

  • int scroll(win)
    이 함수는 윈도우를(자료구조안에 있는 줄들을) 한줄씩 위로 스크롤할 것이다.
  • int scrl(n)
    int wscrl(win, n)
    이러한 함수들은 윈도우 또는 win을 정수 n의 값에 따라 위로 또는 아래로 스크롤할 것이다. n이 양수이면 윈도우는 n줄 위로 스크롤될 것이고 반대로 n이 음수이면 윈도우는 n줄 아래로 스크롤될 것이다.
  • int setscrreg(t, b)
    int wsetscrreg(win, t, b)
    소프트웨어 스크롤링 지역을 지정한다.

다음의 코드는 화면상에서 어떻게 스크롤링 효과를 얻을 것인가를 설명해야만 한다. 예제 디렉토리에 있는 .c를 살펴 보아라.

우리는 18줄과 66컬럼을 가진 윈도우가 있고 그 안의 텍스트를 스크롤하기를 원한다. S[]는 텍스트를 가지고 있는 문자 배열이다. Max_ss[]에 있는 마지막 줄의 번호이다. Clear_line는 현재 커서 위치로 부터 윈도우로 부터 현재의 속성을 가지는 줄의 끝까지 공백 문자를 인쇄할 것이다.(clrtoeol이 하는 것처럼 A_NORMAL이 아니다.) Beg는 현재 화면상에 보여지는 s[]로 부터의 마지막 줄이다. Scroll는 함수에 무엇을 하고, 텍스트로 부터 다음(NEXT)과 이전(PREVious) 줄을 보여 주도록 일일이 말한다.

 

8.14 패드 (Pads)

  • WINDOW *newpad(nlines, ncols)
  • WINDOW *subpad(orig, nlines, ncols, begy, begx)
  • int prefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
  • int pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
  • int pechochar(pad, ch)

8.15 소프트-라벨 (Soft-labels)

  • int slk_init(int fmt)
  • int slk_set(int labnum, char *label, int fmt)
  • int slk_refresh()
  • int slk_noutrefresh()
  • char *slk_label(int labnum)
  • int slk_clear()
  • int slk_restore()
  • int slk_touch()
  • int slk_attron(chtype attr)
    int slk_attrset(chtype attr)
    int slk_attroff(chtype attr)
    이러한 함수들은 attron(attr), attrset(attr), attroff(attr)와 관련이 있다. 아직 구현되지 않음.

8.16 잡동사니 (Miscellaneous)

  • int beep()
  • int flash()
  • char *unctrl(chtype c)
  • char *keyname(int c)
  • int filter()
    (Note:아직 구현되지 않음.)
  • void use_env(bf)
  • int putwin(WINDOW *win, FILE *filep)
    (Note:아직 구현되지 않음.)
  • WINDOW *getwin(FILE *filep)
    (Note:아직 구현되지 않음.)
  • int delay_output(int ms)
  • int flushinp()

8.17 Low-level 접근 (Access)

  • int def_prog_mode()
  • int def_shell_mode()
  • int reset_prog_mode()
  • int reset_shell_mode()
  • int resetty()
  • int savetty()
  • int ripoffline(int line, int (*init)(WINDOW *, int))
  • int napms(int ms)

8.18 화면 덤프 (Screen Dump)

  • int scr_dump(char *filename)
    (Note:아직 구현되지 않음.)
  • int scr_restore(char *filename)
    (Note:아직 구현되지 않음.)
  • int scr_init(char *filename)
    (Note:아직 구현되지 않음.)
  • int scr_set(char *filename)
    (Note:아직 구현되지 않음.)

8.19 Termcap Emulation

  • int tgetent(char *bp, char *name)
  • int tgetflag(char id[2])
  • int tgetnum(char id[2])
  • char *tgetstr(char id[2], char **area)
  • char *tgoto(char *cap, int col, int row)
  • int tputs(char *str, int affcnt, int (*putc)())

8.20 Terminfo 함수들(Functions)

  • int setupterm(char *term, int fildes, int *errret)
  • int setterm(char *term)
  • int set_curterm(TERMINAL *nterm)
  • int del_curterm(TERMINAL *oterm)
  • int restartterm(char *term, int fildes, int *errret)
    (Note: 아직 구현되지 않음.)
  • char *tparm(char *str, p1, p2, p3, p4, p5, p6, p7, p8, p9)
    p1 - p9 long int.
  • int tputs(char *str, int affcnt, int (*putc)(char))
  • int putp(char *str)
  • int vidputs(chtype attr, int (*putc)(char))
  • int vidattr(chtype attr)
  • int mvcur(int oldrow, int oldcol, int newrow, int newcol)
  • int tigetflag(char *capname)
  • int tigetnum(char *capname)
  • int tigetstr(char *capname)

8.21 디버그 함수 (Debug Function)

  • void _init_trace()
  • void _tracef(char *, ...)
  • char *_traceattr(mode)
  • void traceon()
  • void traceoff()

8.22 Terminfo 능력 (Capabilities)


8.22.1 논리 능력 (Boolean Capabilities)

 

Variable Cap. Int. Description
Name Code
auto_left_margin bw bw cub1이 컬럼 0부터 마지막 컬럼까지 포함한다(wrap)
auto_right_margin am am 단말기가 자동적으로 여백을 갖는다.
back_color_erase bce ut 화면은 백그라운드 색상으로 지원진다.
can_change ccc cc 단말기는 존재하는 색상들로 재정의될 수 있다.
ceol_standout_glitch xhp xs 표준출력은 overwritong에 의해 지워지지 않는다.(hp)
col_addr_glitch xhpa YA 오직 hpa/mhpa 능력을 위한 적극적인 움직임
cpi_changes_res cpix YF 문자 pitch의 변화는 해상도를 변화시킨다.
cr_cancels_micro_mode crxm YB cr를 사용하여 매크로 모드를 off로 전환한다.
eat_newline_glitch xenl xn newline은 80cols 이후에는 무시된다.
erase_overstrike eo eo 공백을 가지고 overstrikes를 지울 수 있다.
generic_type gn gn 일반적인 줄(line) 타입 (e.g.,, dialup, switch)
hard_copy hc hc 단말기를 하드카피한다.
hard_cursor chts HC 커서를 보기 어렵다.
has_meta_key km km 메타 키를 갖는다 (패리티 비트가 지정된 shift)
has_print_wheel daisy YC 프린터는 문자 집합을 바꾸기위한 연산자(operator)가 필요하다
has_status_line hs hs 여분의 "상태 줄"을 갖는다
hue_lightness_saturation hls hl 단말기는 오직 HLS 색상 표기법만을 사용한다(Tektronix)
insert_null_glitch in in 삽입 모드는 널(null)을 구분한다.
lpi_changes_res lpix YG 줄(line) pitch의 변경은 해상도를 바꾼다.
memory_above da da Display는 화면 위에 계속 유지되어진다.
memory_below db db Display는 화면 아래에 계속 유지되어진다.
move_insert_mode mit mi 삽입 모드 안에서의 이동은 안전하다.
move_standout_mode msgr ms 표준출력 모드안에서의 이동은 안전하다.
needs_xon_xoff nxon nx padding은 작업하지 않을 것이고 xon/xoff가 요구된다.
no_esc_ctl_c xsb xb 붐비는 장소 (f1=escape, f2=ctrl+c)
non_rev_rmcup nrrmc NR smcup는 rmcup를 반대로 하지 않는다.
no_pad_char npc NP pad 문자는 존재하지 않는다.
non_dest_scroll_region ndscr ND 스크롤링 지역은 파괴적이지 않다.
over_strike os os 단말기 overstrikes
prtr_silent mc5i 5i 프린터는 화면에 반향(echo)하지 않는다.
row_addr_glitch xvpa YD vhp/mvpa 능력(caps)를 위한 오직 양의(positive) 움직임
semi_auto_right_margin sam YE 마지막 컬럼의 인쇄는 cr를 야기시킨다.
status_line_esc_ok eslok es Escape은 상태줄 상에서 사용되어질 수 있다.
dest_tabs_magic_smso xt xt Tabs ruin, magic so char (Teleray 1061)
tilde_glitch hz hz Hazel-tine; 's를 인쇄할 수 없다.
transparent_underline ul ul 밑줄 문자 overstrikes
xon_xoff xon xo 단말기는 xon/xoff handshaking을 사용한다.

 

 

 

8.22.2 숫자 (Numbers)

 

Variable Cap. Int. Description
Name Code
bit_image_entwining bitwin Yo SYSV에 문서화되어 있지 않음
buffer_capacity bufsz Ya 인쇄전에 버퍼에 저장된 바이트의 수
columns cols co 한 줄안의 컬럼의 숫자
dot_vert_spacing spinv Yb dots per inch안의 수평 dots의 공간(spacing)
dot_horz_spacing spinh Yc pins per inch안의 수직 pins의 공간(spacing)
init_tabs it it Tabs 최초로 모든 # 공간(spaces)
label_height lh lh 각각의 라벨안의 rows
label_width lw lw 각각의 라벨안의 컬럼(columns)
lines lines li 화면 또는 페이지의 줄(line) 수
lines_of_memory lm lm 양수이면 메모리안의 줄 수, 0은 변함을 의미.
magic_cookie_glitch xmc sg smso 또는 rmso에 의해 남겨진 공백 문자의 수
max_colors colors Co 화면상의 최대 색상의 수
max_micro_address maddr Yd micro_..._address안의 최대값
max_micro_jump mjump Ye parm_..._micro안의 최대값
max_pairs pairs pa 화면상의 색상-쌍(color-pairs)의 최대 수
micro_col_size mcs Yf micro 모드일 때, 문자의 step 크기(size)
micro_line_size mls Yg micro 모드일 때, 줄(line) step 크기(size)
no_color_video ncv NC 색상을 사용할 수 없는 비디오 속성
number_of_pins npins Yh print-head안의 pin의 수
num_labels nlab Nl 화면상의 라벨의 수
output_res_char orc Yi units per line 안의 수평 해상도
output_res_line orl Yj units per line 안의 수직 해상도
output_res_horz_inch orhi Yk units per inch 안의 수평 해상도
output_res_vert_inch orvi Yl units per inch 안의 수직 해상도
padding_baud_rate pb pb cr/nl padding이 필요한 곳의 가장 낮은 baud
virtual_terminal vt vt 가상의 단말기 번호 (UNIX system)
width_status_line wsl ws 상태줄안의 컬럼 번호

(다음의 숫자 능력들(numeric capabilities)은 SYSV 용어 구조안에 표현되어 있지만, 아직 주요 페이지에 문서화되어 있지 않다. 주석문들은 용어 구조 헤더에 있다.)

 

bit_image_type bitype Yp bit-image 장치의 타입
buttons btns BT 마우스 버튼의 수
max_attributes ma ma 단말기가 다룰 수 있는 최대한 조합된 속성
maximum_windows wnum MW 정의될 수 있는 윈도우의 최대 수
print_rate cps Ym char per second의 인쇄 비율
wide_char_size widcs Yn double wide 모드의 문자 step 크기(size)

 

 

 

8.22.3 문자열 (Strings)

Variable Cap. Int. Description

Name Code

acs_chars acsc ac 그래픽 문자집합 쌍들 - def=vt100

alt_scancode_esc scesa S8 scancode emulation을 위한 esc를 교체한다 (디폴트는 vt100)

back_tab cbt bt back tab (P)

bell bel bl 들을 수 있는 신호 (bell)

bit_image_repeat birep Xy bit image cell을 #1 #2 times 반복한다. (tparm 사용)

bit_image_newline binel Zz bit image의 다음 row로 이동한다. (tparm 사용)

bit_image_carriage_return bucr Yv 같은 row의 시작점으로 이동한다. (tparm 사용)

carriage_return cr cr Carriage return (P*)

change_char_pitch cpi ZA inch당 문자의 수를 변경한다.

change_line_pitch lpi ZB inch당 줄(line)의 수를 변경한다.

change_res_horz chr ZC 수평 해상도를 변경한다.

change_res_vert cvr ZD 수직 해상도를 변경한다.

change_scroll_region csr cs 줄(line) #1에서 부터 #2까지 변경한다. (vt100) (PG)

char_padding rmp rP ip와 같지만 삽입 모드일 때

char_set_names csnm Zy 문자 집합 이름들의 목록

clear_all_tabs tbc ct 모든 tab stop을 지운다 (P)

clear_margins mgc MC 모든 여백을 지운다 위,아래,옆)

clear_screen clear cl 화면을 지우고 커서를 home에 위치시킨다. (p*)

clr_bol el1 cb 줄의 시작점을 지운다.

clr_eol el ce 줄의 끝을 지운다. (P)

clr_eos ed cd display의 끝을 지운다 (P*)

code_set_init csin ci 다중 코드 집합들을 위한 Init sequence

color_names colornm Yw 색상 #1을 위한 이름을 준다.

column_address hpa ch 커서 컬럼을 지정한다. (PG)

command_character cmdch CC ptototype안에서 cmd 문자를 지정할 수 있는 단말기

cursor_address cup cm 화면에 연관된 row #1 col #2로의 커서의 움직임 (PG)

cursor_down cud1 do 한줄 아래로 내린다.

cursor_home home ho Home cursor (if no cup)

cursor_invisible civis vi 커서를 보이지 않게 만든다.

cursor_left cub1 le 커서를 한칸 왼쪽으로 이동한다.

cursor_mem_address mrcup CM 메모리와 연관된 커서 어드레싱(addressing)

cursor_normal cnorm ve 커서를 정상적으로 나타나게 만든다(undo vs/vi)

cursor_right cuf1 nd 파괴되지 않는 공간 (cursor right)

cursor_to_ll ll ll 마지막 줄의 첫번째 컬럼 (if no cup)

cursor_up cuu1 up Upline (cursor up)

cursor_visible cvvis vs 커서를 보이게 만든다

define_bit_image_region defbi Yx 사각형의 bit image 지역을 정의한다 (tparm 사용)

define_char defc ZE 문자 집합 안에서의 문자를 정의한다

delete_character dch1 dc 문자를 지운다 (P*)

delete_line dl1 dl 줄(line)을 지운다 (P*)

device_type devt dv language/codeset 지원을 표시한다

dis_status_line dsl ds 상태줄을 사용할 수 없게 한다

display_pc_char dispc S1 PC 문자를 표시한다

down_half_line hd hd 반-줄 아래로 (forward 1/2 linefeed)

ena_acs enacs eA 변경된 문자 집합을 사용가능하게 한다.

end_bit_image_region endbi Yy bit image 지역을 끝낸다 (tparm 사용)

enter_alt_charset_mode smacs as 변경된 문자 집합을 시작한다 (P)

enter_am_mode smam SA 자동 여백으로 전환한다

enter_blink_mode blink mb 깜빡거림으로 전환한다

enter_bold_mode bold md 굵은체(extra bright) 모드로 전환한다.

enter_ca_mode smcup ti cup를 사용하는 프로그램을 시작하기 위한 문자열

enter_delete_mode smdc dm 모드를 지운다(enter)

enter_dim_mode dim mh half-bright 모드로 전환한다

enter_doublewide_mode swidm ZF double-wide 모드를 사용가능하게 한다

enter_draft_quality sdrfq ZG draft-quality 인쇄를 지정한다

enter_insert_mode smir im 삽입 모드 (enter);

enter_italics_mode sitm ZH 이탤릭(italics) 모드를 사용가능하게 한다

enter_leftward_mode slm ZI 왼쪽 방향의 carriage 움직임을 가능하게 한다

enter_micro_mode smicm ZJ micro-motion 능력을 가능하게 한다

enter_near_letter_quality snlq ZK NLQ 인쇄를 지정한다

enter_normal_quality snrmq ZL 일반적인 질(quality)의 인쇄를 가능하게 한다

enter_pc_charset_mode smpch S2 PC 문자 표시(display) 모드로 들어간다

enter_protected_mode prot mp 보호(protected) 모드로 전환한다

enter_reverse_mode rev mr 반전 비디오 모드로 전환한다

enter_scancode_mode smsc S4 PC scancode 모드로 들어간다

enter_secure_mode invis mk 공백(blank) 모드로 전환한다 (문자들은 안 보임)

enter_shadow_mode sshm ZM 그림자 모드(shadow-mode) 인쇄를 가능하게 한다

enter_standout_mode smso so stand out 모드를 시작한다

enter_subscript_mode ssubm ZN 아래 첨자(subscript) 인쇄를 가능하게 한다

enter_superscript_mode ssupm ZO 위첨자(superscript) 인쇄를 가능하게 한다

enter_underline_mode smul us 밑줄(underscore) 모드를 가능하게 한다

enter_upward_mode sum ZP 위로의 carriage 움직임을 가능하게 한다

enter_xon_mode smxon SX xon/xoff handshaking를 전환한다

erase_chars ech ec Erase #1 characters (PG)

exit_alt_charset_mode rmacs ae 변경된 문자 집합을 끝낸다(P)

exit_am_mode rmam RA 자동 여백을 해지한다

exit_attribute_mode sgr0 me 모든 속성을 해지한다

exit_ca_mode rmcup te cup를 사용하는 프로그램들을 끝내기 위한 문자열

exit_delete_mode rmdc ed 삭제 모드를 끝낸다

exit_doublewide_mode rwidm ZQ doublewide 인쇄를 사용 불가능하게 한다

exit_insert_mode rmir ei 삽입 모드를 끝낸다

exit_italics_mode ritm ZR 이탤릭(italic) 인쇄를 불가능하게 한다

exit_leftward_mode rlm ZS 오른쪽으로의(일반적인) carriage 움직임을 가능하게 한다

exit_micro_mode rmicm ZT micro 움직임 능력들을 사용 불가능하게 한다

exit_pc_charset_mode rmpch S3 PC character 표시를 사용 불가능하게 한다

exit_scancode_mode rmsc S5 PC scancode 모드를 사용 불가능하게 한다

exit_shadow_mode rshm ZU 그림자(shadow) 인쇄를 사용 불가능하게 한다

exit_standout_mode rmso se stand out 모드를 끝낸다

exit_subscript_mode rsubm ZV 아래첨자(subscript) 인쇄를 사용 불가능하게 한다

exit_superscript_mode rsupm ue 밑줄(underscore) 모드를 끝낸다

exit_upward_mode rum ZX 아래로의(일반적인) carriage 움직임을 사용가능하게 한다

exit_xon_mode rmxon RX xon/xoff handshaking를 해지한다

flash_screen flash vb 보여지는 bell (커서는 움직이지 않을런지 모른다)

form_feed ff ff Hardcopy terminal page eject (P*)

from_status_line fsl fs 상태 줄로부터 반환한다

init_1string is1 i1 단말기 초기화 문자열

init_2string is2 i2 단말기 초기화 문자열

init_3string is3 i3 단말기 초기화 문자열

init_file if if 포함하고 있는 파일의 이름

init_prog iprog iP 초기화를 위한 프로그램의 패스 이름

initialize_color initc Ic 색상의 정의를 초기화한다

initialize_pair initp Ip 색상의 쌍을 초기화한다

insert_character ich1 ic 문자를 삽입한다(P)

insert_line il1 al 새로운 공백 줄을 더한다(P*)

insert_padding ip ip 삽입된 문자 뒤에 패드를 삽입한다(p*)

key_a1 ka1 K1 Upper left of keypad

key_a3 ka3 K3 Upper right of keypad

key_b2 kb2 K2 Center of keypad

key_backspace kbs kb backspace key에 의해 보내진다

key_beg kbeg 1 begin key

key_btab kcbt kB back-tab key

key_c1 kc1 K4 Lower left of keypad

key_c3 kc3 K5 Lower right of keypad

key_cancel kcan 2 cancel key

key_catab ktbc ka clear-all-tabs key에 의해 보내진다

key_clear kclr kC clear screen or erase key에 의해 보내진다

key_close kclo 3 close key

key_command kcmd 4 command key

key_copy kcpy 5 copy key

key_create kcrt 6 create key

key_ctab kctab kt clear-tab key에 의해 보내진다

key_dc kdch1 kD delete character key에 의해 보내진다

key_dl kdl1 kL delete line key에 보내진다

key_down kcud1 kd terminal down arrow key에 의해 보내진다

key_eic krmir kM 삽입 모드에서 rmir or smir에 의해 보내진다

key_end kend 7 end key

key_enter kent 8 enter/send key

key_eol kel kE clear-to-end-of-line key에 의해 보내진다

key_eos ked kS clear-to-end-of-screen key에 의해 보내진다

key_exit kext 9 exit key

key_find kfnd 0 find key

key_help khlp %1 help key

key_home khome kh home key에 의해 보내진다

key_ic kich1 kI ins char/enter ins mode key에 의해 보내진다

key_il kil1 kA insert line에 의해 보내진다

key_left kcub1 kl terminal left arrow key에 의해 보내진다

key_ll kll kH home-down key에 의해 보내진다 key_mark kmrk %2 mark key

key_message kmsg %3 message key

key_move kmov %4 move key

key_next knxt %5 next key

key_npage knp kN next-page key에 의해 보내진다

key_open kopn %6 open key

key_options kopt %7 options key

key_ppage kpp %8 previous key

key_print kprt %9 print key

key_redo krdo %0 redo key

key_reference kref &1 reference key

key_refresh krfr &2 refresh key

key_replace krpl &3 replace key

key_restart krst &4 restart key

key_resume kres &5 resume key

key_right kcuf1 kr terminal right arrow key에 의해 보내진다

key_save ksav &6 save key

key_sbeg kBEG &9 shifted begin key

key_scancel kCAN &0 shifted cancel key

key_scommand kCMD *1 shifted command key

key_scopy kCPY *2 shifted copy key

key_screate kCRT *3 shifted create key

key_sdc kDC *4 shifted delete char key

key_sdl kDL *5 shifted delete line key

key_select kslt *6 select key

key_send kEND *7 shifted end key

key_seol kEOL *8 shifted end of line key

key_sexit kEXT *9 shifted exit key

key_sf kind kF Sent by scroll-forward/down key

key_sfind kFND *0 shifted find key

key_shelp kHLP #1 shifted help key

key_shome kHOM #2 shifted home key

key_sic kIC #3 shifted insert char key

key_sleft kLFT #4 shifted left key

key_smessage kMSG %a shifted message key

key_smove kMOV %b shifted move key

key_snext kNXT %c shifted next key

key_soptions kOPT %d shifted options key

key_sprevious kPRV %e shifted previous key

key_sprint kPRT %f shifted print key

key_sr kri kR scroll-backward/up key에 의해 보내진다

key_sredo kRDO %g shifted redo key

key_sreplace kRPL %h shifted replace key

key_sright kRIT %i shifted right key

key_srsume kRES %j shifted resume key

key_ssave kSAV !1 shifted save key

key_ssuspend kSPD !2 shifted suspend key

key_stab khts kT Sent by set-tab key

key_sundo kUND !3 shifted undo key

key_suspend kspd &7 suspend key

key_undo kund &8 undo key

key_up kcuu1 ku terminal up arrow key에 의해 보내진다

keypad_local rmkx ke Out of "keypad transmit" mode

keypad_xmit smkx ks Put terminal in "keypad transmit" mode

lab_f0 lf0 l0 Labels on function key f0 if not f0

lab_f1 lf1 l1 Labels on function key f1 if not f1

lab_f2 lf2 l2 Labels on function key f2 if not f2

lab_f3 lf3 l3 Labels on function key f3 if not f3

lab_f4 lf4 l4 Labels on function key f4 if not f4

lab_f5 lf5 l5 Labels on function key f5 if not f5

lab_f6 lf6 l6 Labels on function key f6 if not f6

lab_f7 lf7 l7 Labels on function key f7 if not f7

lab_f8 lf8 l8 Labels on function key f8 if not f8

lab_f9 lf9 l9 Labels on function key f9 if not f9

lab_f10 lf10 la Labels on function key f10 if not f10

label_on smln LO soft labels로 전환한다

label_off rmln LF soft labels를 해지한다

meta_off rmm mo "meta mode"를 해지한다

meta_on smm mm "meta mode" (8th bit)로 전환한다

micro_column_address mhpa ZY Like column_address for micro adjustment

micro_down mcud1 ZZ Like cursor_down for micro adjustment

micro_left mcub1 Za Like cursor_left for micro adjustment

micro_right mcuf1 Zb Like cursor_right for micro adjustment

micro_row_address mvpa Zc Like row_address for micro adjustment

micro_up mcuu1 Zd Like cursor_up for micro adjustment

newline nel nw Newline (lf에 의해 따라오는 cr과 같이 행동한다)

order_of_pins porder Ze Matches software buts to print-head pins

orig_colors oc oc 모든 색상 쌍들을 Reset한다

orig_pair op op 원래의 것으로 디폴트 색상-쌍을 지정한다

pad_char pad pc Pad character (rather than null)

parm_dch dch DC #1 chars (PG*)를 지운다

parm_delete_line dl DL #1 lines (PG*)을 지운다

parm_down_cursor cud DO 커서를 #1 lines (PG*) 아래로 이동시킨다

parm_down_micro mcud Zf Like cud for micro adjust

parm_ich ich IC #1 blank chars (PG*)를 삽입한다

parm_index indn SF 앞으로 #1 lines (PG)을 스크롤한다

parm_insert_line il AL #1 new blank lines (PG*)을 더한다

parm_left_cursor cub LE 커서를 왼쪽으로 #1 spaces (PG)만큼 이동시킨다

parm_left_micro mcub Zg Like cul for micro adjust

parm_right_cursor cuf RI 커서를 오른쪽으로 #1 spaces (PG*)만큼 이동시킨다

parm_right_micro mcuf Zh Like cuf for micro adjust

parm_rindex rin SR 뒤로 #1 lines (PG)만큼 스크롤한다

parm_up_cursor cuu UP 커서를 위로 #1 lines (PG*)만큼 이동시킨다

parm_up_micro mcuu Zi Like cuu for micro adjust

pkey_key pfkey pk Prog funct key #1 to type string #2

pkey_local pfloc pl Prog funct key #1 to execute string #2

pkey_xmit pfx px Prog funct key #1 to xmit string #2

pkey_plab pfxl xl Program key #1 to xmit #2 and show #3

plab_norm pln pn program label #1 to show string #2

print_screen mc0 ps 화면의 내용을 인쇄한다

prtr_non mc5p pO Turn on the printer for #1 bytes

prtr_off mc4 pf 프린터를 끈다

prtr_on mc5 po 프린터를 켠다

repeat_char rep rp 문자를 #1 #2 times 반복한다. (PG*)

req_for_input rfi RF 입역을 위해 요청한다

reset_1string rs1 r1 Reset terminal completely to sane modes.

reset_2string rs2 r2 Reset terminal completely to sane modes.

reset_3string rs3 r3 Reset terminal completely to sane modes.

reset_file rf rf reset 문자열을 포함하고 있는 파일의 이름

restore_cursor rc rc 마지막 sc의 위치로 커서를 재저장한다

row_address vpa cv Vertical position absolute (set row) (PG)

save_cursor sc sc 커서의 위치를 저장한다(P)

scancode_escape scesc S7 Escape for scancode emulation

scroll_forward ind sf 텍스트를 위로 스크롤한다 (P)

scroll_reverse ri sr 텍스트를 아래로 스크롤한다 (P)

select_char_set scs Zj 문자 집합을 선택한다

set0_des_seq s0ds s0 Shift to codeset 0 (EUC set 0, ASCII)

set1_des_seq s1ds s1 Shift to codeset 1

set2_des_seq s2ds s2 Shift to codeset 2

set3_des_seq s3ds s3 Shift to codeset 3

set_a_background setab AB ANSI escape를 사용하는 background 색상을 지정한다

set_a_foreground setaf AF ANSI escape를 사용하는 foreground 색상을 지정한다

set_attributes sgr sa 비디오 속성을 정의한다(PG9)

set_background setb Sb 현재 background 색상을 지정한다

set_bottom_margin smgb Zk 현재 줄의 아래 여백(bottom margin)을 지정한다

set_bottom_margin_parm smgbp Zl 바닥으로 부터 at line #1 or #2 lines에 바닥 줄을 지정한다

set_color_band setcolor Yz 리본 색상을 #1로 바꾼다

set_color_pair scp sp 현재의 색상 쌍을 지정한다

set_foreground setf Sf 현재의 foreground 색상을 지정한다

set_left_margin smgl ML 현재 줄에 왼쪽 여백(left margin)을 지정한다

set_left_margin_parm smglp Zm #1 (#2)에 왼쪽(오른쪽)여백을 지정한다

set_lr_margin smglr ML 왼쪽과 오른쪽 여백 모두를 지정한다

set_page_length slines YZ 페이지의 길이를 #1 lines로 지정한다 (tparm 사용)

set_right_margin smgr MR 현재의 컬럼에 오른쪽 여백을 지정한다

set_right_margin_parm smgrp Zn 컬럼 #1에 오른쪽 여백을 지정한다

set_tab hts st 모든 row의 현재 컬럼에 tab을 지정한다

set_tb_margin smgtb MT 위와 아래 여백 모두를 지정한다

set_top_margin smgt Zo 현재 줄에 위쪽 여백을 지정한다

set_top_margin_parm smgtp Zp line #1에 위 여백을 지정한다

set_window wind wi 현재의 윈도우는 lines #1-#2 cols #3-#4이다

start_bit_image sbim Zq bit image graphics 인쇄를 시작한다

start_char_set_def scsd Zr 문자 집합의 정의를 시작한다

stop_bit_image rbim Zs bit image graphics 인쇄를 끝낸다

stop_char_set_def rcsd Zt 문자 집합 정의를 끝낸다

subscript_characters subcs Zu subscriptable 문자들의 목록

superscript_characters supcs Zv superscriptable 문자들의 목록

tab ht ta Tab to next 8 space hardware tab stop

these_cause_cr docr Zw 이러한 문자들은 CR을 야기시킨다

to_status_line tsl ts 상태줄의 column #1로 간다

underline_char uc uc Underscore one char and move past it

up_half_line hu hu Half-line up (reverse 1/2 linefeed)

xoff_character xoffc XF XON character

xon_character xonc XN XOFF character

(다음의 문자열 능력들은 SYSVr 용어 구조 안에 표현되지만 man page안에는 문서화되어 있지 않다. 주석들은 용어 구조 헤더에 있다.) label_format fln Lf ??

set_clock sclk SC time-of-day 시계를 지정한다

display_clock dclk DK time-of-day 시계를 표시한다

remove_clock rmclk RC time-of-day 시계를 제거한다??

create_window cwin CW Define win #1 to go from #2,#3 to #4,#5

goto_window wingo WG 윈도우 #1로 간다

hangup hup HU Hang up phone

dial_phone dial DI Dial phone number #1

quick_dial qdial QD Dial phone number #1, without progress detection

tone tone TO touch tone dialing을 선택한다

pulse pulse PU pulse dialing을 선택한다

flash_hook hook fh Flash the switch hook

fixed_pause pause PA 2 ~ 3초간 정지한다

wait_tone wait WA Wait for dial tone

user0 u0 u0 사용자 문자열 # 0

user1 u1 u1 사용자 문자열 # 1

user2 u2 u2 사용자 문자열 # 2

user3 u3 u3 사용자 문자열 # 3

user4 u4 u4 사용자 문자열 # 4

user5 u5 u5 사용자 문자열 # 5

user6 u6 u6 사용자 문자열 # 6

user7 u7 u7 사용자 문자열 # 7

user8 u8 u8 사용자 문자열 # 8

user9 u9 u9 사용자 문자열 # 9

get_mouse getm Gm Curses 버튼 이벤트를 가져야만 한다

key_mouse kmous Km ??

mouse_info minfo Mi 마우스 상태 정보

pc_term_options pctrm S6 PC 단말기 선택사항

req_mouse_pos reqmp RQ 마우스 위치에 대한 보고를 요청한다

zero_motion zerom Zx 뒤따라오는 문자를 위한 움직임은 없다

 

8.23 [N]Curses 함수 개관 ([N]Curses Function Overview)

다음의 텍스트에서 다른 (n)curses 패키지를 통한 개요(overview)를 찾을 수 있을 것이다. 첫번째 컬럼은 bsd-curses이고(슬랙웨어 2.1.0과 Sun-OS 4.x에서 처럼) 두번째는 sysv-curses (Sun-OS 5.4/Solaris 2)이고 세번째는 ncurses(버전 1.8.6)이다.

네번째는 함수가 (실제로 설명되어있다면) 설명되어있는 텍스트의 페이지를 참조한다.

x
패키지는 이 함수를 가진다.
n
함수는 아직 구현되지 않음.

계속......