Я делаю программу для рисования векторной графики поверх программы GTK, написанной на Haskell.
Я обновил свою программу до библиотеки ги-гтк вместо Gtk2H в пользу Gtk3, и когда я вижу учебник/пример о рисовании в окнах Gtk с помощью cairo и/или диаграмма, оба Ги-Каир и Каир (из Gtk2Hs) необходимы одновременно.
Для примера я вижу:
import GI.Gtk
import qualified GI.Cairo (Context(..))
import qualified Graphics.Rendering.Cairo as Cairo
import qualified Graphics.Rendering.Cairo.Internal as Cairo (Render(runRender))
import qualified Graphics.Rendering.Cairo.Types as Cairo (Cairo(Cairo))
и я не понимаю, почему GI.Cairo
(Ги-Каир) и Graphics.Rendering.Cairo
(Каир) нужно импортировать одновременно.
GI.Cairo
стремится заменить Graphics.Rendering.Cairo
или дополнить его?
Graphics.Rendering.Cairo
все еще обновляется или лучше использовать другую библиотеку?
Любая информация/объяснения об этих двух библиотеках будет полезна.
@ДэниелВагнер. Я не видел, чтобы было две версии gtk2hs
: libghc-gtk-dev
и libghc-gtk3-dev
. Благодарю вас !
TL;DR: считает все, что основано на GTK2HS, устаревшим. Вместо этого используйте вещи с префиксом gi-
.
Изначально были Библиотеки GTK2HS, которые представляли собой вручную написанную привязку к GTK (думаю, не уверен в деталях).
Частью этих усилий была привязка к Каирская библиотека. Все функции Cairo принимают объект контекста Cairo в качестве аргумента, который используется для переноса состояния, такого как текущий цвет и стиль линии. Связывание Haskell оборачивает это, используя монаду Reader внутри нового типа Render
, поэтому вам не нужно беспокоиться об объекте контекста.
Однако поддержание этого было медленным и мандраульным, и был очевидный лучший способ: GTK имеет встроенную поддержку других языковых привязок, предоставляемых метаданными, встроенными в исходный код. Таким образом, вполне возможно автоматически сгенерировать все привязки GTK, а также распространить это на другие библиотеки, использующие систему метаданных GTK. Это то, что делают gi-gtk
и его родственники.
К сожалению, Каир так не работает. Он не включает метаданные GTK для фактического API рисования, поэтому gi-cairo
интерфейс ни для чего не нужен.
Некоторое время единственным способом обойти это было ручное устранение разрыва между семейством gi-gtk и библиотекой GTK2HS Cairo, но больше нет. Теперь есть полное решение:
Библиотека gi-cairo-render
, которая по сути такая же, как старая библиотека GTK2HS, но использует версию объекта контекста gi-cairo.
Связанная библиотека gi-cairo-connector
, которая позволяет переключаться между функциями, требующими явного объекта контекста Cairo, и функциями, работающими в Render
монаде.
Вам чаще всего нужен явный контекст Cairo для рисования текста с помощью Pango. В библиотеке Pango есть свой собственный объект Context (как ни странно, оба типа называются Context
, и вы должны импортировать их квалифицированными для устранения неоднозначности). Вы получаете контекст Pango из контекста Cairo, используя createContext
, и чтобы сделать это в середине действия Render
, вы должны извлечь текущий контекст из монады Render, используя одну из функций Соединитель.
Код, который вы цитируете, использует старый ручной бодж; внутренние функции Render
и runRender
используются для доступа к контексту Cairo в версии привязки Cairo для GTK2HS. Если вы посмотрите на код, который вызывает эти функции, вы, вероятно, увидите, что он делает что-то небезопасное с указателями для принуждения между типом GI.Cairo.Context
и типом контекста Graphics.Rendering.Cairo.Types.Cairo
, которые оба указывают на одно и то же под капотом.
Я не знаю
gi-cairo
ситуации. Но Gtk2Hs прекрасно поддерживает gtk3 (через пакет gtk3 Haskell).