Чисто интуитивно можно предположить, что XSetIOErrorHandler() устанавливает обработчик ошибок, а не какой-то штатной ситуации - может вы пытаетесь что-то делать тогда, когда повесив петлю на шею вам дают сказать свое последнее прощальное слово..
Может вас стоит обработать следующее событие
http://freepascal.ru/article//book/xwin-1-5/
Когда окно открыто, пользователь посредством менеджера совершает над ним разные действия. Программе может быть желательно перехватывать некоторые из них. Так, например, если окно представляет собой редактор текста, и пользователь пытается его закрыть, то разумно спросить у сидящего за компьютером человека, а не желает ли он предварительно сохранить результаты редакции. Начиная с X11R4 системой предусматривается свойство с именем WM_PROTOCOLS. Оно содержит список атомов, и каждый из них идентифицирует свойство, связанное с действиями, о которых надо оповещать программу. Эти свойства следующие:
...
WM_SAVE_YOURSELF — задается, если программа хочет перехватить момент своего завершения; менеджер окон посылает приложению событие ClientMessage, у которого поле message_type равно атому, соответствующему свойству WM_PROTOCOLS, а поле data.l[0] равно атому, соответствующему свойству WM_SAVE_YOURSELF; в ответ программа может сохранить свое текущее состояние;