首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将客户端事件异步发送到GtkWidget?

如何将客户端事件异步发送到GtkWidget?
EN

Stack Overflow用户
提问于 2010-06-15 08:34:35
回答 1查看 2.2K关注 0票数 1

我正在尝试在win32平台上使用GtkWidget发送和接收客户端事件。发送代码如下所示:

代码语言:javascript
复制
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);

接收代码如下所示:

代码语言:javascript
复制
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线程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-18 09:13:44

我有一个似乎有效的解决方案。它可能不是最优的,但它正在进行中。

代码语言:javascript
复制
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;
}

如果其他人有建设性的意见,我会根据需要添加/修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3041869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档