Пользуюсь http://freepascal.ru/article//book/xwin/ в качестве отправной точки.
Если закрыть окно щелчком по соотв. кнопке в системном меню, в программе вызывается callback-функция, установленная через XSetIOErrorHandler(). Если вернуться из неё, программа мгновенно дохнет не успев сохранить сессию. Приходится применять хак, вызывая исключение, запускающее нормальную цепочку выхода. Но гложет меня сомнение: не может ли событие прийти в неподходящий момент, когда сессия не готова к сохранению?
Может быть я что-то делаю не так или забываю сделать? Что-нибудь в свойствах окна? Проверять какую-нибудь функцию перед обращением к OpenGL?
В чём я ошибся? X сервер убивает программу при закрытии
Модератор: Модераторы
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Чисто интуитивно можно предположить, что XSetIOErrorHandler() устанавливает обработчик ошибок, а не какой-то штатной ситуации - может вы пытаетесь что-то делать тогда, когда повесив петлю на шею вам дают сказать свое последнее прощальное слово..
Может вас стоит обработать следующее событие
http://freepascal.ru/article//book/xwin-1-5/
Может вас стоит обработать следующее событие
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; в ответ программа может сохранить свое текущее состояние;
