본문 바로가기
오픈소스 읽기 (OLD)/리눅스 어플리케이션 만들기 - Gtk4

2. Gtk 프로그래밍 개념 잡기

by 커널패닉 2021. 4. 17.
반응형

www.kernelpanic.kr/category/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4%20%EC%9D%BD%EA%B8%B0/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90%EC%84%9C%20%EA%B0%80%EC%9E%A5%20OOO%ED%95%9C%20GUI%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%20-%20GTK

 

'오픈소스 읽기/리눅스에서 가장 OOO한 GUI 라이브러리 - GTK' 카테고리의 글 목록

 

www.kernelpanic.kr

2020년 12월 16일에 Gtk4가 릴리즈 되었다. 기존 Gtk3 대비 눈에 띄는 큰 변화 대신, 최적화와 GPU 가속을 통한 성능 향상과, 몇 가지 위젯 추가 등의 변화들이 었었다. 눈에 띄는 큰 변화가 없었다는 것은 사용자의 측면이고, Gtk 라이브러리 개발자들 입장에서는 꽤나 많은 변경사항들이 있었다.

출처: Gtk 공식 블로그(https://blog.gtk.org/files/2020/11/gtk4-changes-1.png)

이번 토픽은 Gtk4를 기준으로 작성하려고 한다. Gtk3는 개인 프로젝트랑 회사 사이드 프로젝트로 몇 번 사용해 본 경험이 있는데, Gtk4는 이번 기회에 사용해 봐야겠다. 그래도 Gtk3 개발 경험이 있고, 최대한 Gtk 공식 문서와 Gtk 공식 블로그를 참조하면서 포스팅을 할 계획이니, (아마도...) 아주 잘못된 소리는 없을 것이다.

 

2.1 Gtk 주요 개념들

이번 절에서는 Gtk의 주요 개념 - 위젯, 시그널, 콜백 - 에 대해서 다룬다. 만약에 GUI 프로그래밍이 처음인 독자라면, 앞으로의 이해를 돕기 위해서 천천히 읽어보는 것을 추천한다. 이전에 Qt나 Java Swing, 안드로이드 앱 등 GUI 프로그래밍을 경험해 본 독자라면, 스킵하거나 가벼운 마음으로 훑어보면 된다.

 

2.1.1 위젯

위젯은 버튼이나, 텍스트 창과 같은 컴포넌트들을 의미한다. 일반적으로 Gui 프로그램들은 여러 종류의 위젯의 집합으로 구성되어 있고, Gtk 역시 마찬가지이다. 예를 들어서 위의 이미지는 MenuBar와 SearchEntry, Calendar 위젯을 조합해서 만들었다. Gtk는 glade라는 UI 구성 툴도 제공하기 때문에, Drag & Drop으로 쉽게 어떤 위젯을 어떻게 배치할지 구성할 수 있다.

 

Gtk에서 제공하는 위젯에 대한 정보는 아래에서 확인 가능하다.

developer.gnome.org/gtk4/stable/ch08.html

 

Widget Gallery: GTK 4 Reference Manual

 

developer.gnome.org

아울러 Gtk에는 GtkWidget이라는 객체가 있고, 앞서말안 MenuBar, SearchEntry, Calendar 같은 위젯들은 모두 이 GtkWidget을 상속받는다. 이에 대해서는 아래에 있는 "2.2 위젯 계층도"에서 자세히 다룬다.

 

2.1.2 시그널

리눅스 시스템 프로그래밍에는 시그널이 있다. 리눅스 시그널은 다른 프로세스에 신호를 보내서 특정 동작을 수행하게 하는 역할을 한다. Gtk에서의 시그널도 비슷한 개념이다. 위젯(혹은 앱)에 시그널을 보내면, 위젯은 해당 동작을 수행한다. 예를 들어서 어플리케이션 윈도우에서 우상단에 있는 (혹은 좌상단에 있는) 'x'를 클릭하면 어플리케이션이 종료된다. 'x' 버튼을 클릭하면, 어플리케이션에는 "destroy" 시그널이 전달된다. 그리고 어플리케이션은 사전에 정의된 바에 따라서 destroy 시그널을 처리한다. 즉 종료 프로세스를 실행한다.

2.1.3 콜백

위키백과에서는 콜백을 다음과 같이 정의하고 있다.

(콜백이란) 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.

콜백 함수를 활용하면, 앞으로 특정 이벤트가 발생했을 때, 실행할 동작을 사전에 정의할 수 있다. Gtk에서는 콜백을 시그널과 연동해서 사용한다. 대표적으로 시그널과 콜백을 같이 활용하는 예시로 버튼이 있다. 사전에 콜백 함수 - 예를 들어서 버튼의 텍스트가 변경되는 - 를 버튼의 "clicked" 시그널에 등록해 둔다. "clicked" 시그널은 이름 그대로 마우스 등으로 버튼을 클릭하면 발생하는데, 즉 마우스로 버튼을 클릭하면 버튼의 이름이 바뀌게 된다. 콜백함수를 활용하는 보다 자세한 설명은 이어지는 포스트 들에서 자세히 다루도록 할 예정이다.

 

2.2 위젯 계층(Hieracyhierarchy)

다양한 버튼 위젯들

Gtk는 객체지향적인 설계를 따르고 있다. 따라서 비슷한 기능을 가진 위젯들은 상위 위젯을 상속받아서 사용하곤 한다. 예를 들어서 ToggleButton은 일반 Button 위젯을 상속받는다. 따라서 Button이 가지고 있는 특징들(ex. 클릭 가능)을 공유하고 있다. 대부분의 위젯들은 이름 규칙과 용도를 통해서 관계를 유추할 수 있기 때문에 별도로 위젯 계층을 공부할 필요는 없다고 생각한다.

다만 위젯 계층에 대해서 좀 더 자세히 알아보고자 하는 독자들을 위해서 링크를 남긴다.

developer.gnome.org/gtk4/stable/ch07.html

 

Object Hierarchy: GTK 4 Reference Manual

 

developer.gnome.org

2.3 Gtk 예제 코드들

앞으로 2~3개의 포스트를 통해서 Gtk로 GUI 프로그래밍을 하는 방법에 대해서 다룰 예정이다. 하지만 한정된 포스트에서 모든 위젯들 및 테크닉들 다룰 수는 없다. 내 경우에도 Gtk 프로그래밍을 하다가 막히면 구글 검색을 해보고는 하는데, 몇몇 사용빈도가 낮은 위젯은 구글에도 사용 예가 잘 나와있지 않은 경우들이 있다. 그런 경우 gtk4-demo 프로그램을 참조하면 큰 도움이 된다. (물론 gtk3-demo도 있다.)

아래는 실제 gtk4-demo 프로그램의 예시이다. 왼쪽에는 GUI 프로그래밍을 하면서 맞딱드릴 다양한 문제들에 대한 리스트가 있고, 오른쪽에는 간단한 설명과 함께 소스코드가 제공된다. 그리고 왼쪽의 리스트를 더블클릭하면, 가운데 있는 창과 같이 소스코드를 컴파일 한 예제 프로그램도 볼 수 있다.

gtk4-demo 예제

반응형