다음 이전 차례

1. 옮긴이의 말

지난 2월 말부터 조금씩 번역해 본 GTK Tutorial입니다. 출처는 GTK+의 공식 홈페이지인 http://www.gtk.org/입니다. 번역을 대충 끝마친 지금(3/??), 이 Tutorial은 1998/1/24 날짜로 올라온 것이 가장 새로운 것이네요. 물론 이 번역물도 그것을 기준으로 했습니다. 또 재활용성(?)을 위하여 처음부터 끝까지 일반적인 텍스트(plain text)의 포맷을 유지했습니다.

GTK+ Tutorial은 모두 24개의 장(Chapter)으로 이루어졌고 마지막 장인 24장을 비롯한 몇몇은 오히려 원문을 그대로 참고하는 것이 좋을 것이라고 판단, 거의 번역하지 않았습니다. 그리고 제가 번역했다고 주장(?)하는 나머지 장들도, 원래 상식이하의 영어실력과 수준이하의 Xlib/Widget Programming 경험으로 인해 꽤나 어지럽게 쓸 수밖에 없었습니다. 하지만 나름대로 신경은 썼으니깐, 알아서 받아들이시길 바랍니다. :) 번역한 내용의 정확성에 대해서도 책임 못 집니다. 또한 더 효과적인 이해를 위해서 예제를 직접 컴파일/실행해 보실 것을 권합니다.

이 Tutorial 번역문을 보는 데 있어서, 어지러움을 조금이나마 덜어 드리기 위해 전체적인 윤곽을 소개합니다.

소개

GTK(GTK+)의 설계와 소개입니다. 이미 나우 리동(go linux) 번역물 게시판에 올린 GTK+ FAQ이 참고가 될 것입니다.

시작하면서

GTK 어플의 전형적인 구조와, 그 유명한 helloworld.c 프로그램입니다. 그리고 다들 골치아파 하는 컴파일 옵션도 간단히 설명되어 있죠. 중요한 이론, 즉 시그널(signal)과 함수에 대한 포인터(callback function)를 GTK가 이용하는 방식에 대해서도 다룹니다.

앞으로 나아가며

helloworld.c를 조금 개선하면서 자료형들에 대한 잔소리 쪼금, 그리고 시그널 핸들러에 대한 보충설명이 있습니다. 시그널, 중요한 거죠.

패킹 Widget

