본문 바로가기
컴퓨터 관련/Linux || Unix

[GTK+] 5. GTK+ 이벤트

by _BlankSpace 2017. 6. 17.

 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/


궁금하신 점이 있으시거나, 수정해야할 점이 있다면 댓글 남겨주시기 바랍니다.


제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.

공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.


댓글