2009-10-12 7 views
3

을 방출하고 방출 여기GTK 신호를 생성하고 GTK 신호를 내가 만들려고하고

gtk_signal_emit_by_name(referenceToMyWindow, "child-finished"); 

을 그리고 것은 처리 내 코드입니다 신호 :

void MyCallback(GtkWidget *w, GdkEvent *e) 
{ 
    // handler code here 
} 

나는 다음과 같은 오류가 코드를 실행하면 :

GLib-GObject-CRITICAL **: g _closure_ invoke: assertion `closure->marshal || closure->meta_marshal' failed

나는 그것이 g_signal_new 함수에 마샬를 통과 함께 할 수있는 뭔가가 알고 있지만, 나는 마샬이 무엇인지 모른다, 나는 the documentation을 이해하지 수 있으며, 예를 들면 온라인 극소수입니다. 내 신호를 선언하고 연결하려면 어떻게해야합니까?해야 신호 처리기

g_signal_new("child-finished", 
      G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 
      0, NULL, NULL, 
      g_cclosure_marshal_VOID__BOXED, 
      G_TYPE_NONE, 1, GDK_TYPE_EVENT); 

매개 변수 : 당신은 유형 검사를 원하는 경우,

g_signal_new("child-finished", 
      G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 
      0, NULL, NULL, 
      g_cclosure_marshal_VOID__POINTER, 
      G_TYPE_NONE, 1, G_TYPE_POINTER); 

또는 : 코드가 아마해야하므로

답변

3

G 객체 라이브러리, 일부 builtin marshallers 제공 present (객체 자체가 함축 됨)이므로 포인터 (첫 번째 예와 같이) 또는 boxed 유형 (두 번째 예와 같이)을 지정해야합니다.

필요한 마샬 러가 내장 된 마샬 러에 없으면 glib-genmarshal 유틸리티를 사용하거나 직접 직접 코딩 할 수 있습니다 (매우 간단합니다. glib-genmarshal의 출력을 체크 아웃하는 것).

+0

GBoxed 형식은 형식 검사가 없으며 형식 정보가없는 C 구조체의 래퍼 일뿐입니다. G_TYPE_POINTER와 G_TYPE_BOXED의 실제 차이는 후자의 경우 GdkEvent 구조체의 _copy_가 사용된다는 것입니다. 이벤트가 수정되지 않은 경우에는 차이가 없지만 수정할 필요가있는 경우 G_TYPE_POINTER를 사용하십시오. – ntd

관련 문제