Haiku — свободная операционная система для персональных компьютеров, первая версия которой нацелена на бинарную совместимость с операционной системой BeOS.

Haiku воплощает в себе основные идеи BeOS. Это будет модульная система, архитектурно решённая как «модульное ядро», способная динамически подгружать необходимые модули. К интересным особенностям системы следует отнести архитектуру трансляторов — системных интерпретаторов файловых форматов (например, JPEG).

О проекте

ad block

Закладки

Пакет для оценки производительности файловой системы Haiku

Пришло время кратких новостей

С релизом r26676, в Haiku появилась первая глючная реализация xsi семафоров (глючная, потому что уже готов патч, возможно не последний, который устранит некоторые обнаруженные проблемы).

Можно сгрузить, скомпилировать и запустить пакет для оценки производительности файловой системы bonnie++. Я использовал версию 1.03d, которую мне рекомендовал автор пакета. С ним можно оценить работу файловой системы, а также то, как Haiku работает при недостатки памяти и тяжёлой нагрузкой.

Программа запускается очень просто. Чтобы запустить пакет в режиме одного процесса, наберите:

bonnie++ -u 0

А если хотите запустить несколько процеесов, сделайте так:

bonnie++ -p 3 -u 0
bonnie++ -y -u 0 &
bonnie++ -y -u 0 &
bonnie++ -y -u 0 &

Первая команда создаёт ipc ключ и семафоры для синхронизации трёх процессов. Как большинство из вас догадалось, флаг -p указывает число процессов bonnie++. Почмите, что ни один из этих процессов не запустится до тех пор, пока не стартует самый последний.

Конечно же, я приглашаю всех вас принять участие в тестах, чем больше будет сделано тестов, тем больше будет найдено багов, тем скорее их вылечат, тем быстрее выйдет R1 will. По крайней мере в теории! :-)

Конечно, ВЫ ВСЁ ДЕЛАЕТЕ НА СВОЙ РИСК.

emitrax

Модифицируем отладчик ядра

В отличие от BeOS наше ядро содержит куски кода на C++, которые иногда причиняют кучу головной боли, года смотришь стек отладчиком ядра, потому что символы искалечены линковкой бинарников так, что надо использовать Decode__12CrypticCNamesPCc. Помню, видел private API для gcc4 по расшифровке символов в читаемые имена, но код, делавший это, из libsupc++, был написан без учёта реалий Kernel Debugging Land, и использовал вызовы malloc, realloc и free... Я всё ещё очень хотел видеть нормальные имена и не сдавался. Я также хотел иметь возможность получать ассемблерные дампы, потому что не у всех есть последовательный кабель для работы с внешним отладчиком.

статья полностью

Видео: Code_Swarm для Haiku


Code_Swarm for Haiku OS from Fredrik Holmqvist on Vimeo.

Сегодня я получил email от Фредрика Холмквиста (TQH из Bezilla) о видео, недавно им сделанном и выложенном на Vimeo. Это видео сделано с помощью Code_Swarm, технологии, позволяющий отобразить активность в репозитории. Видео сгенерированно из сообщений Haiku subversion, и показывает переод начиная с переноса Haiku на Subversion до 26538 ревизии. Его можно посмотреть тут; рекомендуется смотреть HD версию на полном экране. Для тех кто не хочет или не может использовать Flash доступен исходник (1280x720) с Vimeo (требуется регистрация).

Спасибо, Фредрик!

2008/07/23
постоянный адрес

метки:

Субпиксельное сглаживание. Отчёт #2 [GSoC]

Прошло несколько недель с моего последнего поста, вот вам ещё один небольшой отчёт о положении дел в моём проекте.
Надеюсь, вам понравился результат моей работы, который уже включён в основное дерево исходников. С радостью сообщаю, что вторая часть моего проекта почти закончена.

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

Далее, я хочу добавить настройки субпиксельного сглаживания в апплет Appearance (то есть снова убрать его из апплета Fonts). Я это уже частично сделал, но мой наставник Штефан считает (и я тоже считаю), что будет лучше переписать Appearance полностью, включив в него некоторые другие апплеты. Не знаю, какую часть работы он хочет дать мне, но, надеюсь, у меня хватит времени на большую её часть.

Наконец, взгляните на картинки с результатами моей работы. Слева — сглаживание оттенками серого, справа — субпиксели. Я дам пинту пива каждому, кто скажет, что видит разницу :-D

Andrej Spielmann

Спаривание! 5-я веха

img_3076.jpg

Да, ещё одна мутная и нечитаемая картинка. В камере села батарейка и лучше не получится.

