2013-01-11 2 views
6

하스켈의 gtk2hs 라이브러리를 사용하여 작은 GUI 응용 프로그램을 작성 중이며 현재 multiline text boxes으로 작업 중입니다. 사용자가 텍스트 상자 내에서 텍스트를 변경할 때 실행할 함수가 있지만 단추를 클릭하여 텍스트 상자를 활성화하지 않아도됩니다.사용자가 텍스트 입력을 중단 할 때 함수 실행

더 많은 방해와 처리가 필요한 기능 (그래픽을 그으므로 파일을로드하는 등) 때문에 사용자가 수행 할 때마다 실행하지 않기를 바랍니다. 변경 bufferChanged 신호가 텍스트 버퍼에 있습니까?)하지만 변경 사항 사이에 몇 초 동안 멈출 때. 자신의 업데이트 정책이 continuous or delayed로 설정 할 수 있습니다 방법 range widgets 유사 GTK에 뭔가가있는 경우

는 기본적으로 궁금하지만, 텍스트 상자에 대한

+2

wxHaskell에서 비슷한 일을 한 방법은 (설정 가능) 1 초 지연으로 설정된 Timer 개체를 사용하고 타이핑이 완료되면 초 단위로 지연되는 효과가있는 사용자 유형을 사용할 때마다 사용하도록 설정하는 것이 었습니다 . 나는 gtk를 포기 했으므로 익숙하지 않지만, [Graphics.UI.Gtk.General.General] (http : //)에서'timeoutAdd' 또는'timeoutAddFull'과'timeoutRemove'를 사용하여 비슷한 것을 할 수 있습니다. hackage.haskell.org/packages/archive/gtk/0.12.3/doc/html/Graphics-UI-Gtk-General-General.html). – AndrewC

+0

Haskell 포트에서 무엇이 호출되는지 알지 못하지만, 이것은 g_idle_add()가 무엇을위한 것입니까. – ptomato

+0

또는 (@ AndrewC의 제안에 따라) 최종 사용자 입력 시간을 기록하고 무거운 코드를 실행할시기를 결정하기 위해 정기적 인 제한 시간을 확인하십시오. – ergosys

답변

1

나는 하스켈 바인딩 만에 아무것도 몰라 plain C는 타임 아웃 GSource을 활용하여 구현하기가 쉽습니다.

제한 시간 전에 텍스트 뷰를 종료의 문제는 경과
#include <gtk/gtk.h> 

static guint source_id = 0; 

static gboolean do_stuff(gpointer user_data) 
{ 
    g_print("doing stuff...\n"); 
    return FALSE; 
} 

static void postpone(void) 
{ 
    if (source_id > 0) 
     g_source_remove(source_id); 
    source_id = g_timeout_add(1000, do_stuff, NULL); 
} 

int main(int argc, char **argv) 
{ 
    GtkWidget *window, *text_view; 
    GtkTextBuffer *text_buffer; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL); 

    text_view = gtk_text_view_new(); 
    gtk_container_add(GTK_CONTAINER(window), text_view); 

    text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)); 
    g_signal_connect(text_buffer, "changed", G_CALLBACK(postpone), NULL); 

    gtk_widget_show_all(window); 
    gtk_main(); 
    return 0; 
} 

하지만 여전히 열려 있습니다.