Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sse от Июль 11, 2011, 11:33



Название: Проблемы с Drag & Drop в самодельном оконном менеджере..
Отправлено: sse от Июль 11, 2011, 11:33
Добрый день. Вот такая проблема:
Имеется Qt, 4.6.3, Linux МСВС, делаю свой простенький оконный менеджер, на основе Antico. Столкнулся с такой проблемой: после вызова XReparentWindow для любого клиентского окна в моем менеджере, перестают работать механизмы Drag & Drop. Т.е. если в чистых иксах в клиенте работает Drag Drop, то уже после запуска моего WM, не работает.
Понятно, что после XReparent, сообщения  (ClientMessage) XdndEnter и XdndPosition и др. перехватываются уже главной формой, в которой теперь находится наше клиентское окно, и дальше не идут. Как доставить эти сообщения до клиента?? Пробовал в главной форме полученные сообщения вручную, через XSendEvent доставлять до клиента. Доходят, но обратно не получаю XdndStatus, что-бы его так-же обратно доставить клиенту, в результате чего на этом процесс  останавливается. Я так понимаю, некоторые сообщения съедаются в недрах QApplication(как пишут разработчики, умный код).
Есть у кого идеи, как запустить драг дроп? Вторую неделю бьюсь. Спасибо.


Название: Re: Проблемы с Drag & Drop в самодельном оконном менеджере..
Отправлено: GreatSnake от Июль 11, 2011, 13:35
Понятно, что после XReparent, сообщения  (ClientMessage) XdndEnter и XdndPosition и др. перехватываются уже главной формой, в которой теперь находится наше клиентское окно, и дальше не идут. Как доставить эти сообщения до клиента??
Откуда такие умозаключения? D'n'd и WM никоим образом не должны пересекаться.


Название: Re: Проблемы с Drag & Drop в самодельном оконном менеджере..
Отправлено: sse от Июль 11, 2011, 14:22
Понятно, что после XReparent, сообщения  (ClientMessage) XdndEnter и XdndPosition и др. перехватываются уже главной формой, в которой теперь находится наше клиентское окно, и дальше не идут. Как доставить эти сообщения до клиента??
Откуда такие умозаключения? D'n'd и WM никоим образом не должны пересекаться.
Потому, что если окно 1 поместить в окно 2 (XReparentWindow(QX11Info::display(), winId_1, winId_2, , ); ), то после этого в x11EventFilter(XEvent *event) окна 2, при перемещении объектов в окне 1, возникают события типа XdndEnter и XdndPosition ..,
а так-же вызываются обработчики dragEnterEvent(), dragMoveEvent().., окна 2 !!! Т.е. получается, что новоиспеченное окно родитель (2) думает, что на него хотят что-то перетащить, хотя это не так, просто мы таскаем какой-то элемент на его окне потомке(2). В общем, фигня какая-то получается.