Помните Марвина? На этот раз он добавлен (если видите) в список доверенных устройств моего телефона после процесса соединения, ввода пинкода и обмена ключом для шифрования (речь идёт о соединении по bluetooth - haikuos.info)

На картинке видно окошко пинкода пользователя (чтобы ввести пинкод, выданный телефоном) и другое окно, которое говорит нам, что соединение состоялось.

В этот раз я хочу поблагодарить Monni за присланные мне патчи :)

urnenfeld

Работа над ядром для 68k

Когда-нибудь я должен написать о начале работы над портом для 68k, есть о чём рассказать...
Сегодня^Wвечером^Wутром эээ, хм, хорошо, сейчас я попытаюсь сделать живой репортаж о том, на чём остановился в прошлый раз: как сделать, чтобы ядро грузилось корректно.

продолжение

Новости порта 68k

Я продолжаю работать над портом для 68k, как вы, наверное, уже знаете, все компилируется, но ядро всё ещё во многом не готово, нет драйверов, загрузчик пока не грузит.
Почти закончил установку, по крайней мере для эмулятора 040 ARAnyM.

прозрачная трансляция

Я провёл довольно много времени, пытаясь исправить ошибку, которая уходила корнями далеко вглубь ARAnyM. Управление памятью в 68030 и более поздних системах (кроме 68851, с которым идёт 020), используют функциональность, называемую прозрачной трансляцией. В сущности, это два регистра, которые называются TT0 и TT1 (на 040 на пространство данных и пространство инструкций), каждый из которых устанавливает в виртуальном пространстае окно в 16 мб, которое обходит трансляцию блока управления памятью. Для простоты я использовал их в загрузчике, чтобы соотнести первые 32 мб (включающие медленную память, ROM и начало быстрой памяти) один-в-один с виртуальным пространством, чтобы физические адреса страниц в дереве трансляции могли быть использованы как виртуальные при поиске.

продолжение

RMLL 2008, окончание

Был слегка занят эти дни, но я не забыл написать о последних днях на RMLL... много людей, встреч, и о Ричарде Мэтью Столмене, конечно!

Четверг

Четверг начался довольно быстро, с доклада о «продажах в нагрузку» (когда человека заставляют покупать машину с ОС, которая ему не нужна), что во Франции вообще незаконно, но государственный организм по защите прав потребителей (DGCCRF) сначала ожидает решения суда, и только потом действует. Как было сказано в докладе, до недавнего времени борьба с этим велась в частном порядке, но многие пользователи Windows, ранее не понимавших цели такой борьбы, сейчас говорят, как это здорово, ведь их принуждают покупать с компьютерами Висту, хотя они хотят оставаться с XP… Забавно, как Microsoft иногда имеет сама себя. Я напомнил всем, что это - давняя история, и несколько лет назад это привело к разорению Be. Мы должны наконец добиться тут каких-нибудь результатов.

Когда я увидел, что Оливье справляется со стендом в одиночку, то побежал на заседание OpenMoko, чтобы узнать побольше про их железо. Там был перерыв и я вернулся к нашему стенду.

Оливье сделал несколько фото стенда, и если вы присмотритесь, то заметите, что я вырезал несколько листьев и наклеил их на ткань.

Стенд рядом с нами принадлежал FFII, которая пытается защищать Свободное ПО от дурацких законов типа EUCD, патентов на ПО и т.п. Если хотите, адвокаты нас всех. Мы здорово побеседовали с их бухгалтером о том, какую только ерунду не пытаются лоббировать.

Потом я пошёл слушать доклад об OpenMoko, который переместился в амфитеатр. Аппаратная платформа новой модели, FreeRunner, наверняка заинтересует того, кто захочет портировать Haiku на ARM. Кроме того, у них до сих пор неразбериха с Линуксовыми фреймворками, они переезжают с одного на другой, а потом в игру включается третий, у каждого свои особенности, и это смущает пользователей. Один позволяет совершать голосовые звонки, другой — ещё и использовать GPS, а изначальный не обладал даже достаточным уровнем аппаратных абстракций, из-за чего пришлось взяться за ещё один фреймворк. Публике была поведана их история и то, как они друг с другом связаны. Хотелось бы иметь 320€ на такую игрушку.

Затем я вернулся к своему стенду, пообщался и пообедал. Потом Оливье вышел за едой, так как ничего не заказал заранее, и чтобы скопировать флаеров, так как мне удалось напечатать всего три. Я также предпринял попытку перевода, но не сумел найти исходник, так что результат был далёк от оригинала и не так приятно выглядел.

