конвертировать opengl Window в std :: size_t и обратно работает в Linux, но не в OS X - PullRequest
0 голосов
/ 02 июня 2011

Я успешно преобразовал окно OpenGL в переменную std :: size_t, а затем преобразовал его обратно в окно OpenGL в Linux.Однако, когда я пытаюсь сделать то же самое в Mac OS X, это не работает.Вот что я делаю:

/* our window instance(This is an X Window System Window!) */
    Window window_;
.
.


.
.
std::size_t OSXGLWindow::getWindowHandle() {
    return window_;
}
.
.

Вызов getWindowHandle () просто возвращает окно как std :: size_t.

Я передаю этот дескриптор окна size_t в следующую функцию:

IInputManager* InputFactory::getInputMgr(std::size_t winHandle) {

    IInputManager* retObj = 0;
#ifdef _WIN32
    // todo: windows input implementation
#endif

#ifdef linux
    Window win = winHandle;
    retObj = new lwis::linuxos::LinuxInputManager(win);
#endif

#ifdef __APPLE__
    Window win = winHandle;
    retObj = new lwis::osx::OSXInputManager(win);
#endif

    return retObj;
}

LinuxInputManager и OSXInputManager вызывают следующий бит кода:

XSelectInput(display_, theWindow,
            KeyPressMask | KeyReleaseMask | KeymapStateMask) == BadWindow)

где 'theWindow«Окно, которое было отправлено в конструктор соответствующих объектов» из функции «InputFactory :: getInputMgr (..)».

«XSelectInput» успешно выполняется в объекте LinuxInputManager для Linux, но не вOSXInputManager для OS X.

Еще одна важная информация - это то, что окно передается между двумя статическими библиотеками, поэтому оно в первую очередь преобразуется в std :: size_t (чтобы упроститьпройти между библиотеками).

Кто-нибудь знает, почему это так?Есть ли лучший способ передать дескриптор между библиотеками?Будет ли 'void *' лучшим вариантом?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Ну, а почему вы ожидаете, что какой-то другой, не связанный тип Window будет преобразован в std::size_t и обратно без потерь? Я думаю, вы не удивитесь, увидев, что unsigned char не работает в этой роли, не так ли? Если так, то почему вы удивлены, увидев size_t неудачу?

size_t - это просто некоторый целочисленный тип без знака с определенным размером и диапазоном. Если вы конвертируете какой-либо несвязанный тип в size_t, результат преобразования может вписаться в size_t или может не соответствовать ему, в зависимости от платформы, от свойств типа источника и т. Д. Очевидно, это именно то, что происходит в вашем случае.

1 голос
/ 02 июня 2011

void * будет хорошим вариантом, если вы не можете предоставить информацию о типе GL для getInputMgr. Я предполагаю, что вы пытаетесь скрыть определения OpenGL от остальной части вашего кода?

...