패킹(packing)이라는 중요한 개념에 대해(저도 지긋지긋해졌습니다` :) 예제와 함께 설명하고 있습니다. 패킹은 사각형의 어떤 영역에 뭔가를 넣어 둔다는 의미로, GTK+처럼 윈도, 객체를 다루는 개발방식에서 굉장히 기본적이고 "자주 나오는" 놈입니다. 여기서는 하나씩 패킹하기 위한 박스(box)개념과, 여러개를 한꺼번에 패킹하기 위한 테이블(table)개념을 차례대로 소개합니다.

Widget의 개요

FAQ에서도 언급했고, 이 문서의 본문에도 여러번 강조됐지만, GTK+은 C언어의 typedef struct{...} WidgetObject; 같은 이용으로 "객체지향기법"을 추구하고 있습니다. 물론 C++에서의 public member function을 흉내내기 위해 return_type (*func_pointer)(parameters,...) 으로 선언되는 callback 함수를 씁니다. 여기서 func_pointer의 정체를 알고, 그리고 잘 써먹을 수 있을 정도의 "C언어 실력(?)"만 있다면 GTK를 골려가며 이길 수 있을 겁니다. GTK+은 이렇게 그다지 어려운 게 아닙니다. :) 이 장에서는 GTK+ Object의 전부나 다름없는 widget에 대해, 일종의 공격 작전설명을 해주고 있습니다. 이미 다른 Widget 집단을 써본 경험 혹은 최소한 Xlib를 다뤄본 경험이 있다면 C언어에 능통한 것만큼이나 큰 도움이 될 것입니다. 참, 이 장에는 Gtk widget object들의 계층구조도 줄줄이 소개되어 있습니다. 매우 요긴한 정보죠.

버튼 widget

우선 제일 만만한 widget으로 버튼을 해치우고 있습니다. 그냥 버튼, 이쁜 버튼(픽스맵이 붙은 *), 특이한 버튼(토글, 체크, 라디오,..) 등 우리가 윈도용 응용어플들에서 많이 이용해 온 모든(?) 종류의 버튼들을 파헤칩니다.

다양한 widget들

자기 혼자 쓰이기보다 다른 widget을 꾸미기 위해 쓰이는 경향이 있는 몇가지 잡다한 widget을 소개합니다. 라벨(label), 풍선도움말(tooltip), 진행 막대(progress bar), 대화상자(dialog box), 픽스맵(pixmap) 등입니다. 특히 픽스맵에 대해서는 꽤 길고 자상하게(?) 다뤘군요. Tooltip을 풍선도움말이라고 해석한 건, MacOS(한글판)에서 그런 걸 풍선도움말이라 부르는 데 익숙해졌기 때문입니다. 또다른 표현은 몰라요. :) 또, 간단하면서도 거의 모든 어플들에서 요긴하게 쓰일 파일선택 박스가 소개되어 있습니다. 그냥 '쉬어가는 페이지' 정도 될 듯 하네요. :) 예제를 컴파일해서 실행해 보면, 왜 너도나도 툴킷(toolkit)을 찾는지 알 수 있을 겁니다.

컨테이너 widget

노트북(notebook)과 스크롤된 윈도(scrolled window)를 다룹니다. 이들은 결과적으로 보여지게 될 다른 widget들을 조직적으로 관리하는 widget 들입니다. 웹써치엔진(Yahoo,Altavista,..)으로 흔한 단어, 예를들어 "girl"을 검색해보면 다들 알다시피 무지막지한 갯수의 링크가 쏟아지죠? 이때 화면을 관리하기 위해 웹브라우저 윈도는 스크롤됩니다. 즉, 스크롤바(scroll bar)가 생기죠. 하지만 "girl"의 경우처럼 수천 수만 개의 링크를 가졌다면 스크롤바 로도 감당못하죠? 그래서 그 페이지의 제일 아래쪽에 내려와보면 전체 링크를 1부터 20까지, 그리고 <더 있음(NEXT)>이라는, 페이지(page)로 관리하고 있음을 알 수 있습니다. 이렇게 페이지를 관리하는 게 노트북입니다.

리스트 widget

파일매니저(file manager)가 가장 좋은 예가 되겠네요. M$윈도그의 탐색기(explorer)나 TkDesk의 파일관리창을 보면, 각 파일의 이름과 속성들을 아이템(item)으로 하는 리스트(list)로 이루어져 있습니다. 이 장에서 다루는 것은 이런 리스트를 만드는 방법과, 마우스버튼의 좌우클릭을 적절히 끼워맞춰 선택(selection)을 관리하는 방법 등입니다. 간단한 예제 프로그램이 있으니 참고하세요.

메뉴 widget

메뉴(menu)를 만드는 방법을 소개하고 있습니다. GTK+ 역시 하나의 툴킷이니깐 나름대로 메뉴 하나 만들어 주는 함수 쯤은 제공합니다. 그리고 섬세함에선 약간 떨어지지만, 메뉴를 왕창 대량생산해주는 공장(factory)도 제공합니다. 메뉴에는 풀다운(pull-down)과 팝업(pop-up) 두가지가 있죠. 그리고 쉬운 방법과 "더" 쉬운 방법(메뉴공장)을 각각 이해할 수 있도록 두 예제 프로그램이 소개되었습니다.

텍스트 widget

많은 양의 텍스트를 다룰 때 편리한 텍스트 widget에 관해 설명하고 있습니다. 이 widget은 일반 텍스트 에디터나 뷰어와 비슷한 기능을 갖고 있습니다.

문서화되지 않은 widget들

'이런 것들에 대해서는 아직 튜토리얼이 없으니 당신이 한 번 만들어 봐!' -> 이러는군요. :) 누가 본보기로 Preview라는 widget에 대해 써놨다며 그 문서를 인용했더군요. 하지만 전 그 부분을 과감히(?!) 삭제하고 이 장 전체를 비워뒀습니다. (죄송 *) www.gtk.org에 있는 원문을 참고하세요.

이벤트박스 widget

gtk+970916.tar.gz 이후의 배포본에서만 지원하는 widget이라는군요. 메뉴도 아니고 버튼도 아니고, 어쨌든 결과적으로 유용하게(?) 쓰인다네요. :)

Widget의 속성을 세팅하기

제목은 그럴듯하지만, 실제로 이 장을 열어보니 함수원형(prototype) 몇 개 뿐이더군요. 하지만 GTK+에서도 역시 긴 함수이름은 그 자체가 설명입 니다. 첫 부분에 무슨 잔소리가 있던데, 그냥 있는 그대로 해석해 뒀습니다. 각 widget object들의 속성(property)을 관리하기 위한 함수들입니다.

타임아웃, 그리고 I/O와 Idle 함수들

주어진 시간(milliseconds)마다 호출되는 함수, 그냥 대기하는 함수, 데이터의 이동을 감시하는(monitoring) 함수 등이 소개되어 있습니다. 예제는 없지만 대충 보면 감이 잡힐 겁니다. ^^;

Selection 관리하기

대부분의 터미널이나 에디터(editor)는 마우스로 본문을 찍 긁으면 그 선택된 영역이 반전되고, 메뉴에서 그 영역에 대해 카피(copy), 컷(cut), 페이스트(paste) 등의 작업을 할 수 있습니다. 그런데 어떤 에디터에서 뭔가 긁어놓고 곧바로 다른 에디터의 또 한 영역을 긁으면 보통 어떻게 되던가요? 제가 기억하는 거의 모든 어플의 경우, 먼저 긁었던 내용은 '무시'되더군요. 이런 문제를 selection이 관리합니다. 굉장히 어려운 단어도 있고 해서, 겨우 번역했습니다. (원문은 꽤 읽어줄 만 했는데, 제가 번역한 건 나도 읽기가 싫네요. :)

glib

GTK+ FAQ에서도 간단히 밝혔지만, GTK+는 기존의 libc가 아닌, glib를 이용합니다. 당장 각 플랫폼에서 이 새로운 버전의 C 라이브러리를 설치해야 할 뿐만 아니라, 몇가지 표준함수들이 glib에서 어떻게 변했는지 대충 알아놔야 하겠죠. (일반적인 사용자 입장에서는 별로 변한 게 없습니다, 원래 printf가 g_print로 바뀐 식이니깐요. ;) 이 장에서는 기존의 libc에서는 제공하지 않는 새로운 것들을 위주로, 간단한 설명을 하고 있습니다. 각 자료형마다의 극한값(extrema)과, 아키텍쳐 (architecture)에 관계없이 typedef된 주요 자료형(data type)들, 그리고 말이 나온 김에 줄줄이 연결리스트(linked list)도 소개해 놨군요. 기존의 메모리 관리 함수 대신 쓰라면서 g_malloc/g_free를 비롯한, glib판의 메모리함수들도 있으며, 시스템 타이머(timer)함수, 문자열(string)함수까지 있네요. 그리고 끝으로 유틸리티 및 에러함수들을 소개했습니다.

GTK의 rc 파일

유닉스 계열의 운영체제를 이용하는 분이라면 꿈에서도 이 rc파일을 편집하지나 않을지 모르겠네요. ^^; 이 장에서는 우리가 익숙해진 어플들처럼, 똑같은 바이너리(binary,executable)를 각 사용자의 입맛에 맞게 '환경설정'을 해서 이용할 수 있게 하는 걸 소개합니다. GTK+의 rc파일은 다른 대부분의 X용 어플들과 비슷한, 일관성 있는 심볼(simbol)을 이용합니다. 마지막 부분에 예제 rc파일이 있으니 참고하세요.

자신만의 widget 만들기

이 장의 내용은 "Creating Your Own Widgets", 즉 "자신만의 widget 만들기" 입니다. 실제 하는 역할도 그렇지만 이름도 Tictactoe라는 widget을 이렇게 저렇게 만들어 가는 과정에서 여러가지 주의꺼리/참고꺼리를 늘어놓았습니다. Widget을 만든다는 건 이미 있는 widget을 이용하는 것과는 또다른 개념으로, 몇가지 집고 넘어갈 것이 있습니다. 우선, 진짜 허허벌판에서 시작 하는 게 아니라 "어디서 상속"받을 것인지를, 즉 그의 parent class를 선택해야 합니다. 그리고 이 widget이 처리해야할 시그널과 이벤트에 대해서도 목적에 맞게 "잘" 설정해야죠. 그리고 이 장의 마지막에서는, 이렇게 애써(?) 만든 widget들의 어설픈 문제점들을 지적하고, 그 해결방향을 제시하고 있군요.

낙서장, 간단한 그리기 예제

상당히 방대하고 잡다한(?) 내용을 다루는 장입니다. GIMP처럼, 진짜 그림을 다루기 위해서 알아야 할 것들이라고 하는군요. 먼저 마우스와 키보드의 미묘한 저수준 이벤트(low-level event)를 다루고 있습니다. Xlib에서 접할 수 있듯이 여러 #define 상수들을 비트연산 (bitwise operation)시키는 거죠. 이 상수들은 키보드와 마우스에서 일어나는 여러가지 이벤트들을 섬세하게 구별하기 위한 것이겠죠? 뒤를 잇는 놈들은 낙서를 할 도화지를 관리하는 방법입니다. 대부분의 widget과 함수들은 GTK의 베이스(base)를 이루는 GDK(General Drawing Kits) 라이브러리에서 온 것들 입니다. 윈도에 직접 그리는 것보다, 픽스맵이라는 가상의 도화지에 그려놓고 그 내용을 필요할 때 윈도로 복사해 주는 방식을 쓰죠, Xlib에서처럼. 다음엔 픽스맵에 그림을 그리는 도구들에 대해 잔소리가 이어집니다. Xlib에서 GC(Graphics Context)란 놈을 구경해 봤다면 더 쉽게 이해할 수 있을 겁니다. 예를들어 사각형을 하나 그리는 도구는 gdk_draw_rectangle()이란 놈 인데, 사각형을 이루는 선의 굵기, 색깔, 종류(실선/점선/쇄선) 등 기본적인 속성들을 GC에 저장해 놓고, 실제로 그릴 때는 gdk_draw_rectangle이란 함수의 인자로서 해당하는 속성을 가지고 있는 GC를 넘겨줍니다. 물론 GTK+는 충분히 객체지향적이기 때문에 기본만 이해한다면 Xlib에서보다 더 직관적으로 즐길 수 있을 겁니다. 아직 끝나지 않았군요! -_-; 이 장에서는 더 섬세한 그림을 그리기 위해 마우스보다 더 좋은(더 비싼?) 입력장치를 이용할 것을, 은근히 부추기고 있습니다. Drawing tablet같은, 특수한 입력장치에서 발생하는 또다른 이벤트 들을 다루기 위해 확장이벤트(extended event)를 제공한다고 하네요. 마우스 에서 발생하는 몇가지 이벤트만으로도 머리가 아픈데 말입니다. :) 어쨌든 이 장의 마지막에서는, 마우스보다 더 좋은 장치(device)의 기능을 이용하는 방법에 대해 이야기하고 있습니다.

GTK 어플을 개발하는 팁

너무 중요한 내용이라 꼭 직접 보라고밖에는 말할 수 없네요. ;)

Contributing

역시 매우 중요한 겁니다.

Credits

이 문서를 제작하는 데 도움이 된 사람들에게 감사의 말을 전하는, 역시 아주 중요한 장입니다. 일부 원문을 그대로 뒀습니다.

Tutorial Copyright and Permissions Notice

GPL에 의한 모든 문서에서 볼 수 있는, 정말 중요한 글입니다. 일부러 원문을 그대로 놔뒀습니다.

제가 3월 26일에 입대를 하는 관계로 liberta@zeus.phys.cau.ac.kr, 그리고 liberta@cau.ac.kr 로 메일을 보내셔도 답이 없을 겁니다. :) 이 문서에 대한 추가와 수정, 그리고 어떤 곳으로의 업로드 등은 전적으로 자신에게 달려 있습니다. 그럼 GTK+과 함께 즐거운 여행을 하시길 바랍니다. :)

(서주태님이 번역하신 이 문서를 한지호가 다시 일반 text에서 SGML 형태로 바꾸고 최신 원문인 5월 24일자 Tutorial을 참조해서 달라진 부분을 보태어 수정했습니다. 이 문서를 읽으시다가 갑자기 번역이 열악해졌다고 느끼시는 부분이 있다면 아마 그 부분은 한지호가 새로 번역해서 추가한 곳일겁니다. ^^; 이 긴 문서를 번역하여 주시느라 수고하신 서주태님께 감사드립니다. 혹시 잘못 번역된 곳이나 실수, 오자를 발견하신 분은 hanjiho@penta.co.kr로 메일을 보내주시면 무척 고맙겠습니다. 서주태님 말씀대로 GTK+와 즐거운 여행을 하시길 바랍니다.)


다음 이전 차례