[gtk] g_signal_handler_is_connect()로 그냥 흘러갑니다. 문제 해결을 부탁..
글쓴이: assa / 작성시간: 수, 2006/01/11 - 4:02오후
gulong handlerID= g_signal_connect( G_OBJECT(GTK_FILE_SELECTION(temp)->ok_button), "clicked", G_CALLBACK(EmptyCallBack), NULL ); g_signal_connect_swapped( G_OBJECT(GTK_FILE_SELECTION(temp)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), temp ); if(g_signal_handler_is_connected(G_OBJECT(GTK_FILE_SELECTION(temp)->ok_button), handlerID)){ g_message("check handler id\n"); ExtractFilePath(temp, (GtkWidget *)data); }
g_siganl_connect()후에 버튼을 눌러야만 g_signal_handler_is_connected()가 실행되는 거 아닌가요?
g_signal_connect()를 실행한 후(실제로 버튼을 click했을 때), g_signall_handler_is_connected()내의 ExtractFilePath() 실행하려면 어떤 함수를 써야 하는지요..
MFC 처럼 signal을 받도록 대기하는 그런 함수가 gtk에도 있는지도 가르쳐 주세요.
튜토리얼을 봐도 달랑 gtk_main()뿐이라, 멀 어떻게 해야할 지 막막합니다.
p.s. 내 자식에게는 gtk를 절대로 안 가르치리라..
Forums:
좀 자세히 설명해보시겠습니까?
코드 안에 써두신 게 한 덩어리로 연결되어 있는 건가요? 그러면 당연히 if를 수행하고 아마도 참일 테니 ExtractFilePath가 연달아 실행되겠죠.
EmptyCallBack이라는 함수 안에 ExtractFilePath를 하면 되는 거 아닌가요?
ps. 자식에게는 gtkmm이나 pygtk를 가르치세요. :P
ㅠㅠ 겨우(?) 이부분은 해결했습니다.
네.. 코드 안에 한덩어리로 되어 있어서 그냥 지나가 버리더라구요 ..ㅠㅠ
해결은 gtk_dialog_run()을 사용해서 해결했습니다.
gtk_dialog_run()으로 file selection dialog가 대기 상태로 되네요..
(이 함수를 몰라서 2일을 고생 고생했네요.. 회사서 욕 바가지로 먹을 듯 ㅠㅠ)
그런데, 궁금한 것이 gtk_dialog_run()의 return값이 response_id인데 일반적인 버튼(또는 클릭이 가능한 모든 widget)을 생성하고서 response_id를 매길 수 있을까요?
만약 이것이 가능하다면, 윈도우를 새로 생성하고 나서 그 윈도우를 control하기가 편하겠다는 생각이 드네요
Re: ㅠㅠ 겨우(?) 이부분은 해결했습니다.
도대체 어떤 동작을 하려는 건지 감이 안 옵니다. GtkDialog면 굳이 clicked 시그널을 관리할 일이 없을 텐데, 뭣 때문에 그러시나요? 뭔가 엉뚱한 짓을 하시는 것 같습니다.
이건 또 무슨 말씀인가요? gtk_dialog_run()의 반환값은 GtkDialog에서 그렇게 정의했기 때문에 있는 겁니다. http://developer.gnome.org/doc/API/2.0/gtk/GtkDialog.html 에서 GtkResponseType을 읽어보세요.
그리고, 모든 창에 대해서 이런 일반적인 형태를 정의하기는 좀 어렵지 않나 싶습니다. GtkWindow는 GtkContainer의 일종일 뿐이며 그 안에 뭐가 들어가는지는 특별히 정해진 게 없습니다. libgnomeui에 포함된 GnomeApp 같은 상위 위젯을 쓰면 될 수도 있겠지만 요즘 이쪽은 거의 없어지는 추세죠.
각 버튼이나 위젯별로 다양한 시그널을 제공하니까 거기에 콜백을 걸어서 쓰는 걸로 충분할 겁니다.
코딩에 대한 도움말은 devhelp를 깔아서 참고하시고, 소스를 포함한 예제는 gtk-demo가 깔려있을 것이니 실행해서 살펴보시기 바랍니다.
감사합니다..
처음 제가 질문을 드릴때, file selection dialog를 생성하는 부분을 빠트려서 그런 것 같습니다.
각 위젯별로 콜백을 걸어서 쓰려고 하니, 걸림돌이 너무나도 많더군요..ㅠㅠ
예를 들어 임의의 윈도우에서 콜백 -> 다른 윈도우 호출 - >콜백 -> 또 다른 윈도우 호출 -> 콜백 -> ... 이런 경우가 발생할 수도 있는데, 이는 const 또는 static변수의 압박과 말그대로 나 자신도 모르는 소스가 생길 것 같은 두려움이 들더군요.
(사실 signal 관련 함수를 제대로 알면 쉽겠지만, 이제 시작하는 거라, 머가 먼지 잘 모르겠더라구요. 튜토리얼을 봐도, 한번의 콜백으로 output을 출력하는 예제들 뿐이라..)
그래서 생각해본게 간단히 윈도우를 제어할 수 있는 방법인 gtk_dialog_run()같은 것이 필요했습니다. 그래서 gtk_dialog_run()의 return이 reponse값이라는 것때문에 질문을 드렸습니다.
그렇다면, 혹시 gtk_dialog_run()과 같이 윈도우를 대기(?), 묶어두는 함수가 있나요?
(표현이 적절한지 모르겠지만 gtk_dialog_run()으로 인해 return값이 나올때까지 하위의 소스를 실행하지 않고, 대기상태로 잡아두는 것과 같이, 그런 류의 함수가 있는지요?)
아니면 thread를 사용해야 하는 것인가요?
댓글 달기