Как я могу асинхронно отправить клиентское событие в GtkWidget? - PullRequest
0 голосов
/ 15 июня 2010

Я пытаюсь отправить и получить клиентское событие, используя GtkWidget на платформе win32.Код отправки выглядит следующим образом:

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 все по-другому.Но все же я бы хотел, чтобы это работало.

Мне бы хотелось, чтобы это работало асинхронно и поточно-ориентированным образом, чтобы я мог отправлять события из рабочих потоков в графический интерфейснить.

1 Ответ

0 голосов
/ 18 июня 2010

У меня есть решение, которое, кажется, работает. Это может быть неоптимально, но оно находится в парке мячей.

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;
}

Если у кого-то есть конструктивные комментарии, я буду добавлять / изменять его по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...