[gtk] g_signal_handler_is_connect()로 그냥 흘러갑니다. 문제 해결을 부탁..

assa의 이미지

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를 절대로 안 가르치리라..

keizie의 이미지

코드 안에 써두신 게 한 덩어리로 연결되어 있는 건가요? 그러면 당연히 if를 수행하고 아마도 참일 테니 ExtractFilePath가 연달아 실행되겠죠.

EmptyCallBack이라는 함수 안에 ExtractFilePath를 하면 되는 거 아닌가요?

void callback (...)
{
    ExtractFilePath (...)
}

int main (...)
{
    ...
    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), NULL);
    ...
}

ps. 자식에게는 gtkmm이나 pygtk를 가르치세요. :P

assa의 이미지

Quote:
코드 안에 써두신 게 한 덩어리로 연결되어 있는 건가요? 그러면 당연히 if를 수행하고 아마도 참일 테니 ExtractFilePath가 연달아 실행되겠죠.

EmptyCallBack이라는 함수 안에 ExtractFilePath를 하면 되는 거 아닌가요?

네.. 코드 안에 한덩어리로 되어 있어서 그냥 지나가 버리더라구요 ..ㅠㅠ

해결은 gtk_dialog_run()을 사용해서 해결했습니다.

gtk_dialog_run()으로 file selection dialog가 대기 상태로 되네요..
(이 함수를 몰라서 2일을 고생 고생했네요.. 회사서 욕 바가지로 먹을 듯 ㅠㅠ)

그런데, 궁금한 것이 gtk_dialog_run()의 return값이 response_id인데 일반적인 버튼(또는 클릭이 가능한 모든 widget)을 생성하고서 response_id를 매길 수 있을까요?

만약 이것이 가능하다면, 윈도우를 새로 생성하고 나서 그 윈도우를 control하기가 편하겠다는 생각이 드네요

keizie의 이미지

assa wrote:
gtk_dialog_run()을 사용해서 해결했습니다.

gtk_dialog_run()으로 file selection dialog가 대기 상태로 되네요.

도대체 어떤 동작을 하려는 건지 감이 안 옵니다. GtkDialog면 굳이 clicked 시그널을 관리할 일이 없을 텐데, 뭣 때문에 그러시나요? 뭔가 엉뚱한 짓을 하시는 것 같습니다.

assa wrote:
gtk_dialog_run()의 return값이 response_id인데 일반적인 버튼(또는 클릭이 가능한 모든 widget)을 생성하고서 response_id를 매길 수 있을까요?

만약 이것이 가능하다면, 윈도우를 새로 생성하고 나서 그 윈도우를 control하기가 편하겠다는 생각이 드네요

이건 또 무슨 말씀인가요? gtk_dialog_run()의 반환값은 GtkDialog에서 그렇게 정의했기 때문에 있는 겁니다. http://developer.gnome.org/doc/API/2.0/gtk/GtkDialog.html 에서 GtkResponseType을 읽어보세요.

그리고, 모든 창에 대해서 이런 일반적인 형태를 정의하기는 좀 어렵지 않나 싶습니다. GtkWindow는 GtkContainer의 일종일 뿐이며 그 안에 뭐가 들어가는지는 특별히 정해진 게 없습니다. libgnomeui에 포함된 GnomeApp 같은 상위 위젯을 쓰면 될 수도 있겠지만 요즘 이쪽은 거의 없어지는 추세죠.

각 버튼이나 위젯별로 다양한 시그널을 제공하니까 거기에 콜백을 걸어서 쓰는 걸로 충분할 겁니다.

코딩에 대한 도움말은 devhelp를 깔아서 참고하시고, 소스를 포함한 예제는 gtk-demo가 깔려있을 것이니 실행해서 살펴보시기 바랍니다.

assa의 이미지

Quote:
도대체 어떤 동작을 하려는 건지 감이 안 옵니다. GtkDialog면 굳이 clicked 시그널을 관리할 일이 없을 텐데, 뭣 때문에 그러시나요? 뭔가 엉뚱한 짓을 하시는 것 같습니다.

처음 제가 질문을 드릴때, file selection dialog를 생성하는 부분을 빠트려서 그런 것 같습니다.

Quote:

각 버튼이나 위젯별로 다양한 시그널을 제공하니까 거기에 콜백을 걸어서 쓰는 걸로 충분할 겁니다.

각 위젯별로 콜백을 걸어서 쓰려고 하니, 걸림돌이 너무나도 많더군요..ㅠㅠ

예를 들어 임의의 윈도우에서 콜백 -> 다른 윈도우 호출 - >콜백 -> 또 다른 윈도우 호출 -> 콜백 -> ... 이런 경우가 발생할 수도 있는데, 이는 const 또는 static변수의 압박과 말그대로 나 자신도 모르는 소스가 생길 것 같은 두려움이 들더군요.
(사실 signal 관련 함수를 제대로 알면 쉽겠지만, 이제 시작하는 거라, 머가 먼지 잘 모르겠더라구요. 튜토리얼을 봐도, 한번의 콜백으로 output을 출력하는 예제들 뿐이라..)

그래서 생각해본게 간단히 윈도우를 제어할 수 있는 방법인 gtk_dialog_run()같은 것이 필요했습니다. 그래서 gtk_dialog_run()의 return이 reponse값이라는 것때문에 질문을 드렸습니다.

그렇다면, 혹시 gtk_dialog_run()과 같이 윈도우를 대기(?), 묶어두는 함수가 있나요?
(표현이 적절한지 모르겠지만 gtk_dialog_run()으로 인해 return값이 나올때까지 하위의 소스를 실행하지 않고, 대기상태로 잡아두는 것과 같이, 그런 류의 함수가 있는지요?)

아니면 thread를 사용해야 하는 것인가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.