2013-02-11 2 views
0

프로그램이 처음 실행되면 print 문에 포인터에 해당하는 유효한 16 진 코드가 인쇄됩니다. 그러나 화면을 클릭하면 handleClick 메서드가 '클릭 된'콜백을 통해 호출되며 0x0이 화면에 인쇄됩니다. 어떻게 된 거예요? 왜 내 보드 객체가 갑자기 null이됩니까?GTK 콜백에 인수를 전달할 수 없습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <gtk/gtk.h> 
#include "board.h" 

void printBoard(Board *board); 
void handleClick(GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer data); 

    gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data) 
    { 
    Board *temp = (Board *)data; 
    printf("%p\n",temp); 
    return TRUE; 
    } 

    void handleClick (GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer data) 
    { 
    Board *temp = (Board *)data; 
    printf("%p\n",temp); 
    } 

    void start(Board *newBoard) 
    { 
     GtkWidget *window; 
     GtkWidget *da; 
     GtkWidget *frame; 

     window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
     char string[40]; 
     snprintf(string, sizeof(string), "Connect %d-%d",newBoard->k,newBoard->n); 

     gtk_window_set_default_size (GTK_WINDOW(window), 400, 400); 
     gtk_window_move(GTK_WINDOW(window), 100, 100);  
     g_signal_connect (GTK_WINDOW(window), "destroy", G_CALLBACK (gtk_main_quit), NULL); 

     da = gtk_drawing_area_new(); 
     gtk_widget_set_size_request (da, 500, 500); 

     frame = gtk_frame_new (NULL); 
     gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); 
     gtk_container_add (GTK_CONTAINER (window), frame); 

     gtk_container_add (GTK_CONTAINER (frame), da); 

     gtk_widget_set_events (da, gtk_widget_get_events (da) 
        | GDK_BUTTON_PRESS_MASK); 

     g_signal_connect (da, "draw", 
       G_CALLBACK (draw_cb), newBoard); 

     g_signal_connect (da, "button-press-event", 
       G_CALLBACK (handleClick), newBoard); 

     gtk_widget_show_all (window); 
    } 

답변

1

button-press-event 신호 처리기의 원형은 다음 reference manual에 따른 것이다.

gboolean user_function (GtkWidget *widget, 
         GdkEvent *event, 
         gpointer user_data) 

당신이 handleClick 기능 data에서 cairo_t *cr 매개 변수를 제거하면 괜찮을 것입니다.

0

Szilard가 말한 것처럼 handleClick 함수에 잘못된 프로토 타입을 사용하고 있습니다.

gboolean user_function (GtkWidget *widget, 
         GdkEvent *event, 
         gpointer user_data) 

당신의 실수를 해결하려면, 당신이 필요합니다 :

  • cairo_t *cr 매개 변수를 제거

    button-press-event 신호 처리기는 다음과 같은 프로토 타입을 가지고있다. 그것은 data의 값을 받았습니다.

  • GdkEvent *이다 event 유형
  • 하지 GdkEventButton * 부울 보이드없는 리턴 값을 수정, 수정 및 이벤트의 전달인지 아닌지 판단하는 것이 중요하다.
+1

'GdkEvent'를 고칠 필요가 없습니다 : 서로 다른 이벤트 구조체의 합집합이며'GdkEventButton' 중 하나입니다. – ntd

관련 문제