Во второй половине дня я выскочил послушать какой-нибудь доклад, и постоял под тентом, что было более терпимо, чем в первый день, так как весь вечер шёл дождь.

Тем не менее, я послушал вторую часть конференции о новых вещах в 2.6, надеясь найти что-нибудь для дополнения своего доклада, и мне это и вправду удалось. Примерно трёх часов мне оказалось более чем достаточно :) Кроме вытесняющей многозадачности и безтаймерности (tickless), в 2.6 есть многое другое из того, что если и не было позаимствовано, то хотя бы близко к тому, что делала BeOS или к тому, что в BeOS не было, но будет добавлено в Haiku.

Было много других докладов, на которые, у меня, к сожалению, не хватило времени, например, доклад по удобству использования Янины Сайки, которая, как мне рассказали, здорово умеет доносить до людей свои мысли.

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

Около часу ночи я закончил работу со своими слайдами и пошёл спать.

Пятница

На следующий день я прослушал пару докладов о французском проекте OOoEdu, который призван помочь преподавателям обмениваться образовательными материалами, используя открытые форматы, а студенты-наставники пусть исправляют ошибки в OpenOffice, вместо того, чтобы упражняться в решении далёких от реальности задач. Я прослушал всё до самого конца. Я также побеседовал с докладчиком, который, как оказалось, портирует OpenOffice на MacOS, и мы будем держать связь по поводу предстоящего портирования на Haiku.

В полдень состоялась тусовка по обмену PGP-ключами. Немногочисленно, зато весело.

Слегка перекусив и поприсутствовав на стенде, чтобы Оливеру было не так одиноко, я пошёл слушать доклад «Webkit против Mozilla», который превратился в перепалку, когда один сказал: «В отличие от Mozilla, Webkit умеет то-то и то-то», а другой ответил: «да ну, Mozilla это тоже умеет» :) Хоть и интересно, но я ушёл помогать на стенде и готовиться к собственному докладу. Всё равно в течение недели у меня было время поговорить с разработчиками и Webkit, и Mozilla.

Наконец подошло время начала моего доклада. Что-то случилось с проектором, я несколько раз пытался заставить его работать, трахался с
драйверами для Haiku и Zeta, а оказалось, что это кабель под своим весом выскакивал из плохого разъёма. Мне пришлось переключиться в режим VESA, но в конце концов всё заработало. Посколько в комнату набилось достаточно много народу, а я не был уверен в публике, я потратил больше времени на общее введение, чем на схожесть с Линуксом, о которой я хотел поговорить, но мне удалось рассказать о большинстве их за отведённое время. В конце я перезагрузился в Ubuntu и показал нескольким людям, как ARAnyM запускает загрузчик m68k.

Потом мы поехали в то место, где Nocturnes устроил прекрасный буфет с местными блюдами и напитками. Я опять побеседовал об OpenOffice, на этот раз с главой франкоговорящего проекта. Мы обменялись взглядами на философии, а она рассказала мне о нынешнем направлении в разработке OO, уменьшающем его сложность и делающем его более модульным, что позволит школам получить более лёгкие версии, а я объяснил, что Haiku с его стремлением к простоте, больше подойдёт для этих целей.

Также в саду у меня взяли интервью насчёт Haiku, встреч с людьми и сообществ, я всё ещё жду, когда оно где-нибудь появится. С другой стороны, вот снятое FreenewsTV в первый день видео, где они ходят по всем стендам, начиная с нашего. Но Оливье на нём нет, потому что он к тому времени ещё не пришёл.

Затем мы увидели то, чего нам так не хватало всю неделю, потому что у нас не было времени посетить Nocturnes. Гики со своими лаптопами на столах, диванах, газонах, высматривающие свой город на OpenStreetMap, пытающиеся использовать на своих макбуках DVD с OpenSolaris при смещённой раскладке клавиатуры: z вместо a, e вместо z, r вместо e, и так далее, а клавиша enter оказалась вообще вне физической досягаемости. В то же время проходил концерт Свободной Музыки. Мы посидели на газоне с группой людей и побеседовали о BeOS, Haiku и истории.

Потом вернулись обратно в комнату и опять немного поспали.

Суббота

В субботу у нас было замечательное выступление Ричарда Столлмена по поводу GPLv3 на беглом французском, а потом его тайная ипостась, святой Игнуций из Церкви Emacs'а, всех нас благословила. Я подошёл, взял микрофон и попросил нас простить за то, что мы не называемся «GNU/Haiku», хотя используем в Haiku инструменты GNU. Он сказал, что грех можно искупить сменой имени. Что я думаю по поводу этого, так это то, что оно не так важно, как в случае с Линуксом, потому что Линукс — это всего лишь ядро, которому необходимы инструменты GNU для формирования цельной ОС, тогда как Haiku сама по себе является полноценной ОС, которая использует не только инструменты GNU, но и другие.

