2014-01-16 9 views
2

내 머리를 긁적 거리고 있습니다. 왜 코드가 한 번만 쓰는 것과 달리 3 회 콜백을 실행하는 이유는 무엇입니까?GtkWidget 이벤트가 여러 번 발생했습니다.

#include <iostream> 
#include <gtk/gtk.h> 

using namespace std; 

void on_draw(){ 
    cout << "drawing"<<endl; 
} 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *drgArea; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    drgArea = gtk_drawing_area_new(); 
// gtk_widget_set_redraw_on_allocate(drgArea, -1); 
    gtk_container_add(GTK_CONTAINER(window), drgArea); 
    gtk_widget_show_all(window); 
    g_signal_connect(drgArea, "expose-event", 
      G_CALLBACK(on_draw), NULL); 
    gtk_main(); 

    return 0; 
} 
+0

gtk + -2.xx가 맞나요? 주요 버전 간의 주요 차이점이있는 긴 버전 기록이있는 라이브러리와 관련된 질문을 할 때 항상 추가해야합니다. – drahnr

+0

나는 gtk + -2.24를 사용하고있다. –

+0

내 PC에 또 다른 gtk + -3xx가 있는데 내 코드를 바꿨을 때 콜백 카운트가 4로 뛰었다! –

답변

2

이것은 아마도 귀하의 작성기/창 관리자와 관련이 있습니다.

계피 [2.0.14]를 사용하면 응용 프로그램을 시작할 때 2이 다시 그려집니다 (gtk3/3.10.6/"draw"또는 gtk2/2.24.22/"expose-event"를 사용 하든지 상관없이).

+0

나는 이것처럼 생각했다. 아마도 "실현"과 "지도"같은 이벤트는 일반적인 노출 이벤트로 라우팅되지만 on_draw() 함수 내부에 getchar() 또는 sleep (1)을 추가하면 콜백 수가 하나만 감소한다. ! –

+0

이 우분투의 다른 버전에서 제대로 작동합니다, 내 개발 컴퓨터에서 여러 이벤트 대기열을 방지 할 수있는 방법이 있습니까 덕분에 –

+1

oldschool 2D non-composited windowmanager를 사용하려고 했습니까 - 나는 더러운 세부 사항에 익숙하지 않습니다. . – drahnr