我正在使用Haskell的gtk2hs库编写一个小型GUI应用程序,目前正在使用其中的多行文本框。我有一个功能,我想运行时,用户使更改文本框内的文本,但不希望他们不得不点击一个按钮来激活它。
此外,因为它是一个相当侵入性和处理密集的函数(它绘制图形,加载文件等),我希望它不是在用户使任何更改时(这可能是用文本缓冲区中的bufferChanged信号完成的,我猜?),而是当它们在更改之间停止几秒钟时。
基本上,我想知道gtk中是否有类似于范围小部件可以将其更新策略设置为连续或延迟的方式,但对于文本框
我对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的问题仍然存在。