Асинхронное перетаскивание

Проба асинхронного перетаскивания
Added by Иван Кузьмицкий over 4 years ago

Оконный менеджер WmClassic перетаскивал окна и изменял размеры окон синхронно, внутри своего фрейма с использованием f.Input в цикле. Перерисовка всей сцены в таком режиме производилась непосредственно, внутри цикла, посыланием сообщения наверх через шину контекста.
Такой же способ перерисовки использовался при всех манипуляциях с окнами и меню. В некоторых ситуациях это приводило к тому, что перерисовка при закрытии окна уничтожало фрейм, внутри которого шла обработка нажатия мыши.

Решил провести эксперимент по отказу от синхронной перерисовки. Идеальный полигон для этого - механизм перетаскивания окон. Решение основано на идее ответственности контейнера за перетаскивание. Оконный контейнер сам определяет моменты начала и окончания перетаскивания и генерирует соответствующие сообщения. Таким образом, получилось избавиться от синхронного цикла. А перерисовка сцены происходит автоматически, в обработчике событий главного окна, по принципу "пришло сообщение, обновили сцену".

Перерисовка по шине контекста не убрана до конца, это хороший способ затыкания дыр (убрать его совсем невозможно, каркас был слишком сильно завязан на особенности ОС). Но использовать его как генеральный метод нельзя.

Ещё одно изменение касается поведения главного меню. Раньше окно подменю самостоятельно обозначало момент собственного закрытия, потом определением этого момента занималось отображение главного меню, а в итоге управлением окнами меню возложено полностью на модуль WmClassic. Это позволило избавиться от противоречивых ситуаций (например, главное меню при потере фокуса закрывало подменю после того, как произошла перерисовка, отчего требовалось дополнительное обновление сцены).


Comments