Я хотел бы перехватить сообщение WM_DELETE_WINDOW
, которое отправляется в определенный набор окон, которые я пишу приложением ( AllTray ), чтобы я мог действовать вместо него приложение получает его. В настоящее время я пытаюсь попробовать это на уровне GDK через gdk_display_add_client_message_filter
, если это возможно, но я был бы доволен решением Xlib, если оно есть; кажется возможным, но я просто не понимаю, как мне это сделать успешно.
В настоящее время у меня есть две программы (написанные на C), которые я пытаюсь использовать для выяснения этого, первая ничего не делает, кроме как создает окно и регистрирует, что оно знает о WM_DELETE_WINDOW
и второй пытается перехватить это сообщение, но, похоже, терпит неудачу при этом; кажется, ничего не делает. Я неправильно понимаю документацию по этому вопросу, или мне нужно что-то сделать дополнительно (или я должен полностью избегать использования GDK для этого)?
Фон таков: до того, как я переписал AllTray, он пытался перехватить щелчок мышью на самой кнопке X. Для некоторых оконных менеджеров это работало должным образом, для других оно вообще не работало, а для других пользователь должен был настроить его вручную и указать AllTray, где находится кнопка для закрытия окна. То, что я ищу, - это решение, которое не включает LD_LIBRARY_PRELOAD
и будет работать для любой комбинации оконного менеджера / приложения, которая соответствует текущим стандартам и отправляет WM_DELETE_WINDOW
ClientMessage, когда окно закрыто.
ОБНОВЛЕНИЕ : Я все еще ищу ответ. Маршрут, по которому я сейчас иду, - попытаться перекрасить окно и управлять им самостоятельно, но я просто не могу заставить его работать. После переучивания я, похоже, никак не могу вернуть его. Может быть, я упускаю что-то очень фундаментальное, но я не могу понять, как на самом деле заставить его снова появиться в моем собственном окне, чтобы вернуть его на экран.
ОБНОВЛЕНИЕ 2 : Хорошо, я столкнулся с другой кирпичной стеной. В документации X-сервера говорится, что для установки событий StructureNotifyMask в маске окна необходимо получать события MapNotify и ReparentNotify. Я был бы заинтересован в получении либо. Моя текущая мысль заключалась в том, чтобы создать окно, которое бы служило только приемником событий, а затем, когда я получаю события для интересных вещей, действую на них, создавая и перевоплощая их. Тем не менее, это просто не похоже на работу. Фактически я получаю только события PropertyNotify. Так что, похоже, этот маршрут тоже не очень хорош.