6

Haskell のgtk2hsライブラリを使用して小さな GUI アプリケーションを作成しており、現在その中の複数行のテキスト ボックスを操作しています。ユーザーがテキストボックス内のテキストを変更したときに実行したい機能がありますが、ボタンをクリックしてアクティブにする必要はありません。

さらに、それはかなり侵入的で処理集約的な機能 (グラフィックスの描画、ファイルのロードなど) であるため、ユーザーが変更を行うたびに起動しないようにしたいと思います(おそらく、テキスト バッファーのbufferChangedシグナルで実行できます)。推測ですか?) しかし、変更の間に数秒間停止すると.

基本的に、範囲ウィジェットが更新ポリシーをcontinuousまたはdelayedに設定できる方法に類似した何かがgtkにあるかどうか疑問に思っていますが、テキストボックスの場合

4

1 に答える 1

1

Haskellバインディングについては何も知りませんが、プレーン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;
}

ただし、タイムアウトが経過する前にTextViewを終了する問題は未解決のままです。

于 2013-01-13T11:49:37.970 に答える