トップ «前の日記 最新 次の日記»

2022-01-05 (We) [長年日記]

_ bit25

pgtk。先日の問題をデバッグ中。

キーイベントが2回来る。 そのうち前者は im の filter が TRUE を返し、後者は FALSE を返す。

何が違うんだろう? とイベントをよく見てみたところ、 後者は state の bit25 が立っていることが判明。他は全く同じ。

bit25 って、↓これなんだけど…

 * @GDK_MODIFIER_RESERVED_25_MASK: A reserved bit flag; do not use in your own code

何だそりゃ…

gtkentry を使ったテストアプリでも作ってみようか…

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <time.h>
#include <sys/time.h>

static gboolean
key_press_event (GtkWidget *widget, GdkEvent *event, gpointer *user_data)
{
    {
        GdkEventKey *e = &event->key;
        struct timeval tv;
        gettimeofday(&tv, NULL);
        
        printf("%ld.%06ld %d %p %d %u %08x %u %d %s %d %d %d\n",
                tv.tv_sec, tv.tv_usec,
                e->type, e->window,
                e->send_event,
                e->time, e->state, e->keyval,
                e->length, e->string,
                e->hardware_keycode, e->group, e->is_modifier);
    }
    return FALSE;
}

int main(int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GtkWidget *top = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_show(top);

    GtkWidget *entry = gtk_entry_new();
    gtk_container_add(GTK_CONTAINER(top), entry);
    gtk_widget_show(entry);

    g_signal_connect (G_OBJECT (entry), "key-press-event",
            G_CALLBACK (key_press_event), NULL);

    gtk_main();
    return 0;
}

んー。大丈夫だなぁ。2回来るし、bit25 はこれでも立ってるけど、でも遅延はない。

_ わかったかもしれん

1回目の key press イベントを im filter に渡した際に、 もう一つの key press イベントが内部的に発生して、キューに溜まる(*1)。

このイベントは内部的なので、socket を監視してても気づけない。 socket を監視してるだけだと、次の何かのイベントが来てイベント処理を 開始する際に、あぁこんなイベントあるわ、っつって処理される。 それが概ね 200ms 後。

一箇所解らないのは、(*1) でキューに溜まったら g_main_context_pending が TRUE になるはずでは? ってところ。 これが TRUE になってれば即座に処理されるんだけどな。


編集 パスワード変更