Как я могу получить полный сериализованный текст из Gtk.Просмотр текста в Вале?

#gtk3 #vala

Вопрос:

У меня есть приложение Vala/Gtk3, которое включает виджет Textview, а также следующий фрагмент кода…

 Gtk.TextIter start_iter;
Gtk.TextIter end_iter;
var format = textview.buffer.register_serialize_tagset(null);
textview.buffer.get_start_iter(out start_iter);
textview.buffer.get_end_iter(out end_iter);
var text = (string) textview.buffer.serialize(textview.buffer, format, start_iter, end_iter);
print(text   "n");
 

Этот код должен сериализовать содержимое буфера textview в собственный внутренний формат Gtk, показывающий текст и любые применяемые текстовые теги; однако при запуске выводится только следующее:

 GTKTEXTBUFFERCONTENTS-0001
 

При поиске в Интернете выясняется, что это всего лишь заголовок XML. За ним должен следовать XML, представляющий содержимое буфера textview. У кого-нибудь есть идея, почему я не получаю полный вывод? Просто основываясь на том, с чем я столкнулся в Интернете, я считаю, что сопоставимый код работает на Python.

Ответ №1:

Я нашел решение. Похоже, что для того, чтобы использовать массив, возвращаемый сериализацией, вы должны относиться к нему так, как будто он начинается с символа 31. Это выводит вас за пределы первой строки (которая, по-видимому, заканчивается нулем?) и в нужные данные. Таким образом, исправленная версия моего исходного кода выглядит следующим образом…

 Gtk.TextIter start_iter;
Gtk.TextIter end_iter;
textview.buffer.get_start_iter(out start_iter);
textview.buffer.get_end_iter(out end_iter);
var format = textview.buffer.register_serialize_tagset("my-tagset");
var data = textview.buffer.serialize(textview.buffer, format, start_iter, end_iter);
var sub_arr = data[31:];
print((string) sub_arr   "n");
 

И да, я рассматриваю заголовок XML как имеющий постоянную ширину здесь. Хотя я подозреваю, что это выполнимо, время может доказать обратное.

Комментарии:

1. Вы полагаетесь на внутренний формат данных, который представляет собой не строку, а несколько необработанных байтов. Это значит напрашиваться на неприятности. Я бы посоветовал вам придумать другое решение.