2016-04-07 4 views
0

Я пытаюсь создать подставку xlib для X11, где она вставляет значки в лоток с помощью XEMBED, как описано в tray specs. Однако, когда я закрываю приложение с помощью значка в трее, он просто удаляет его из окна контейнера, но черный прямоугольник контейнера контейнера и запись в моем коде все еще существуют.check for reparented window close events

В XEMBED documentation он говорит

Это ответственность для внедрения, чтобы следить за всеми пересылаемых ускорителей и удалить их, когда умирает окно клиента.

Однако мое приложение не получает никаких событий или признаков, когда встроенное окно умирает.

В основном я получаю только сообщение о необходимости док-станции и ничего больше после этого. Когда событие запроса док приходит создать дочернее окно для моей панели, которая содержит окно лотка и его, как изменит родителя так:

enum trayIconSize = 24; // dimensions of icon 

icon.trayWindow = XCreateWindow(x.display, panel.window, 0, 0, ...); 
icon.ownerHandle = event.data.l[2]; // window id of icon which wants to dock 

XReparentWindow(x.display, icon.ownerHandle, icon.trayWindow, 0, 0); 
XMoveResizeWindow(x.display, icon.ownerHandle, 0, 0, trayIconSize, trayIconSize); 

Добавление к панели работает без каких-либо проблем, но я не знаю, как проверьте, когда его снова удалить.

Как заставить приложение получать события закрытия для этих значков в трее или как проверить, сохранилось ли повторное окно?

ответ

2

Я действительно сделал это перед собой: https://github.com/adamdruppe/taskbar У этого есть хаки для моей конкретной установки в ширине, но большая часть из них должна быть разумно полезной, и код может помочь вам.

Но то, что вы хотите сделать, это спросить о событиях в окне значка. Это было в то время, так что я своего рода, используя свой собственный код в качестве руководства здесь, но когда я получил запрос на док, я позвонил XSelectInput(dd, id, EventMask.StructureNotifyMask);

StructureNotifyMask подписывается на события, в том числе MapNotify, DestroyNotify, вы Prolly увидеть, где это идущий :)

После того, как вы выбрали ввод в окне значка, регулярный цикл событий может проверять события DestroyNotify и UnmapNotify (мой код проверяет оба, tbh, я не уверен, какой из них фактически запускается, когда значок удаляется) и сравнивают участника .window с идентификатором окна вашего значка. Если он совпадает, перейдите и удалите его из своего списка, потому что он ушел сейчас.

У меня на панели задач есть ошибка, если приложение сбрасывает, а не закрывается нормально, поэтому мне все еще может быть что-то не хватает, но проверка ситуации работает в большинстве случаев.