我已成功将 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()”只是将窗口作为 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 在 2 个静态库之间传递,这就是为什么它首先被转换为 std::size_t(以便于在库之间传递)。
有人知道这是为什么吗?有没有更好的方法在库之间传递句柄? “void*”会是更好的选择吗?
最佳答案
那么,为什么您期望一些其他不相关的类型 Window
可以无任何损失地转换为 std::size_t
并返回?我猜你不会对 unsigned char
在那个角色中不起作用感到惊讶,是吗?如果是这样,为什么您会惊讶地看到 size_t
失败?
size_t
只是一些无符号整数类型,具有一定的大小和范围。如果您将一些不相关的类型转换为 size_t
,转换结果可能适合 size_t
,也可能不适合它,具体取决于平台和源的属性类型等。显然,这正是您的情况。
关于c++ - 将 opengl 窗口转换为 std::size_t 并在 Linux 中再次工作,但在 OS X 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6208574/