ubuntu平台下,c++怎么设置glfw框架的GLFWwindow固定显示在某个其他进程的window之上?
时间: 2024-02-29 21:52:03 浏览: 118
如果你想让GLFW创建的窗口固定显示在另一个进程窗口之上,你需要使用X11的API来实现。以下是一种可能的方法:
1. 获取目标窗口的XID。你可以使用`XGetWindowAttributes`函数来获取目标窗口的属性,并从中获取XID,例如:
```
Display* display = XOpenDisplay(NULL);
Window targetWindow = XGetSelectionOwner(display, XA_PRIMARY);
XWindowAttributes targetAttrs;
XGetWindowAttributes(display, targetWindow, &targetAttrs);
XID targetXID = targetAttrs.xwindow;
```
其中,`XOpenDisplay`函数打开X11服务器连接,`XGetSelectionOwner`函数获取剪贴板的拥有者窗口,`XGetWindowAttributes`函数获取目标窗口的属性,`targetAttrs.xwindow`是目标窗口的XID。
2. 创建GLFW窗口,并设置位置和大小。你可以使用`glfwCreateWindow`和`glfwSetWindowPos`函数来创建窗口并设置其位置和大小,例如:
```
GLFWwindow* window = glfwCreateWindow(800, 600, "My Window", NULL, NULL);
glfwSetWindowPos(window, targetAttrs.x, targetAttrs.y);
glfwSetWindowSize(window, targetAttrs.width, targetAttrs.height);
```
其中,`targetAttrs.x`和`targetAttrs.y`是目标窗口的左上角坐标,`targetAttrs.width`和`targetAttrs.height`是目标窗口的宽度和高度。
3. 设置窗口的属性。你需要使用X11的API来设置窗口的属性,以确保它在目标窗口之上。例如:
```
Window windowXID = (Window)glfwGetX11Window(window);
Atom wmType = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
Atom wmTypeDock = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(display, windowXID, wmType, XA_ATOM, 32, PropModeReplace, (unsigned char *)&wmTypeDock, 1);
XMapWindow(display, windowXID);
```
其中,`glfwGetX11Window`函数返回GLFW窗口的XID,`XInternAtom`函数获取_ATOM类型的原子Atom,`XChangeProperty`函数设置窗口的属性,`XMapWindow`函数将窗口映射到屏幕上。
注意:这种方法可能会打破操作系统的窗口管理规则,不建议在实际应用中使用。如果你需要在应用中创建一个始终显示在另一个进程窗口之上的窗口,可以使用操作系统提供的特殊API或库来实现。
阅读全文