У меня такое чувство, что я могу что-то упустить с Панго. Кажется, что почти все в API направлено на отображение статического текста, за исключением двух функций для рисования / перемещения курсора в определенной позиции, что предполагает наличие встроенного способа для редактирования текста.
Например, чтобы пометить блок текста с помощью мыши (т. Е. Изменить цвет фона между двумя точками), я могу либо регенерировать текст с измененными тегами для каждого движения мыши, либо нарисовать прямоугольники в Каире, а затем использовать Pango, чтобы нарисовать текст с прозрачным фоном поверх. Есть ли способ применения атрибутов к диапазону без регенерации или перерисовки всего экрана?
Точно так же, если я заставлю Pango самостоятельно нарисовать курсор и обработать события нажатия клавиш, есть ли альтернатива перерисовке всего экрана?
GtkTextBuffer не является опцией — у меня нет всего текста в любое время, и гораздо эффективнее вычислить, что нужно отображать на лету, из компактного двоичного формата и используя постоянно меняющийся набор фильтров. Будучи раздутым, избыточным и не элегантным, он также фантастически медленный.
В отсутствие какой-либо документации, кроме самой редкой, я изучил источник GtkTextView (https://git.gnome.org/browse/gtk+/tree/gtk/gtktextview.c) чтобы увидеть, как макеты панго используются в самом GTK.
Может показаться, что рендеринг окна при каждом нажатии клавиши или изменении мышью отмеченной области — это наименьшая из его проблем, и оптимизация (хотя и менее гибкая, чем у GTK) выходит за рамки того, что они используют.
Например, маркировка текста включает в себя вставку тегов в дерево рендеринга, пересчет дерева, а затем двойную буферизацию вывода — то, что должно быть огромным излишним и зарезервировано для 3D-рендеринга. Прокрутка ускоряется, захватывая изображение вывода и затем отображая части текста.
Я полагаю, что полное решение состоит в том, чтобы переработать GtkTextBuffer / GtkTextView для более точного соответствия модели MVC и не требовать полного текста заранее, но сейчас я полагаю, что я буду придерживаться своей незначительной оптимизации отрисованного пользователем виджета.