我正在尝试在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平台上会有所不同。但我仍然希望能够让它正常工作。
我希望它能以异步和线程安全的方式工作,这样我就可以将事件从工作线程发送到GUI线程。
发布于 2010-06-18 09:13:44
我有一个似乎有效的解决方案。它可能不是最优的,但它正在进行中。
struct GlibEventParams
{
GtkWidget *w;
GdkEvent *e;
};
static gboolean
GlibPostMessage(GlibEventParams *p)
{
GDK_THREADS_ENTER ();
gtk_propagate_event(p->w, p->e);
gdk_event_free(p->e);
delete p;
GDK_THREADS_LEAVE ();
return FALSE;
}
bool MySendEvent(GtkWidget *Wnd, GtkEvent *Event)
{
bool Status = false;
if (Event && Wnd)
{
GlibEventParams *p = new GlibEventParams;
p->w = Wnd;
p->e = gdk_event_new(GDK_CLIENT_EVENT);
*p->e = *Event;
Status = g_idle_add((GSourceFunc)GlibPostMessage, p) > 0;
}
else assert(!"No Event or Wnd");
return Status;
}如果其他人有建设性的意见,我会根据需要添加/修改。
https://stackoverflow.com/questions/3041869
复制相似问题