2010-06-15 7 views
0

win32 플랫폼에서 GtkWidget을 사용하여 클라이언트 이벤트를 보내고 받으려고합니다. 클라이언트 이벤트를 비동기 적으로 GtkWidget으로 보내려면 어떻게해야합니까?

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

내가 메시지를 전송하기 볼 ++ 스파이를 사용, 그래서 송신 측이 괜찮 알고

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

받기 코드는 다음과 같습니다 보내는 코드는 다음과 같습니다. 그러나 수신 측에서는 클라이언트 이벤트를 수신하지 않습니다. 콜백에서 중단 점이 트리거 될 것으로 예상했지만 ... 그렇지 않습니다.

GtkWindow가 클라이언트 이벤트를 수신 할 수 있는지 확실치 않습니다 ... X11에서의 과거 경험에서 나는 그 점에서 다른 GtkWidget과 거의 같다고 생각했습니다. 어쩌면 win32 플랫폼에서는 다소 다릅니다. 하지만 여전히 나는이 일을 할 수 있기를 바랍니다.

비동기 적으로 스레드 안전 모드에서 작업 할 수 있도록 작업자 스레드에서 GUI 스레드까지 이벤트를 보낼 수 있습니다.

+0

왜 GtkWindow가 아닌 ​​기본 창을 통해 보내고 있습니까? 최신 버전의 Gtk는 네이티브 창과 위젯간에 1 : 1로 대응하지 않으므로 GdkWindows 또는 GtkWidgets에만 전적으로 의존해야합니다. 물어 보는 문제는 네이티브 윈도우의 모든 이벤트가 GDK의 체인으로 전달되기를 기대하지만 더 이상 발생하지 않는다는 것입니다. http://library.gnome.org/devel/gtk/을 참조하십시오. stable/gtk-migrating-ClientSideWindows.html – Spudd86

+0

그래, 클라이언트 사이드 윈도우를 이해하고 있지만 클라이언트 메시지를 GtkWindow 또는 GtkWidget에 보내려면 어떻게해야합니까? (GdkNativeWindow와 반대 됨) – fret

+0

방금 ​​gtk_propagate_event ...를 사용하는 것이 올바른 방법인가요? – fret

답변

0

해결 방법이 있습니다. 그것은 최적이 아니지만 볼 파크에 있습니다.

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

다른 사람이 건설적인 의견을 갖고있는 경우 필요에 따라 추가/수정하겠습니다.

+0

'gtk_main_do_event()'http://library.gnome.org/devel/gtk/stable/gtk-General.html#gtk-main-do-event – Spudd86

+0

또한 http://library.gnome.org/devel/을 참조하십시오. gobject/stable/signal.html # 신호 방출 – Spudd86

+0

gtk_propagate_event 대신 gtk_main_do_event를 호출해야한다고 말하는가? 그 대신 GtkEvent 구조체 대신 손으로 GtkWidget 포인터를 설정해야한다는 것을 의미합니다 ... 내가 할 수있는 일. gtk_main_do_event가 위젯 포인터를 얻는 곳인가요? – fret

관련 문제