Илья Ермаков писал(а):
Это интересно, спасибо (когда-то уже видел, кстати).
Тут штука в том, что реализация ББ сильно ориентирована на MDI и его модель оконности. Как раз чисто графика не вызывает вопросов, она локализовано.
А в X-ах, насколько я понимаю, как раз оконные абстракции очень сокращены, всё идёт выше специальными менеджерами, так?
Вот те же меню взять..
В X11, как и в WinAPI есть понятие "дочернее окно", как же без него? Например кнопка в WinAPI это дочернее окно, окошка на котором лежит. В этом плане в X11 возможности те же. Окна по сути своей образуют дерево, корнем которого является root window, как и в винде (там при создании окна также задаешь хэндл родителя, если родитель это root window, то в WinAPI нужно передать NULL).
Но сам X-сервер не занимается отрисовкой заголовков окон, их рамок, изменением размеров окон. Если запустить просто X11, затем запустить ваш любимый X11-клиент (например браузер FireFox). то будет отлично видно что окно вот оно, есть, но заголовка нет, нет рамки, переместить окно нельзя, равно как и изменить его размер. В принципе всё это может делать приложение само. Либо может быть третье приложение (которое является обычным X11-клиентом, т.е. также работает через тот же протокол), которое вокруг окон будет рисовать рамочки, заголовки, кнопочки свернуть, развернуть, закрыть, перемешать окна когда пользователь тащит за заголовок мышкой, изменять размеры окон и т.п. Такое приложение называется оконным менеджером.
Ясно что таковое приложение может рисовать рамки и вообще работать только с окнами которые являются дочерними root window, с их дочками он работать не может по простой причине -- как он отличит скажем кнопку (которое окно), или другой виджет, от "окон-документов" для которых нужно рисовать рамочки и прочее? Никак.
Соответственно MDI должно быть реализовано самим приложением. Всегда. Т.е. внутри приложения должен быть свой "оконный менеджер" который натравливается уже на нужные дочерние окна и который уже им меняет размеры, рисует заголовочки и прочее, прочее.
С менюшками тоже всё просто -- то, которое pop-up, это просто окно, что в винде что в x11, при чем, оно является дочерним окном root window, а не окна того приложения откуда оно выскочило. В самом протоколе X11 понятия "меню" нет, ибо не нужно. Есть окно. И на этой абстракции реализуй что хочешь. Да, никакие менеджеры меню не реализуют (а как они это реализовали бы?). Это функциональность самого приложения. Всегда.
Соответственно реализация MDI на X11 (или где угодно ещё, где есть абстракция под названием "окно" с наличием привязки к родителю) сводится к реализации простейшего оконного менеджера внутри программы. Трудоемкость задачи -- от одного дня до рабочей недели. Строк кода -- от 500 строк до 3000. Ориентировочно.