是否可以创建一个不可见的X窗口?为了初始化 OpenGL ES 2.0 上下文,必须手动创建一个 X 窗口,但我找不到一种方法让它不可见。因为我只做 GPGPU,所以不需要输出窗口。事实上,就我而言,这相当烦人。
我知道来自早期问题的解决方案,其中指出在
InputOnly
中使用XCreateWindow()
。然而,这会导致 X 错误GLXBadDrawable
。可能是因为EGL需要窗口响应图形请求。还有别的办法吗?也许将其最小化?但我也找不到任何相关内容。另外,将窗口尺寸设置得非常小也没有帮助,因为它总是占据我的设备(诺基亚 N9)上的整个屏幕。
当您创建 X 窗口时,它是在未映射的情况下创建的,那么创建一个 InputOutput 窗口并使其保持未映射状态又如何呢?另一种选择是将其移出屏幕(如果窗口必须保持映射状态)。
_NET_WM_STATE_SKIP_TASKBAR
的窗口。#include <stdio.h>
#include <stdlib.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
Window createWindow(Display* display, int screen) {
Window window = XCreateSimpleWindow(
display,
RootWindow(display, screen),
0, 0, 100, 100, 4,
BlackPixel(display, screen),
WhitePixel(display, screen)
);
return window;
}
Display* openDisplay() {
Display *display = XOpenDisplay(NULL);
if (!display) {
fprintf(stderr, "No display\n");
exit(EXIT_FAILURE);
}
return display;
}
int setWindowProperties(Display* display, Window window) {
Atom skipTaskbar = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", False);
XChangeProperty(
display,
window,
XInternAtom(display, "_NET_WM_STATE", False),
XA_ATOM, 32,
PropModeReplace,
(unsigned char *) &skipTaskbar, 1
);
}
int waitWindowClose(Display* display, Window window) {
XEvent event;
Atom delete = XInternAtom(display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &delete, 1);
while (event.type != ClientMessage && event.xclient.data.l[0] != delete) {
XNextEvent(display, &event);
}
}
int main() {
Display* display = openDisplay();
int screen = DefaultScreen(display);
Window window = createWindow(display, screen);
setWindowProperties(display, window);
XMapWindow(display, window);
XIconifyWindow(display, window, screen);
XFlush(display);
waitWindowClose(display, window);
}