c++ - 将 opengl 窗口转换为 std::size_t 并在 Linux 中再次工作,但在 OS X 中不工作

标签 c++ linux macos opengl x11

我已成功将 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/

相关文章:

c++ - 使用 boost::asio 的 UDP 客户端和服务器设计

c++ - 未在此范围内声明

c++ - 从方法返回变量类型

java - 如何让一个jar文件一直运行

macos - 将 gif 图像粘贴到 NSPasteboard

ruby - 无法在安装了 xcode 和 rvm 的 Mac OSX 10.9.1 上安装 Jekyll

c++ - 创建新的原始类型

xml - 在导入具有特定 'batchnumber' 标记的 xml 文件之前查询 Oracle 表是否存在 'batchnumber'

macos - 请求用户访问 `root` 以更新 `/etc/paths.d`

node.js - 如何在 CentOS 上运行的 Apache HTTP 服务器上设置 Loopback nodeJS 后端