GUI-SDL2 – GUI написанный на Haskell. Часть 0. Введение. Первый helloworld
Запись от Curry размещена 21.06.2018 в 17:01
Показов 2981
Комментарии 0
|
Предпосылки к разработке GUI
Нормального, кроссплатформенного, графического интерфейса в настоящий момент для Haskell нет. Имеющиеся обёртки к сишным либам (GTK+, WxWidgets) оставляют желать лучшего, мягко говоря. С каждой новой версией и сишной библиотеки, и обёртки вылезают баги их совместимости. Особенно это заметно под Windows, т.к. под этой ОС авторы обёрток не привыкли их проверять.
Выбор
И так, я стал выбирать как можно более низкоуровневую кроссплатформенную библиотеку с тем, что бы она наименее мешалась, а практический весь GUI реализовать на Haskell поверх неё. Такой подход, как я предполагаю, максимально снизит «обёрточные» проблемы, или, если угодно, они будут сосредоточены в одном Haskell пакете (или нескольких взаимосвязанных) где фиксить их будет куда проще. Кроме того, разработка новых компонент GUI-я, так же будет происходить в рамках одного языка, что, очевидно, удобнее.
Из рассматриваемых кандидатов я отклонил OpenGL как очень избыточную для целей обычного (2D) интерфейса. К тому же она медленна под Windows. От использования браузера через JavaScript я отказался на основании некоторых, накладываемых на такой интерфейс ограничений. Реализации такого типа графических интерфейсов на Haskell есть. И пусть. Но нужен и не браузерный вариант. Выбор я остановил на библиотеке SDL2. И, хотя это мультимедийная библиотека, якобы заточенная под геймдев, мне в ней понравился простой API для работы с окнами, мышью и клавиатурой. Под винду она использует DirectX (хотя может и OpenGL), под другие ОС только OpenGL. Допускается создание любого числа окон операционной системы, получение сообщений от устройств ввода через очередь сообщений. SDL2 умеет работать с весьма ограниченным набором примитивов и текстурами. Рендеринг текста и загрузка изображений из многих графических форматов реализована сопутствующими сишными библиотеками SDL_ttf и SDL2_image так же используемыми в GUI-SDL2. Предварительно нужно установить свежий stack, а с помощью него ghc и msys2, сишные библиотеки и Haskell-обёртки к ним. Тут описывается как это сделать. Сам пакет GUI-SDL2 доступен по адресу https://github.com/KolodeznyDiver/GUI-SDL2. Исходники прокомментированы на (плохом) русском языке. Далее я предполагаю что, если вы хотите ознакомится с GUI-SDL, то вы его скачаете куда то на свой диск.
То есть, если GUI-SDL распаковали в каталог /foo/bar, и там теперь есть подкаталог GUI-SDL2, то учебный проект тоже будем создавать в /foo/bar, хотя создать учебный проект можно где угодно. Разница будет только в указании пути к каталогу GUI-SDL2 в stack.yaml. Находясь во внешнем каталоге (/foo/bar) выполняем
Переходим в созданный подкаталог GUI-SDL2-tutorial. В stack.yaml , после строк
Для windows, после строки
stack.yaml целиком. На момент написания письма с lts-16.5
В package.yaml потребуется больше изменений. Во первых строка
-Wall включает большинство предупреждений. -Wname-shadowing – дополнительно включает предупреждение о затенении имени (в том числе и имени из подключенных модулей). -fwarn-tabs – предупреждает об использовании символа табуляции. В исходниках на Haskell они противопоказаны. -Werror – прекратить дальнейшую компиляцию если в модуле были предупреждения (так, как если бы это были ошибки). Шаблон проекта предполагает что мы будем создавать одно приложение и его исходники будут находится в подкаталоге src. Я же предлагаю сделать один проект на много учебных приложений. Опишем первое приложение в файле package.yaml . После строки executables: удаляем всё, и, соблюдая отступы, добавляем
package.yaml целиком
Создаём подкаталог 0.HelloWorld в проекте, А в нём файл Main.hs с минимальным содержанием позволяющим отобразить "Hello world" – в данном случае, в заголовке окна.
Осталось, находясь в каталоге проекта GUI-SDL2-tutorial, собрать и запустить новое приложение с именем 0.HelloWorld. Примечание для пользователей win 7-8.1: С недавних пор ghc стал выводить в консоль цветные сообщения используя ANSI escape-последовательности. Под Windows нужно или отключить эту возможность ключом --color never, или использовать отдельно устанавливаемую программу терминала с поддержкой ANSI. hardentoo рекомендует https://conemu.github.io/ru/index.html. На win 10 escape-последовательности в консоли штатно поддерживаются. И так, выполняем
Продолжение следует. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Размещено в GUI-SDL2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


