如果要关闭以前打开的窗口,则X11窗口ID无效。(C/C++)

如果要关闭以前打开的窗口,则X11窗口ID无效。(C/C++),c++,c,x11,cairo,xlib,C++,C,X11,Cairo,Xlib,我对X11有问题。我创建了一个普通窗口,当我点击一个按钮时,我想打开一个子窗口,用cairo在上面画些东西 以下是我创建窗口的方式: printf("createCairoSurface called\n"); printf("Window created: %i\n", (int)appWindow); cairo_surface_t* new_surface = cairo_xlib_surface_create(display, appWindow, DefaultVisual(displ

我对X11有问题。我创建了一个普通窗口,当我点击一个按钮时,我想打开一个子窗口,用cairo在上面画些东西

以下是我创建窗口的方式:

printf("createCairoSurface called\n");
printf("Window created: %i\n", (int)appWindow);
cairo_surface_t* new_surface = cairo_xlib_surface_create(display, appWindow, DefaultVisual(display, 0), width, height);
在这几行代码之前,我使用XCreateWindow创建了一个普通窗口,并更改了一些属性,使我的窗口的位置像一个面板

但是,当我试图用下面的代码关闭/破坏窗口时,应用程序崩溃,我得到了BadWindow错误

Window window = (Window)static_cast(cairo_xlib_surface_get_drawable(surface));
printf("Tried to destroy window: %i\n", (int)window);
XDestroyWindow(display, window);
即使如此,我添加的printf调用告诉我窗口id应该是有效的:

Window created: 37748751
Tried to destroy window: 37748751

谢谢你

该错误与请求X_GetProperty有关,例如XGetProperty


您的错误不是来自XDestroyWindow调用,而是为了以后应用程序使用该窗口

顺便说一句,您可以使用XSynchronizedisplay,True临时使所有调用同步,这会降低性能,但有利于调试,因为崩溃将发生在实际导致问题的调用中。
Window created: 37748751
Tried to destroy window: 37748751