我有以下应用程序。

#include <FWWindow.h>
#include <FWApplication.h>

int main(int /*argc*/, char */*argv*/[])
{
    FWApplication::Initialize();
    FWWindow *win = new FWWindow(800, 600);
    win->Show();
    FWApplication::Run();
    delete win;
}

当我运行它时,它会卡在XNextEvent()上,因为它会阻塞,直到从XServer获取下一个事件为止。我想知道的是基于以下代码,为什么在我调用XMapWindow()之后XNextEvent没有得到ConfigureNotify或Expose事件;我已经检查了一下,以确保我的应用程序根据IDE的监视窗口中的地址提供正确的Display。我缺少什么让窗口出现?
Initialize() does the following

--
FWApplication *FWApplication::Initialize()
{
    if (!_instance)
    {
        _xDisplay = XOpenDisplay(NULL);
        if (_xDisplay == NULL)
            throw "Failed to get XDisplay";
        _initialized = true;
        _instance = new FWApplication(); // Calls an empty ctor
    }
    return _instance;
}
FWWindow *win = new FWWindow(800, 600); does the following

--
FWWindow::FWWindow(int width, int height) :
        clientWidth(width),
        clientHeight(height)
{
    // These are all member variables
    xDisplay = FWApplication::GetMainDisplay();
    xScreen = DefaultScreen(xDisplay);
    xDepth  = DefaultDepth(xDisplay, xScreen);
    xVisual = DefaultVisual(xDisplay,xScreen);
    xAttributes.background_pixel = XWhitePixel(xDisplay, xScreen);
    xAttributes.border_pixel = XBlackPixel(xDisplay, xScreen);
    xAttributes.override_redirect = 0;
    xWindow = XCreateWindow(
                             xDisplay,
                             RootWindow(xDisplay, xScreen),
                             0, 0,
                             width, height,
                             0,
                             xDepth,
                             InputOutput,
                             xVisual,
                             CWBorderPixel | CWColormap | CWEventMask,
                             &xAttributes
                           );

      XSetStandardProperties(
                             xDisplay,
                             xWindow,
                             "glxsimple",
                             "glxsimple",
                             None,
                             NULL,
                             0,
                             NULL
                            );
}
win->Show(); does the following

--
void FWWindow::Show()
{
    XMapWindow(xDisplay, xWindow); // xWindow and xDisplay defined in ctor above
}
And finaly FWApplication::Run(); does the following

--
int FWApplication::Run()
{
    if (!_initialized)
        return -1;
    static bool run = true;
    static Display *lDisplay = _xDisplay;
    XEvent xEvent;
    while (run)
    {
        do
        {
            XNextEvent(lDisplay, &xEvent);
            switch (xEvent.type)
            {
            case ConfigureNotify:
                {
                    unsigned int w = xEvent.xconfigure.width;
                    unsigned int h = xEvent.xconfigure.height;
                    // Do something to main widget
                }
            case Expose:
                break;
            }
        } while (XPending(GetMainDisplay()));
    }
    return EXIT_SUCCESS;
}

最佳答案

您没有在窗口的属性中指定事件掩码,因此XNextEvent()不会报告任何事件。您应该编写如下内容:

xAttributes.background_pixel = XWhitePixel(xDisplay, xScreen);
xAttributes.border_pixel = XBlackPixel(xDisplay, xScreen);
xAttributes.override_redirect = 0;
xAttributes.event_mask = StructureNotifyMask  // for ConfigureNotify
                       | ExposureMask;        // for Expose

10-04 21:57