Я не уверен, почему это происходит, но любое окно, которое я создаю с помощью Xlib в C++, выдает сообщение об ошибке, когда я пытаюсь закрыть, используя кнопку X. Я могу закрыть его программно без ошибок, это просто кнопка X, которая это делает.Xlib: Закрывающее окно всегда вызывает фатальную ошибку ввода-вывода?
Ошибка заключается в следующем:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 483 requests (483 known processed) with 0 events remaining.
Количество запросов меняется каждый раз, но всегда есть 0 событий осталось. Почему это происходит? Причина не в том, что мой код, так как он делает это независимо от того, что и не отправляет в очередь никаких событий. Я пытался перехватить Atom WM_WINDOW_DELETE, и он не запускается над ожидаемым кодом при закрытии окна.
Редактировать: Добавлен код цикла событий.
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);
}
_любой_ окна, даже всплывающих окон или переходных процессы? –
В дополнение к 'WM_WINDOW_DELETE' вам необходимо прослушать и обработать событие' ClientMessage'. Покажите свой код по. 'WM_WINDOW_DELETE'. – mythagel
Добавлен код цикла событий - я уже ищу ClientMessage. Это действие закрытия окна, которое закрывает ошибку, поэтому сообщение никогда не получено. – NmdMystery