Поскольку я не хотел это так оставлять, я позже подошёл на его стенд с флаером Haiku, на котором зачеркнул «OpenSource», чтобы написать FreeSoftware и GNU/Haiku. Я рассказал о доступном для скачивания образе, но он сказал, что вряд ли у него будет время, так как он очень занят. Однако он нашёл немного времени, чтобы поговорить со мной, и сказал, что термин «OpenSource» не является некорректным, так как это технический термин, в то время как FreeSoftware — вопрос скорее морального выбора, так что оба варианта применимы. Потом я поговорил о лицензии, на этот раз по-английски, и он посоветовал нам быть более точными в лицензии, как он сказал, «У MIT есть пять или шесть лицензий, и у BSD тоже имеется несколько версий», я посмотрю их попозже. Во всяком случае, теперь он знает про Haiku, и это здорово.

После скорого обеда мне пришлось собираться, так как моя машина скоро отправлялась. Ещё оставались интересные доклады, но мне пришлось покинуть Оливье.

В итоге мы увидели много интересного и интересных людей, как разработчиков, так и будущих пользователей. Многие были наслышаны о BeOS, но они ничего не знали о нас, поддерживающих дыхание. Было приятно увидеть в одном месте и разработчиков, и пользователей, собирать контакты и планировать мировое господство.

mmu_man

"Парное катание" Haiku и ReactOS на LinuxWorld Expo 08

Интересный и захватывающий поворот событий: Haiku смогла забронировать место на LinuxWorld Expo 2008, договорившись с организаторами LinuxWorld (IDG) и ReactOS, которые поделятся своим стендом с Haiku в этом году. LinuxWorld посещает более 10,000 человек, представляющих интересы бизнеса и прессы. Это должно дать обоим проектам хорошую возможность показать себя.

osnews

2008/07/16
постоянный адрес

метки:

Haiku примет участие в LinuxWorld 2008 в Сан-Франциско

В феврале 2007 года Haiku приняла участие в SCaLE 05, впервые появившись на open source конференциях. С тех пор Haiku многократно появлялась на других конференциях по всему миру. Одной из самых желаемых площадок, куда мы стремились попасть, был LinuxWorld Expo; к сожалению, ни в прошлом, ни в этом году, мы не смогли занять место в павильоне .Org. К счастью, на этот раз всё будет по-другому. Благодаря некоторому упорству, находчивости и доброй воле IDG World Expo (организаторов LinuxWorld) и проекта ReactOS (с которыми мы делим стенд), мы с радостью сообщаем, что смогли получить выставочный стенд на LinuxWorld Expo 2008, которая пройдёт в следующем месяце в San Francisco Moscone Center.

