В чём я ошибся? X сервер убивает программу при закрытии

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

В чём я ошибся? X сервер убивает программу при закрытии

Сообщение Cheb » 25.03.2007 20:38:59

Пользуюсь http://freepascal.ru/article//book/xwin/ в качестве отправной точки.

Если закрыть окно щелчком по соотв. кнопке в системном меню, в программе вызывается callback-функция, установленная через XSetIOErrorHandler(). Если вернуться из неё, программа мгновенно дохнет не успев сохранить сессию. Приходится применять хак, вызывая исключение, запускающее нормальную цепочку выхода. Но гложет меня сомнение: не может ли событие прийти в неподходящий момент, когда сессия не готова к сохранению?

Может быть я что-то делаю не так или забываю сделать? Что-нибудь в свойствах окна? Проверять какую-нибудь функцию перед обращением к OpenGL?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение shade » 25.03.2007 21:38:39

Чисто интуитивно можно предположить, что 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; в ответ программа может сохранить свое текущее состояние;
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Cheb » 26.03.2007 00:06:26

Спасибо :D

Хак с исключением всё равно приходится применять, но теперь оно возникает в строго контролируемых условиях - в цикле приёма сообщений, когда сессия по определению находится в сохранябельном состоянии.

Большего и пожелать нельзя :)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru