Xlib: Does a closing window always cause a fatal I / O error?

I'm not sure why this happens, but any window that I create using Xlib in C ++ gives an error message for the terminal when I try to close using the X button. I can close it programmatically without errors, it's just a button X that does this.

The error is as follows:

XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0" after 483 requests (483 known processed) with 0 events remaining. 

The number of requests is different each time, but 0 events always remain. Why is this happening? The reason is not that my code, as it does it regardless of the fact that it does not send any events to the queue. I tried to intercept Atom WM_WINDOW_DELETE and it does not start over the expected code when closing the window.

Edit: added event loop code.

 while(XPending(display)) { XNextEvent(display, &event); pthread_mutex_unlock(&mutex); if(event.type == Expose) { XWindowAttributes getWindowAttributes; pthread_mutex_lock(&mutex); XGetWindowAttributes(display, window, &getWindowAttributes); if(state.currentState == STATE_NORMAL) { state.normX = getWindowAttributes.x; state.normY = getWindowAttributes.y; state.normWidth = getWindowAttributes.width; state.normHeight = getWindowAttributes.height; } pthread_mutex_unlock(&mutex); glViewport(0, 0, getWindowAttributes.width, getWindowAttributes.height); } else if(event.type == KeyPress) { return false; } else if(event.type == ClientMessage) { std::cout<<"X Button pressed"<<std::endl; //Never run when X-ing window if(event.xclient.message_type == XInternAtom(display, "WM_DELETE_WINDOW", True)) { return false; } } else if(event.type == ButtonPress) { if(state.currentState != STATE_FULLSCREEN) { fullscreen(); } else { normalize(); } } else if(!handleEvent(event)){ return false; } pthread_mutex_lock(&mutex); } 
+6
source share
1 answer

In addition to WM_WINDOW_DELETE you need to listen and handle the ClientMessage event.

Modifying an example from Rosetta Code to illustrate:

 #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { Display *d; Window w; XEvent e; const char *msg = "Hello, World!"; int s; d = XOpenDisplay(NULL); if (d == NULL) { fprintf(stderr, "Cannot open display\n"); exit(1); } s = DefaultScreen(d); w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); XSelectInput(d, w, ExposureMask | KeyPressMask); XMapWindow(d, w); // I support the WM_DELETE_WINDOW protocol Atom WM_DELETE_WINDOW = XInternAtom(d, "WM_DELETE_WINDOW", False); XSetWMProtocols(d, w, &WM_DELETE_WINDOW, 1); while (1) { XNextEvent(d, &e); if (e.type == Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg)); } else if (e.type == KeyPress) break; else if (e.type == ClientMessage) // TODO Should check here for other client message types - // however as the only protocol registered above is WM_DELETE_WINDOW // it is safe for this small example. break; } XCloseDisplay(d); return 0; } 
+4
source

Source: https://habr.com/ru/post/955712/


All Articles