Мы забронировали полноразмерный 10x10 стенд (место #1617), и планируем показать Haiku в всей красе на выставке, которая состоится, 5, 6 и 7 августа. Мы хотим показать Haiku на двух или более PC, один из которых подцепим к проектору, чтобы показывать картинку на заднике стенда (примерно так). Будем также раздавать CD с образом для VMWare и продавать майки с Haiku (если разрешат) в пользу казны проекта.

LinuxWorld посещает более 10,000 человек. Это во много раз больше, чем ходило на подобные конференции раньше. В выставке участвуют такие зубры, как IBM, ORACLE, ACCESS, CISCO, Fujitsu и Canonical, наряду с общеизвестными open source проектами, вроде Fedora, Drupal, FreeBSD и Gentoo. Конечно, выставка будет освещаться в прессе, поэтому возможность засветиться также будет. В общем, LinuxWorld предлагает хорошую возможность показать себя с самой лучшей стороны, что не может не радовать.

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

Добавление: Если вы планируете посетить LinuxWorld, используйте Haiku priority code "VPL56", чтобы получить бесплатный билет на выставку (обычная цена $50), доступа в секции BoF, 20% скидок с программ конференций и т.д. Подробности можно узнать на флаерсе (850KB PDF).

Схема стенда

LinuxWorld 2008 Overview

Где: Moscone Center, Сан-Франциско
Конференция: 4, 5, 6 и 7 августа
Выставка: 5, 6 и 7 августа
Стенд Haiku: #1617 — схема (4MB PDF)
Регистрация онлайн (Используйте код "VPL56" для 20% скидки или БЕСПЛАТНОГО прохода в выставочный зал)
Брошюра LinuxWorld 2008

Разместить всё, Часть 1

Необходимость в системе автоматического расположения элементов на странице

Одним из главных недостатков Be API, на который жаловались серьёзные программисты, была зависимость от размера шрифтов. То есть вы могли сделать GUI для одних системных шрифтов по умолчанию, а затем пользователь мог бы поставить другой, больший или меньший шрифт и всё катастрофически разъежжалось (особенно, если шрифт был больше). Всё, что было выравнено раньше, переставало таковым быть, текстовые надписи наползали на элементы или вообще пропадали за краем окна. Это было особенно заметно для окон с жёстко заданным размером, вроде диалогов и панелей конфигураций:

Кроме чувствительности к размеру шрифта было сложно сделать GUI с точным расположением и размером каждого компонента. Требовалось добавлять новые элементы или двигать их более сложным, неочевидным образом.

Для решения этой проблемы применяют layout manager — менеджер разметки. Он размещает элементы, руководствуясь такими критериями, как минимальный, желаемый и максимальный размер каждого элемента. Если пользователь изменяет размер окна или шрифта, он элегантно переместит и увеличит/уменьшит те элементы, за которые он отвечает.

Как мы уже сказали в первом абзаце, в BeOS никогда не было встроенного менеджера разметки. Некоторые разработчики пытались это исправить, например Marco Nelissen со своей орденоносной liblayout, Brian Tietz с его Santa's Gift Bag library и Angry Red Planet с ARPCommon library. Все эти библиотеки достигали одного и того же, но разными способами. "Портирование" приложения из одной системы в другую было делом непростым.

К нашей радости, Ingo Weinhold пришёл к нам на помощь, выложив свою систему размещения элементов в дерево Haiku в августе 2006. С тех пор она была немного изменена, но до сих пор не очень используется. Я говорю об этом, потому что не многие о ней вообще знают. Инго человек занятой, поэтому я и пишу эту статью, чтобы познакомить вас с этой системой.

Первая статья опишет систему на верхнем уровне, а в следующих статьях я затрону их более детально.

Прежде всего, Инго нисколько не скрывает, что его система была сделана на основе QLayout и библиотеки Qt. Может быть, будет полезно прочитать и о них тоже, хотя я расскажу всё, что вам нужно знать о классах в Haiku.

Типы менеджеров разметки

Начну с описания типов менеджеров, которые сейчас присутствуют в Haiku и о том, как они работают:

  • BCardLayout: содержит views-виды и работает как колода карт — один элемент сверху, остальные под ним. Виден только верхний элемент, остальные не видны. Полезен для реализации интерфейса на закладках (табах), чтобы показать несколько элементов в одном окне или для окон с несколькими секциями (как в BeIDE или Firefox).
  • BGridLayout: всё views располагаются на сетке, каждый вид занимает одинаковое пространство (хотя может занимать несколько ячеек/колонок). Полезен, например, для приложения, показывающего превьюхи картинок.
  • BGroupLayout: содержит элементы, выравненные горизонтально или вертикально, в зависимости от желаемой ориентации. Комбинация (несколько горизонтальных BGroupLayout-ов внутри вертикального BGroupLayout-а) - самая гибкий и удобный способ расположения элементов. Я думаю очень многие приложения будут использовать этот класс.
  • BSplitLayout: работает почти как BGroupLayout, с той разницей, размер вида резиновый. Кроме того такой вид может быть уменьшен до нулевого размера и не показываться вообще. Этот класс не может использоваться напрямую, а только через класс BSplitView.
  • BALMLayout: новенький в нашем посёлке, был добавлен в феврале 2008 года из кода, созданного Christof Lutteroth'a и James Kim'a. ALM - сокращение от Auckland Layout Model, нового способа, придуманного Кристофом в Университете Окленда. Подробнее о нём можно прочитать на его странице на SourceForge. Думаю, я коснусь подробностей о том, как он работает, позже, может даже в отдельной статье. Впрочем, по ссылке вы можете ознакомиться с его концепцией самостоятельно.

Как построить GUI с использованием разметок

Чтобы построить GUI для Haiku с использованием системы разметок, вам надо понять, какой именно менеджер надо использовать. Для существующего GUI это скорее всего будет очевидно из того, что вы видите на экране, для нового интерфейса, возможно, было бы полезным его нарисовать, хотя это всегда полезно сделать.

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

Для примера можно было бы придумать простой произвольный GUI, но, думаю, интереснее было бы взять существующий интерфейс из Haiku, который чувствителен к размеру шрифта. На первом рисунке у нас была панель настройки e-mail клиента, но он довольно сложный, давайте возьмём что-нибудь попроще. Например, midi плеер.


Вид MIDI плеера со шрифтом по умолчаниию (размер 12) и размером 18. Даже первая версия могла бы выиграть при использовании системы разметок.

Итак, что нам понадобится? Для начала я вижу четыре секции по вертикали:

  1. Панель "Drop MIDI file here"
  2. Лейблы и селектов посередине
  3. Разделитель
  4. Кнопку Play

Это значит, что сверху у нас будет вертикальный BGroupLayout. Группа лейблов и селектов должна расположиться на сетке, для чего будет использован BGridLayout. Но прежде чем я покажу новый код для работы с разметчиком, давайте посмотрим изначальный код. Он лежит в MidiPlayerWindow.cpp в методе CreateViews(). Он использует несколько макросов. Код с номерами строк из r26407:


32 #define _W(a) (a->Frame().Width())
33 #define _H(a) (a->Frame().Height())

...

240 void MidiPlayerWindow::CreateViews()
241 {
242 scopeView = new ScopeView;
243
244 showScope = new BCheckBox(
245 BRect(0, 0, 1, 1), "showScope", "Scope",
246 new BMessage(MSG_SHOW_SCOPE), B_FOLLOW_LEFT);
247
248 showScope->SetValue(B_CONTROL_ON);
249 showScope->ResizeToPreferred();
250
251 CreateInputMenu();
252 CreateReverbMenu();
253
254 volumeSlider = new BSlider(
255 BRect(0, 0, 1, 1), "volumeSlider", NULL, NULL,
256 0, 100, B_TRIANGLE_THUMB);
257
258 rgb_color col = { 152, 152, 255 };
259 volumeSlider->UseFillColor(true, &col);
260 volumeSlider->SetModificationMessage(new BMessage(MSG_VOLUME));
261 volumeSlider->ResizeToPreferred();
262 volumeSlider->ResizeTo(_W(scopeView) - 42, _H(volumeSlider));
263
264 playButton = new BButton(
265 BRect(0, 1, 80, 1), "playButton", "Play", new BMessage(MSG_PLAY_STOP),
266 B_FOLLOW_RIGHT);
267
268 //playButton->MakeDefault(true);
269 playButton->ResizeToPreferred();
270 playButton->SetEnabled(false);
271
272 BBox* background = new BBox(
273 BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
274 B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP,
275 B_PLAIN_BORDER);
276
277 BBox* divider = new BBox(
278 BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
279 B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
280
281 divider->ResizeTo(_W(scopeView), 1);
282
283 BStringView* volumeLabel = new BStringView(
284 BRect(0, 0, 1, 1), NULL, "Volume:");
285
286 volumeLabel->ResizeToPreferred();
287
288 float width = 8 + _W(scopeView) + 8;
289
290 float height =
291 8 + _H(scopeView)
292 + 8 + _H(showScope)
293 + 4 + _H(inputMenu)
294 + _H(reverbMenu)
295 + 2 + _H(volumeSlider)
296 + 10 + _H(divider)
297 + 6 + _H(playButton)
298 + 16;
299
300 ResizeTo(width, height);
301
302 AddChild(background);
303 background->ResizeTo(width, height);
304 background->AddChild(scopeView);
305 background->AddChild(showScope);
306 background->AddChild(reverbMenu);
307 background->AddChild(inputMenu);
308 background->AddChild(volumeLabel);
309 background->AddChild(volumeSlider);
310 background->AddChild(divider);
311 background->AddChild(playButton);
312
313 float y = 8;
314 scopeView->MoveTo(8, y);
315
316 y += _H(scopeView) + 8;
317 showScope->MoveTo(8 + 55, y);
318
319 y += _H(showScope) + 4;
320 inputMenu->MoveTo(8, y);
321
322 y += _H(inputMenu);
323 reverbMenu->MoveTo(8, y);
324
325 y += _H(reverbMenu) + 2;
326 volumeLabel->MoveTo(8, y);
327 volumeSlider->MoveTo(8 + 49, y);
328
329 y += _H(volumeSlider) + 10;
330 divider->MoveTo(8, y);
331
332 y += _H(divider) + 6;
333 playButton->MoveTo((width - _W(playButton)) / 2, y);
334 }

Я не стану вдаваться в подробности, просто хочу обратить внимание на вручную заданные координаты и о том, сколько времени отняло расположение элементов. Другим побочным эффктом использования систем автоматичского расположения является более читый код, думаю, следующий ниже пример наглядно покажет это. Вот метод CreateViews(), переписанный для системы разметчиков:


246 void MidiPlayerWindow::CreateViews()
247 {
248 // Set up needed views
249 scopeView = new ScopeView;
250
251 showScope = new BCheckBox(
252 BRect(0, 0, 1, 1), "showScope", "Scope",
253 new BMessage(MSG_SHOW_SCOPE), B_FOLLOW_LEFT);
254 showScope->SetValue(B_CONTROL_ON);
255
256 CreateInputMenu();
257 CreateReverbMenu();
258
259 volumeSlider = new BSlider(
260 BRect(0, 0, 1, 1), "volumeSlider", NULL, NULL,
261 0, 100, B_TRIANGLE_THUMB);
262 rgb_color col = { 152, 152, 255 };
263 volumeSlider->UseFillColor(true, &col);
264 volumeSlider->SetModificationMessage(new BMessage(MSG_VOLUME));
265
266 playButton = new BButton(
267 BRect(0, 1, 80, 1), "playButton", "Play", new BMessage(MSG_PLAY_STOP),
268 B_FOLLOW_RIGHT);
269 playButton->SetEnabled(false);
270
271 BBox* divider = new BBox(
272 BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
273 B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
274 divider->SetExplicitMaxSize(
275 BSize(B_SIZE_UNLIMITED, 1));
276
277 BStringView* volumeLabel = new BStringView(
278 BRect(0, 0, 1, 1), NULL, "Volume:");
279 volumeLabel->SetAlignment(B_ALIGN_LEFT);
280 volumeLabel->SetExplicitMaxSize(
281 BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
282
283 // Build the layout
284 SetLayout(new BGroupLayout(B_HORIZONTAL));
285
286 AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
287 .Add(scopeView)
288 .Add(BGridLayoutBuilder(10, 10)
289 .Add(BSpaceLayoutItem::CreateGlue(), 0, 0)
290 .Add(showScope, 1, 0)
291
292 .Add(reverbMenu->CreateLabelLayoutItem(), 0, 1)
293 .Add(reverbMenu->CreateMenuBarLayoutItem(), 1, 1)
294
295 .Add(inputMenu->CreateLabelLayoutItem(), 0, 2)
296 .Add(inputMenu->CreateMenuBarLayoutItem(), 1, 2)
297
298 .Add(volumeLabel, 0, 3)
299 .Add(volumeSlider, 1, 3)
300 )
301 .AddGlue()
302 .Add(divider)
303 .AddGlue()
304 .Add(playButton)
305 .AddGlue()
306 .SetInsets(5, 5, 5, 5)
307 );
308 }

Единственным значительным изменением в первой части метода, где создаются виды, стало удаление их ручного размещения, вроде playButton->ResizeToPreferred(); в строке 269. Мы добавили насколько подсказок, чтобы система поняла, как следует расположить элементы наилучшим образом. Например, неограниченная ширина и высота не более 1 назначена разделителю BBox, поэтому он всегда будет выглядеть как разделитель. В дополнение к нему, volumeLabel выравнен по левому краю и занимает всё доступное место. Он выравнен вместе с лейблами BMenuFields над ним.

Перейдём к «мясу», которое начинается у нас с 284 строки. Начнём с базовой разметки. Я решил начать с «пустой» горизонтальной группы, чтобы потом использовать вертикальное построение, которое мне на самом деле нужно. Возможно, это особенность системы, что менеджер должен быть установлен внутри окна, прежде чем вы сможете добавлять в него элементы. Я бы, возможно, предпочёл создать вертикальную группу вне сборщика и сделать её корневой разметкой, но, не думаю что код выглядел бы при этом красиво.

Если говорить о сборщиках, они созданы как раз для таких случаев, как у нас, когда каждый метод возвращает экземпляр сборщика, позволяющего создавать практически неограниченную сеть методов. С использованием правильных отступов, они выглядят красиво и показывают структуру GUI. За что я их и люблю. Итак у нас есть GridLayoutBuilder, GroupLayoutBuilder и SplitLayoutBuilder.


Новый интерфейс MIDI при шрифтах 12-го и 18-го размера.

В строке 286 мы добавили вызов AddChild() с вызовами разметчиков внутри него. Первый аргумент для BGroupLayoutBuilder — это ориентация группы, а второй - расстояние между элементами. Оно необходимо, чтобы прорядить элементы, иначе они слипнутся. Поскольку у нас есть главная группа, мы можем добавлять в неё элементы методом Add(), и для начала добавим чекбокс scope. Потом мы хотим в середине поместить сетку, поэтому вызовем её сборщик. Для BGridLayoutBuilder аргументами будут расстояния между элементами, на этот раз по горизонтали и по вертикали.

В строке 289 мы размещаем элементы на сетке, используя glue (клей). Что такое клей? Это то, что заполняет пространство, чтобы наши элементы были выравнены правильно. В нашем случае чекбокс showScope должен быть выравнен с меню, которые под ним. Ещё клей используется в главной вертикальной группе, чтобы склеить сетку, разделитель, кнопку play и низ окна. Наше окно полуается красивым и похожим на исходное.

Другими аргументами в методе Add() для BGridLayoutBuilder будут номер строки и колонки, в которых мы хотим увидеть данный элемент. Мы хотим, чтобы клей был в 0 строке 0 колонки, чекбокс showScope в 0 строке и 1 колонке, лейбл reverb в 0 колонке и 1 строке и т.д.. Что касается пункта reverb в меню, то мы видим, что специальные методы BMenuField создают два разных элемента для одного вида. Это интересный аспект, говорящий нам о том, что виды состоящие из разных компонентов,могут на самом деле иметь разные секции, которые разметчиком управляются индивидуально. Другим примером такого подхода может служить ActivityMonitor, который использует эту технику, чтобы показать активность и легенду.

Напоследок вызывается метод SetInsets(), который нужен, чтобы поместить поля вокруг нашего интерфесйса, слева, сверху, справа и снизу. Пять пикселей вполне сойдёт для полей. Я мог бы использовать и 8, как в оригинале, но и 5 вполне хватит.

Нужно сделать ещё несколько изменений в коде, чтобы получить GUI, как на картинке. Во-первыха добавим заголовки. Во-вторых в конструктор окна MidiPlayer надо добавить B_AUTO_UPDATE_SIZE_LIMITS, чтобы он автоматически изменял размер с помощью системы разметки:

41 MidiPlayerWindow::MidiPlayerWindow()
42 : BWindow(BRect(0, 0, 1, 1), "MidiPlayer", B_TITLED_WINDOW,
43 B_ASYNCHRONOUS_CONTROLS | B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS)

В третьих, методы, которые использовались для построяения меню, следует изменить на более дружественный конструктор. Также следует удалить код ручной разметки. Для примера, код CreateReverbMenu() меняется с такого:

230 reverbMenu = new BMenuField(
231 BRect(0, 0, 128, 17), "reverbMenu", "Reverb:", reverbPopUp,
232 B_FOLLOW_LEFT | B_FOLLOW_TOP);
233
234 reverbMenu->SetDivider(55);
235 reverbMenu->ResizeToPreferred();

на такой:

235 reverbMenu = new BMenuField("Reverb:", reverbPopUp, NULL);

Тоже самое сделаем с методом CreateInputMenu().

И, наконец, расширим конструктор ScopeView, чтобы в него влезал 18й шрифт. Это «дешёвый» способ, но он прекрасно работает. «Правильным» способом было бы добавление методов, которые сообщили бы разметчику минимальный, максимальный и желаемый размер этого элемента. В этой статье я не хочу на этом останавливаться, но, может, расскажу об этом позже.

Новый код MIDI плеера можно найти в репозитории Haiku в src/apps/midiplayer. Старый код можно найти там же, до ревизии 26408, когда я послал эти изменения.

Заключение

Если хотите найти идеи или советы о том, как использовать систему разметки, пока не будет написана исчерпывающая документация, посмотрите на тестовую программу Инго, которая называется LayoutTest1. Исходник её лежит в tests/kits/interface/layout/LayoutTest1.cpp и она может быть использована в Haiku добавлением вот такой строки в файл UserBuildConfig:

AddFilesToHaikuImage home config bin : LayoutTest1 ;

она может быть выполнена из треккера в /boot/home/config/bin или из терминала. Там также есть примеры построения GUI с использованием сборщиков и без, в зависимости от надобности.

Код всех классов разметчика лежит в Haiku Interface Kit, так что если вас он заинтересовал, смотрите заголовки Interface Kit-а в headers/os/interface и реализацию в src/kits/interface and src/kits/interface/layouter.

Предупреждение: поскольку эти классы новые и не тестировались с API, они считаются private API и должны использоваться только внутри Haiku, для встроенных приложений и панелей настройки. Это делается потому, что API может меняться, и может нарушить работу программ других людей (внутренние программы мы можем поправить сами). Поэтому, имейте ввиду: используя сейчас классы разметчика, у вас есть риск того, что в будущем код перестанет работать.

Ryan Leavengood

Архивы

Сентябрь 2007| Октябрь 2007| Январь 2008| Февраль 2008| Март 2008| Апрель 2008| Май 2008| Июнь 2008| Июль 2008| Август 2008