Блокировка XNextEvent при запуске приложения - PullRequest
2 голосов
/ 19 февраля 2012

У меня есть следующее приложение.

#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.То, что я хотел бы знать, основано на приведенном ниже коде, почему XNextEvent не получает события ConfigureNotify или Expose после того, как я вызываю XMapWindow();Я проверил, чтобы убедиться, что в моем приложении указаны правильные значения Display на основе адреса в окне просмотра моей среды IDE.Чего мне не хватает, чтобы открыть окно?


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

1 Ответ

2 голосов
/ 19 февраля 2012

Вы не указываете маску события в атрибутах вашего окна, поэтому 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
...