어쩌라구..?? ㅡㅡa..

Posted
Filed under Linux/programming
오늘도 또 겁나게 삽질했다. 아.. 힘들다..

glade-3를 이용해서 UI를 만들고 libglade를 이용해서 띄우려고 할때
메뉴얼의 Basic 항목대로 프로그램 만들어 놓으면
각 위젯의 realize 이벤트가 발생하지 않는다.
다른 이벤트들은 잘 뜨는데 realize 이벤트만 발생하지 않는다.

realize 이벤트 핸들러에 프로그램 초기화 코드가 들어있는 경우,
당연히 프로그램이 뜨지 않고 죽어버린다. 왜냐고? ㅡㅡ?
이벤트 핸들러 코드가 호출되지 않기 때문이다.

realize 이벤트 핸들러가 호출되지 않는 경우를 살펴보면,
toplevel 위젯의 visible(한글로 '보임') 속성이 yes로 되어있는 경우이다.
properties->common 탭에 보면 있다.

기본으로 glade-3에서 UI를 만들다보면
toplevel 위젯을 만들었을때 기본으로 visible 속성이 no이다.
다른 위젯들은 기본으로 모두 yes가 되어있는데 말이다.
그래서 정작 프로그램을 실행시켰을때
에러메세지가 없는데 아무런 화면이 나오지 않는다.
그래서 다시 glade-3에서 visible속성을 yes로 바꾸고 저장하면 UI가 나온다.

그것이 문제였던 것이다.
메뉴얼의 예제 코드를 보자.
int main(int argc, char *argv[]) {
GladeXML *xml;

gtk_init(&argc, &argv);

/* load the interface */
xml = glade_xml_new("filename.glade", NULL, NULL);

/* connect the signals in the interface */
glade_xml_signal_autoconnect(xml);

/* start the event loop */
gtk_main();

return 0;
}
코드를 보면,
너무도 명백하게 glade_xml_new 함수가 호출되고
glade_xml_signal_autoconnect 함수가 호출된다.

나는 인터넷에서 답을 찾을때까지 저걸 보고서도
왜 이벤트 핸들러가 호출되지 않았는지 몰랐다.
답은 간단하다. UI가 생성된 후에 이벤트 핸들러가 연결되기 때문이다.

glade-3에서 visible 속성이 yes인 위젯들은
glade_xml_new 함수가 리턴될때 이미 모두 디스플레이 되어 있다.
realize 이벤트는 최초 디스플레이될때 발생하는데
벌써 UI가 그려졌으므로 이미 이벤트는 발생했고
그 뒤에 이벤트 핸들러가 등록되므로 당연히 호출되지 않는것이다.
이런 내용을 메뉴얼에서는 찾지 못했다. 나는.

내가 만든 예제 코드를 다시 보자.
int main(int argc, char *argv[]) {
GladeXML *xml;

gtk_init(&argc, &argv);

/* load the interface */
xml = glade_xml_new("filename.glade", NULL, NULL);

/* connect the signals in the interface */
glade_xml_signal_autoconnect(xml);

/* show main window */
gtk_widget_show(glade_xml_get_widget(xml, "window1"));

/* start the event loop */
gtk_main();

return 0;
}
굵게 표시된 부분이 내가 추가한 코드이다.
함수 인자의 "window1"은 glade-3에서 정해준 윈도우 이름으로 바꾸면 된다.
그냥 아무것도 없는 상태에서 윈도우 위젯 만들면 저 이름으로 되길래 넣은것 뿐이다.

코드를 저렇게 수정하고 실행시키면 이벤트가 정상적으로 발생하는것을 볼 수 있다.

아.. 힘들다.
잠좀 자고 싶다.
그래도 할일이 너무나 밀려 있어서 잘 수가 없다. ㅜㅜ
2007/12/17 11:39 2007/12/17 11:39