-2

以下は、クリックするとコンソールに出力を生成できるボタンだけで構成されています。(出力は、ローカル ループ カウンターとグローバル変数の値です。)


編集: ポイントは、コードが gtk_main_interation() がどのように機能するかを調査することです。そのため、その呼び出しを gtk_events_pending() ループにラップしたくありません。このコードは純粋に教育的なものです。


コードの奇妙な部分は、「クリックされた」イベントハンドラーの代わりに、gtk_main_iteration() を呼び出すループがあることです。保留中のイベントがない場合、gtk_main_iteration はブロックされるはずです。それでも、この小さなアプリをいじってみると、GTK のメイン ループは、何も起きていない場合でも、1 秒ごとに何らかのイベントをキャッチしていることがわかります。これを確認するには、ボタンをクリックして離し、マウスを放します (カーソルをまったく動かさずに)。

おそらく、このイベントは X サーバー (または GTK メイン ループ) によって、ある種のタイミングとして生成されています。このイベントが何と呼ばれているのかわからず、Google 検索に失敗しています。

#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
4

1 に答える 1

0

このコードは教育的かもしれませんが、完全に壊れており、少し慣用的ではありません。

GtkButton::Clicked信号はウィンドウ システムによって発行されません。それ自体で完全に合成されますGtkButtonbutton-release-eventしばらくするbutton-press-eventと、ポインターがGtkButtonプレスを開始した の範囲内にあるかどうかに依存します。X11 には「クリック」の概念がありません (これらのセマンティクスの内外で)。

この例は、基本的に、X11 で得られるかもしれないし、得られないかもしれないイベント ストリームについて何も示していません。イベント ストリームを表示するには、デバッグ メッセージを有効にして ( ./configure --enable-debug=yes) GTK+ をコンパイルGDK_DEBUGし、アプリケーションを実行する前に環境変数を設定します。GTK+ は、受信した各 X イベントの詳細 (イベント タイプを含む) を出力します。

于 2013-03-27T20:03:47.490 に答える