かってきままな日々
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 になってれば即座に処理されるんだけどな。