将opengl窗口转换为std::size_t并再次返回在Linux中有效,但在OS X中无效

convert opengl Window to std::size_t and back again works in Linux, but not OS X

本文关键字:有效 返回 Linux 无效 OS 但在 转换 窗口 opengl std size      更新时间:2023-10-16

我已经成功地将OpenGL窗口转换为std::size_t变量,然后在Linux中将其转换回OpenGL窗口。然而,当我尝试在Mac OS X中做同样的事情时,它不起作用。我在做什么:

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

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

调用"getWindowHandle()"只会将Window返回为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"在Linux的LinuxInputManager对象中成功,但在OS X的OSXInputManager中不成功。

另一个重要信息是Window在两个静态库之间传递,这就是为什么它首先被转换为std::size_t(以便在库之间轻松传递)。

有人知道为什么会这样吗?有没有更好的方法在库之间传递句柄?"无效*"会是更好的选择吗?

为什么你希望其他一些不相关的类型Window可以转换为std::size_t并返回而不会有任何损失?我想,看到unsigned char不担任这个角色,你不会感到惊讶,是吗?如果是这样的话,为什么您会惊讶地看到size_t失败?

size_t只是一些无符号整数类型,具有一定的大小和范围。如果您将某个不相关的类型转换为size_t,则转换结果可能适合size_t,也可能不适合,具体取决于平台、源类型的属性等。显然,这正是您的情况。

如果不能向getInputMgr提供GL类型信息,

void*将是一个不错的选项。我想您是在试图对代码的其余部分隐藏OpenGL定义吗?