Я пытаюсь отправить и получить клиент-событие с помощью GtkWidget на платформе win32. Передающий код выглядит следующим образом:Как отправить асинхронно клиентское событие в GtkWidget?
GtkWidget *Wnd;
GdkNativeWindow Hnd =
#ifdef WIN32
GDK_WINDOW_HWND(Wnd->window);
#else
GDK_WINDOW_XWINDOW(Wnd->window);
#endif
GdkEvent *Event = gdk_event_new(GDK_CLIENT_EVENT);
// fill out Event params
gdk_event_send_client_message(Event, Hnd);
Получая код выглядит следующим образом:
static gboolean MyClientEvent(GtkWidget *widget, GdkEventClient *ev, MyWnd *Wnd)
{
// breakpoint here...
return TRUE;
}
GtkWidget *Wnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect( G_OBJECT(Wnd),
"client-event",
G_CALLBACK(MyClientEvent),
this);
gtk_widget_add_events(Wnd, GDK_ALL_EVENTS_MASK);
Я использовал Spy ++, чтобы увидеть сообщение послано, так что я знаю, что отправляющая сторона нормально. Однако принимающая сторона не получает клиент-событие. Я ожидал, что моя точка останова в обратном вызове вызовет ... но это не так.
Я даже не уверен, что GtkWindow может получить событие-клиент ... из прошлого опыта в X11. Я думал, что он почти такой же, как любой другой GtkWidget в этом отношении. Возможно, на платформе win32 это совсем другое. Но все же я бы хотел, чтобы это работало.
Я хотел бы, чтобы это работало асинхронно и поточно-безопасным образом, чтобы я мог отправлять события из рабочих потоков до потока графического интерфейса.
Почему вы отправляете четное через собственное окно вместо GtkWindow? Более новые версии Gtk не имеют соответствия 1: 1 между родными окнами и виджетами, вероятно, вы должны полностью придерживаться GdkWindows или даже GtkWidgets. Проблема, которая может вас укусить, состоит в том, что вы ожидаете, что все события из собственного окна будут переданы цепочке в GDK, но этого больше не происходит, см. Http://library.gnome.org/devel/gtk/ stable/gtk-migrating-ClientSideWindows.html – Spudd86
Да, я понимаю клиентские окна в концепции, но как отправить сообщение клиента в GtkWindow или GtkWidget? (в отличие от GdkNativeWindow) – fret
Я только что заметил gtk_propagate_event ... это то, что правильный метод использовать? – fret