Events 这个GTK应用程序每隔一秒左右就会捕获什么周期性事件和源(X服务器生成?)?

Events 这个GTK应用程序每隔一秒左右就会捕获什么周期性事件和源(X服务器生成?)?,events,gtk,xserver,Events,Gtk,Xserver,下面只包含一个按钮,单击该按钮可以在控制台上生成输出。输出只是本地循环计数器和全局变量的值 编辑:重点是代码是为了调查gtk_main_交互如何工作;所以我不想把这个调用包装在gtk_事件_挂起循环中。该守则纯属教学性质 代码中奇怪的部分是,与单击的事件处理程序相反,有一个循环调用gtk_main_迭代。如果没有挂起的事件,gtk_main_迭代应该被阻止。然而,玩这个小应用程序表明,GTK主循环每秒都会捕捉到一些事件,即使什么都没有发生。要看到这一点,请尝试单击并释放按钮,然后放开鼠标,而不移

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

编辑:重点是代码是为了调查gtk_main_交互如何工作;所以我不想把这个调用包装在gtk_事件_挂起循环中。该守则纯属教学性质

代码中奇怪的部分是,与单击的事件处理程序相反,有一个循环调用gtk_main_迭代。如果没有挂起的事件,gtk_main_迭代应该被阻止。然而,玩这个小应用程序表明,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;
}

这段代码可能是教学性的,但它完全被破坏了,甚至一点也不习惯:

GtkButton::Clicked信号不是由窗口系统发出的:它完全由GtkButton本身合成;它取决于在按钮按下事件后,当指针仍在发起按下的GTK按钮内时,接收到按钮释放事件;X11没有在这些语义之内或之外单击的概念


这个例子基本上没有演示关于事件流的任何内容,您可以在X11下获得,也可以不获得。如果要查看事件流,可以在启用调试消息的情况下编译GTK+。/configure-enable debug=yes,并在运行应用程序之前设置GDK_debug环境变量。GTK+将打印它接收到的每个X事件的详细信息,包括事件类型。

代码上有两条注释:a您不应该使用g_slice_new分配数据,除非您有大量sizeofData分配,因为在这种情况下,您使用的内存超过了需要。另外,你不需要在程序关闭前释放数据,操作系统会为你这样做。如果它做了我希望它做的事情,它怎么会完全崩溃呢?另外,编译的代码并没有完全被破坏,它的输出应该是可以理解的。我不知道这里的惯用语是什么意思。此外,Xlib也知道按钮按下事件。我想我可以尝试启用调试,但我没有使用configure,我可以试试。我的问题非常直截了当:“是什么导致了这些事件?”它将有一个完全有效的单句式答案,我不明白你怎么能说这个例子基本上没有演示任何关于事件流的内容。是的。
gcc -Wall -Wextra -Wconversion -pedantic `pkg-config --cflags --libs gtk+-2.0` events.c -o events