텍스트 widget은 여러 줄의 텍스트를 보여주거나 편집할 수 있게 해준다. 여러가지 색이나 글꼴을 원하는 대로 동시에 섞어서 쓸 수 있다. 또한 키입력에 바탕을 둔 많은 수의 Emacs와 호환 텍스트 편집 명령들도 지원한다.
텍스트 widget은 한 단어나 한줄 전체를 선택(select)하는 더블 클릭, 트리플 클릭을 포함해서 완전한 cut-and-paste 기능을 갖고 있다.
텍스트 widget을 만드는 함수는 단 하나뿐이다.
GtkWidget* gtk_text_new (GtkAdjustment *hadj,
GtkAdjustment *vadj);
인자들은 현재 widget이 보여주고 있는 텍스트의 위치를 추적할 수 있게 해주는 Adjustment의 포인터이다. 두 인자 중 하나나 둘 모두에 NULL을 넘겨주면 gtk_text_new 함수는 자기 자신의 것을 새로이 만든다.
void gtk_text_set_adjustments (GtkText *text,
GtkAdjustment *hadj,
GtkAdjustment *vadj);
위 함수는 아무 때나 텍스트 widget의 수직, 수평 adjustment를 바꿀 수 있게 해준다.
텍스트 위젯은 텍스트의 양이 윈도에 다 출력되기에 너무 길어도 자동적으로 스크롤 바를 만들지는 않는다. 그러므로 우리는 직접 그것들을 만들어서 출력 레이아웃에 추가하여야 한다.
vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj);
gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0);
gtk_widget_show (vscrollbar);
위의 코드는 수직 스크롤바를 하나 만들고 이를 텍스트 widget인 text
의 수직
adjustment에 붙인다. 그리고는 정상적인 방법대로 box에 넣는다.
텍스트 widget을 사용하는 주된 두가지 길이 있다. 사용자에게 텍스트의 내용을 편집할 수 있게 하거나 또는 사용자에게 여러 줄의 텍스트를 보여주기만 할 수 있다. 이 두가지 모드 사이를 왔다갔다하기 위해서 텍스트 widget은 다음 함수를 갖고 있다.
void gtk_text_set_editable (GtkText *text,
gint editable);
인자 editable
에 TRUE나 FALSE를 주어서 사용자가 텍스트 widget의 내용을
편집 가능, 또는 불가능하도록 만들 수 있다. 텍스트 widget이 편집 가능한
상태면 현재 입력 위치에 커서가 나타난다.
이 두가지 모드에서 텍스트 widget을 쓰는 것은 별다른 제한이 없다. 아무 때나 텍스트 widget의 편집 가능상태를 바꿀 수 있고 아무 때나 텍스트를 입력할 수 있다.
텍스트 widget은 출력 윈도의 한줄에 다 보여질 수 없을 만큼 긴 줄들을 wrapping하는 능력이 있다. 줄이 넘어가는 위치에 있는 단어를 양쪽으로 쪼개는 것이 기본 동작이다. 이는 다음 함수로 바꿀 수 있다.
void gtk_text_set_word_wrap (GtkText *text,
gint word_wrap);
이 함수를 써서 텍스트 widget이 단어를 쪼개지 않고 wrap하도록 지정해 줄 수 있다.
인자 word_wrap
는 TRUE나 FALSE의 값을 갖는다.
텍스트 widget의 입력 포인트는 다음 함수를 이용하여 지정한다.
void gtk_text_set_point (GtkText *text,
guint index);
index
가 입력 포인트의 위치이다.
현재 입력 포인트를 구하는 것도 유사하다.
guint gtk_text_get_point (GtkText *text);
위의 두 함수와 같이 쓰면 좋은 함수는
guint gtk_text_get_length (GtkText *text);
이다. 이는 텍스트 widget의 길이를 돌려보낸다. 이 길이는 한 줄의 끝을 나타내는
캐리지-리턴을 포함한 텍스트 안의 모든 캐릭터 숫자이다.
현재 입력 포인트에 텍스트를 넣으려면 텍스트의 색, 바탕색, 글꼴을 지정도 하는 gtk_text_insert 함수를 사용한다.
void gtk_text_insert (GtkText *text,
GdkFont *font,
GdkColor *fore,
GdkColor *back,
const char *chars,
gint length);
색, 바탕색, 글꼴을 지정하는 인자에 NULL을 넣으면 이 전에 쓰인 widget style
내의 값이 이용된다. 인자 length에 -1
을 넣으면 주어진 텍스트의 전부가
다 입력된다.
텍스트 widget은 gtk_main 함수 밖에서도 스스로를 동적으로 다시 그리는(redraw) GTK 내에서 몇 안되는 존재이다. 이는 텍스트 widget의 내용을 변경하면 즉시 그 효과가 그대로 나타난다는 의미이다. 이러한 것은 텍스트의 내용을 한꺼번에 여러번 변경하는 경우 바라지 않는 일일 수도 있다. 텍스트 widget이 끊임없이 스스로를 다시 그리는 일 없이 여러번 변경하기 위해서 widget을 그러지 못하도록 임시로 고정해 버릴 수 있다. 그리고 변경이 다 완벽히 끝난 뒤에 다시 widget을 풀어주면 된다.
다음 두 함수로 고정하거나 풀어주는 일을 할 수 있다.
void gtk_text_freeze (GtkText *text);
void gtk_text_thaw (GtkText *text);
텍스트는 다음 함수들을 써서 현재 입력 포인트에서 앞쪽으로나 뒷쪽 방향으로 텍스트 widget에서 지워질 수 있다.
gint gtk_text_backward_delete (GtkText *text,
guint nchars);
gint gtk_text_forward_delete (GtkText *text,
guint nchars);
텍스트 widget의 내용을 꺼내고 싶다면 매크로 GTK_TEXT_INDEX(t, index)
가
텍스트 widget t
의 index
위치의 캐릭터를 꺼낼 수 있게 해준다.
더 많은 양의 텍스트를 한꺼번에 꺼낼려면 다음 함수를 쓴다.
gchar *gtk_editable_get_chars (GtkEditable *editable,
gint start_pos,
gint end_pos);
이것은 텍스트 widget의 부모 클래스의 함수이다. end_pos
의 값이 -1이면
이는 텍스트의 끝을 의미한다. 텍스트의 시작은 0이다.
이 함수는 꺼낼 텍스트를 위한 새로운 메모리 영역을 할당한다. 그러므로 다 이용한 뒤에는 g_free 함수를 호출하여 메모리 영역을 풀어주는 것을 잊지말라.
텍스트 widget은 편집, 이동, 선택(selection)을 위한 미리 지정된 키보드 단축키들을 갖고 있다. 이들은 Control, Alt 키와의 조합이다.
여기에 덧붙여 커서키로 이동할 때 Control를 누르고 있으면 커서가 한 문자 단위가 아니라 한 단어 단위로 움직인다. Shift를 누르고 있으면 커서가 이동한 부분이 자동적으로 선택된다.