Процесс создания собственных декларативных виджетов в библиотеке gi-gtk-declarative не так уж и сложен. Его можно разбить на следующие шаги:

  1. Измышление механики будущего виджета, понимание нижележащих GTK-виджетов, его составляющих
  2. Описание типа меняемых пользователем параметров (properties) виджета - для установления чистой функциональной зависимости от структуры пользователя.
  3. Описание типа всех событий (events), которые будет генерировать виджет (например, в ответ на срабатывания сигналов внутренних GTK-виджетов или достижения определённых состояний автомата логики)
  4. Описание внутреннего стэйта нашего виджета (например, поддерживание набора составляющих низкоуровневых GTK-виджетов для доступа к их состояниям)
  5. Создание пяти функций, необходимых для конструирования значения типа CustomWidget widget customData event (что в свою очередь даст нам искомый Widget event):
data CustomWidget widget customData event =
  CustomWidget
  { customWidget :: Gtk.ManagedPtr widget -> widget
  , customCreate :: customData -> IO SomeState
  , customPatch :: SomeState -> customData -> customData -> CustomPatch widget customData
  , customSubscribe :: customData -> widget -> (event -> IO ()) -> IO Subscription
  , customData :: customData
  } deriving (Functor)

i. customWidget содержит конструктор настоящего top-level GTK-виджета нашего виджета ii. customCreate описывает процесс изначального создания виджета: создание всех составляющих GTK-виджетов, помещения в GTK-контейнеры и т.д. GTK StyleContext и начальный внутренний стэйт также задаются как результат этой функции. iii. customPatch вычисляет низкоуровневый патч к GTK+ из новых (данных сейчас) параметров и текущих (уже отрисованных) параметров и внутреннего стэйта виджета iv. customSubscribe создаёт подписку на события (events) нашего виджета (т.е. описывает то, каким образом и на каком основании виджет генерит свои события) v. customData всегда содержит текущие параметры виджета

  1. Создание функции из параметров нашего виджета в тип Widget widget, которая собственно и будет применяться пользователем для встраивания декларативного виджета в другие виджеты. Это и есть чистая функциональная (декларативная) зависимость виджета от структуры данных – смысл библиотеки gi-gtk-declarative. Уравнение данной функции тривиально, когда мы имеем всё вышеперечисленное в пунктах 1-4.
  2. Создание константы с готовыми параметрами виджета по-умолчанию (для удобства использования).

Такова теория. Насколько я успел познакомиться с библиотекой.