XInternAtom和XSetWMProtocols
时间: 2023-12-18 21:02:21 浏览: 24
XInternAtom是Xlib库中的一个函数,用于获取一个原子(atom)的唯一标识符。它的原型如下:
```c
Atom XInternAtom(Display *display, const char *atom_name, Bool only_if_exists);
```
其中,display是与X服务器的连接,atom_name是要获取的原子的名称,only_if_exists表示如果原子不存在是否创建一个新的原子。
XSetWMProtocols函数是Xlib库中的一个函数,用于设置窗口的WM协议。WM协议是用于与窗口管理器进行交互的一种机制,例如处理窗口关闭事件。它的原型如下:
```c
Status XSetWMProtocols(Display *display, Window w, Atom *protocols, int count);
```
其中,display是与X服务器的连接,w是要设置WM协议的窗口,protocols是一个Atom类型的数组,存储了要设置的WM协议的原子标识符,count表示protocols数组中的元素个数。
通过调用XInternAtom函数可以获取一个原子的唯一标识符,然后将该原子标识符作为参数传递给XSetWMProtocols函数,从而设置窗口的WM协议。
请注意,使用XInternAtom获取的原子标识符在整个X会话期间都是唯一且不变的,可以用于与窗口管理器进行通信。
如果还有其他问题,请随时提问。
相关问题
if (ximagesink->handle_events) { Atom wm_delete; XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask | StructureNotifyMask | PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask); /* Tell the window manager we'd like delete client messages instead of * being killed */ wm_delete = XInternAtom (ximagesink->xcontext->disp, "WM_DELETE_WINDOW", False); (void) XSetWMProtocols (ximagesink->xcontext->disp, xwindow->win, &wm_delete, 1); }作用
这段代码的作用是为一个窗口设置事件处理和窗口管理协议。
首先,`XSelectInput`函数用于向窗口注册感兴趣的事件类型。通过指定`ExposureMask`、`StructureNotifyMask`、`PointerMotionMask`、`KeyPressMask`、`KeyReleaseMask`、`ButtonPressMask`和`ButtonReleaseMask`等事件掩码,窗口将接收和处理这些事件。
接下来,代码使用`XInternAtom`函数获取一个名为"WM_DELETE_WINDOW"的原子(atom)。该原子通常用于窗口关闭操作,表示请求窗口管理器发送一个删除客户端消息而不是直接关闭窗口。
最后,使用`XSetWMProtocols`函数将获取到的"WM_DELETE_WINDOW"原子作为参数,设置给窗口的WM协议。这样,当用户尝试关闭窗口时,窗口管理器将发送一个删除客户端消息给窗口,而不是直接关闭它。
通过上述操作,代码为窗口注册了感兴趣的事件,并请求了一个特定的WM协议,以实现更好的窗口管理行为。
如果还有其他问题,请随时提问。
ubuntu平台下,c++怎么设置glfw框架的GLFWwindow固定显示在某个其他进程的window之上?
如果你想让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或库来实现。