什么周期性事件和源(X服务器生成?)是这个GTK应用程序每秒钟捕获一次?

时间:2013-03-27 08:52:34

标签: events gtk xserver

以下内容仅包含一个按钮,单击该按钮可在控制台上生成输出。 (输出只是本地循环计数器和全局变量的值。)


编辑:重点是代码是调查gtk_main_interation()如何工作;所以我不想围绕gtk_events_pending()循环包装该调用。该代码本质上是纯粹的教学法。


代码的奇怪部分是“clicked”事件处理程序,而是一个调用gtk_main_iteration()的循环。如果没有待处理的事件,gtk_main_iteration应该阻止。然而,玩这个小应用程序表明,即使没有发生任何事情,GTK主循环也会每隔一秒左右捕捉一些事件。要看到这一点,只需单击并释放按钮,然后释放鼠标(完全不移动光标)。

据推测,这个事件是由X服务器(或GTK主循环)生成的某种计时事件。我不知道这个事件被称为什么,谷歌搜索让我失望。

#include <gtk/gtk.h>
#include <glib.h>
#include <gmp.h>
#include <unistd.h>

#define UNUSED(x) (void)(x)

typedef struct _Data {
    GtkWidget *window1,
              *button1;
} Data;

int g=0;

void on_button1_clicked(GtkWidget *widget, Data *data) {
    int l=0;
    UNUSED(widget);
    UNUSED(data);

    for(l=0;l<10;++l) {
        gtk_main_iteration();
        printf("l=%d g=%d|",l,g++);
        fflush(stdout);
    }
    printf("\n\n");

}

int main (int argc, char *argv[]) {
    Data *data;

    gtk_init(&argc, &argv);

    data=g_slice_new0(Data);

    /* add widgets and objects to our structure */

    data->window1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(data->window1),250,250);
    data->button1=gtk_button_new_with_label("Start");
    gtk_container_add(GTK_CONTAINER(data->window1),GTK_WIDGET(data->button1));

    gtk_signal_connect(GTK_OBJECT(data->window1), "delete-event",
                       gtk_main_quit, NULL);
    gtk_signal_connect(GTK_OBJECT(data->button1), "clicked",
                           G_CALLBACK(on_button1_clicked), NULL);

    gtk_widget_show_all(GTK_WIDGET(data->window1));

    gtk_main();

    /* Don't forget to free the memory! */
    g_slice_free(Data, data);

    return 0;
}

我正在编译

gcc -Wall -Wextra -Wconversion -pedantic `pkg-config --cflags --libs gtk+-2.0` events.c -o events

1 个答案:

答案 0 :(得分:0)

这段代码可能是教学法,但它完全破碎了,甚至不是远程惯用法:

窗口系统不发出GtkButton::Clicked信号:它由GtkButton本身完全合成;这取决于在button-release-event之后收到button-press-event,而指针仍然在发起新闻的GtkButton内; X11没有“点击”的概念(在这些语义之内或没有这些语义)。

此示例基本上没有说明您在X11下可能获得或未获得的事件流。如果要查看事件流,可以在启用调试消息(./configure --enable-debug=yes)的情况下编译GTK +,并在运行应用程序之前设置GDK_DEBUG环境变量。 GTK +将打印它收到的每个X事件的详细信息,包括事件类型。