0. 포스팅 정리를 들어가기 전에.. |
이번 포스팅은 저에게 많은 혼란을 주었던 GTK+ 프로그래밍에서 시그널 부분을 다루어볼 생각입니다. 물론, 아주 심도있는 내용은 아닐 수도 있습니다.
하지만, 제가 프로그램을 구현하면서, 생각했던 내용들을 정리하는 것이므로, 혹시나 다른 분들은 좀더 빠르고 쉽게 시그널에 대해서 이해할 수 있으면 좋지 않을까 싶어서 이렇게 포스팅하는 것입니다.
그러므로, 혹시나 궁금한 점이 있으신 분들은 댓글을 남겨주시기 바랍니다.
1. 시그널의 형태. |
gulong g_signal_connect( gpointer* object,
const gchar* name,
GCallback func,
gpointer func_data );
- gulong형 리턴값 : callback함수를 확인하기 위한 꼬리표라고 생각하시면 되겠습니다. 따라서 시그널과 object에 대해 필요한 만큼의 많은 callback을 가질 수 있고, 그것들이 붙여져 있는 순서대로 각각 실행됩니다. 이때, 꼬리표는 우리가 리스트에서 callback을 제거할 수 있도록 도와줍니다.
- 첫번째 인자는 시그널을 발생시킬 widget 입니다.
- 두번째 인자는 잡아내고자 하는 시그널의 이름입니다.
- 세번째 인자는 시그널이 탐지되었을 때 호출할 함수입니다.
- 네번째 인자는 이 함수에 넘겨줄 정보입니다.
void callback_func( GtkWidget *widget,
... /* other signal arguments */
gpointer callback_data );
- 첫번째 인자는 시그널을 발생시킨 widget을 향한 포인터입니다.
- 마지막 인자는 g_signal_connect() 함수의 네번째 인자로 주어져 있는 정보에 대한 포인터입니다.
gulong g_signal_connect_swapped( gpointer* object,
const gchar* name,
GCallback func,
gpointer* callback_data );
- callback함수가 GTK object에 대한 포인터라는 단 하나의 인자를 이용한다는 점을 빼면 gtk_signal_connect()와 같습니다.
- 따라서 이때의 callback 함수는 다음과 같은 모양을 해야 할 것입니다.
void callback_func( gpointer callback_data,
... /* other signal arguments */
GtkWidget* widget);
- 따라서 callback 함수에 부가적인 데이터를 사용하려면 g_signal_swapped()가 아닌 g_signal_connect()를 사용해야 한다.
2. g_signal_connect와 g_signal_connect_swapped 의 차이점. |
g_signal_connect_swapped (button, "clicked", (GCallback) gtk_widget_hide,
other_widget);
static void button_clicked_cb (GtkButton* button, GtkWidget* other_widget)
{
gtk_widget_hide (other_widget);
}
g_signal_connect (button, "clicked", (GCallback) button_clicked_cb, other_widget);
- 이처럼 g_signal_connect는 추가로 사용자 함수를 만들어 정의를 해야하지만, g_signal_swapped 는 gtk_widget_hide처럼 미리 정의한 기능을 사용한다면 더 간단하게 코드를 작성할 수 있다.
3. 버튼 클릭으로 콘솔에 문자열 출력. |
이처럼 시그널에 대해서 공부를 해보았다면, 직접 시그널을 다뤄볼 수 있는 간단한 예제로 익숙해지는 것도 좋은 방법이라고 생각합니다.
예제는 http://zetcode.com/gui/gtk2/gtkevents/ buttonclick.c를 참고하면 되겠습니다.
g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(button_clicked),
NULL);
- 기본적인 signal을 등록하는 함수입니다.
- 첫 번째 인자는 signal이 일어나는 widget입니다.
- 두 번째 인자는 signal의 이벤트 종류입니다.
- 버튼의 시그널 종류는 다음과 같습니다.
- activate
- clicked
- enter
- leave
- pressed
- released
void button_clicked(GtkWidget* widget, gpointer data) {
g_print("clicked\n");
}
- g_print()는 gtk에서 콘솔에 메시지를 출력하는 함수입니다.
이상, 간단하게나마 GTK+에 대해서 정리를 마치겠습니다. 이 부분만 숙지하셔도, 간단한 GTK+ 프로그래밍을 하는 데 큰 어려움은 없으시리라 생각합니다. 이제 남은 건, 잘 알지 못하는 함수들을 찾는 일과, 그 함수들에 익숙해지는 일이라고 생각합니다.
저 역시도 GTK+를 언제 또 접할 지는 잘 모르겠습니다. 하지만, GUI 프로그래밍은 다 거기서 거기라고 생각합니다. 표현의 차이만 다를 뿐이지... 그러므로, GTK+도 아주 쓸모가 없지만은 않은,,, 오히려 GUI의 기본을 쌓는 데는 큰 도움이 될 수 있는 기술이 아닐까라고 조심히 생각해봅니다.
아무튼, 프로그래머분들.. 힘내시길 바랍니다. ㅠㅠ
예제는 https://developer.gnome.org/gtkmm-tutorial/stable/index.html.en 를 참고하였습니다.
해당 예제는 다음 사이트를 참고하시기 바랍니다.
https://github.com/blankspace-dev/C-/blob/master/
궁금하신 점이 있으시거나, 수정해야할 점이 있다면 댓글 남겨주시기 바랍니다.
제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.
공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.
'컴퓨터 관련 > Linux || Unix' 카테고리의 다른 글
티스토리 블로그 초대장 7장 나눕니다. (70) | 2017.08.02 |
---|---|
[unix/linux] 유닉스/리눅스 신호(signal) (0) | 2017.06.18 |
[GTK+] 4. GTK+ 컨테이너 Widget (2) | 2017.06.17 |
[GTK+] 3. GTK+ Layout 관리 (0) | 2017.06.17 |
[GTK+] 2. GTK+ 기본 예제 (0) | 2017.06.12 |
댓글