Иногда одни окна нужно встраивать в другие. Примеры использования:
- Виджеты для панели в Xfce4 и некоторых других DE, каждый виджет это отдельное окно которое размещается в окне панели, если виджет падает, то панель просто его перезапустит, а сама продолжит работать
- Встраивание окна с игрой в редактор Godot
Про Godot я и хочу поговорить, недавно они решили переходить на Wayland, как же там встроить окно?
А ответ прост, нужно заново реализовать Wayland-сервер, но уже в приложении, на котором будут запускаться дочерние окна, и уже через него рисоваться, как будто окно приложения это весь экран, именно поэтому в Godot была попытка внедрить wlroots.
Надо сказать что несмотря на гениальность решения, стороннее окно не получится присвоить себе, что конечно очень безопасно, да и кому это нужно?
Так же у такого решения имеется еще один недостаток, реализовывать заново весь Wayland сервер это сложно. Поэтому разработчику Godot пришла гениальная идея, сделать некий прокси, который будет переписывать некоторые сообщения протокола, и переадресовывать их на основное окно. Конечно нужно обрабатывать кучу протоколов и парсить XML файлы что бы все работало, и потом следить за этим и при выходе новых протоколов обновлять Godot.
Но такой прокси, в отличии от повторной реализации Wayland сервера, намного проще, для альфы пришлось написать всего около 3 000 строк! Так что несмотря на некоторые недостатки, решение хорошее. Конечно решение еще сырое, но даже 6 000 строк это не так уж и плохо.
А теперь покажу как встраиваются окна в MS Windows Win32:
SetParent(child_window, parent_window);
Пожелаю удачи разработчику Godot, и побольше терпения, потому что ему нужно учесть много факторов, например fractional scaling, ну и пусть заодно учтет все будущие протколы.