LINUX.ORG.RU

Масштабирование текста в GtkTextView через свойство scale в GtkTextTag

 ,


1

2

Здравствуйте.
Пишу небольшую тулзу на С99 для себя. В ней есть GtkTextView с большим количеством текста. Ко всему тексту применяется GtkTextTag через gtk_text_buffer_apply_tag. Понадобилось масштабировать текст в каллбеке.
В каллбеке беру свойство scale у GtkTextTag и меняю его. Но текст после масштабирования режется, налезает друг на друга.(скрин ниже). По мимо этого при увеличении текста он уползает за нижнюю границу GtkTextView.
Возможно я делаю что то не так?
Свойство scale у GtkTextView помечено как RW. То есть я могу его менять.
Ссыль на скрин.

Ответ на: комментарий от ananas

Гитхаб
Каллбэк
В функции gboolean book_textview_scroll_event_cb(GtkTextView *text_view, GdkEventScroll *event, gpointer user_data) обрабатывается масштабирование шрифта.
Функция gtk_widget_queue_draw(GTK_WIDGET(text_view)); в каллбэке добавлена в качестве борьбы с наползанием строк друг на друга. Костыль.
Инициализация тега

Cactus64k
() автор топика
Ответ на: комментарий от Cactus64k

а почему ты решил, что это костыль? когда ты меняешь теги, состояние текста может измениться или нет. может измениться как в видимой, так и в иных частях GTkTextBuffer. и вполне логично, что в таких случаях инициатором перерисовки должно выступать приложение, чтобы избежать лишних телодвижений в библиотеке.

не нравиться gtk_widget_queue_draw - используй gtk_widget_queue_draw_area, или пуляй сигнал draw напрямую.

корявости у тебя возникают потому, что видимые границы буфера остались прежними, рассчитанными на одно форматирование. а ты его поменял. причем везде. потому должен и попросить пересчитать визуальное представление

ananas ★★★★★
()
Ответ на: комментарий от ananas

В принципе логично.
Цвет, например, меняется без перерисовки.
Думал и с размером будет так же.
Да и если перерисовывать только во время изменения, то корявости остаются, хоть и в меньшей степени. Приходится перерисовывать еще и при каждом скроле. Оно и без моего тычка должно перерисовываться, если не все, то вылезшая, новая часть текста точно.
Все это борьба не с причиной, а со следствием. Если изменить размер шрифта и потом поменять размер окна хотя бы на пиксел, то перерисовывать ничего не нужно. Даже текст вылазиет обратно из нижней границы GtkTextView.
Не менять же при каждом изменении шрифта размер окна?
Такое же поведение встречается в debian wheezy и jessie. Если это и баг, то очень долгоживущий.

Cactus64k
() автор топика
Ответ на: комментарий от Cactus64k

Методом научного тыка установлено, что эффект, подобный смене размеру окна, дает добавление символа в буфер. Нет ли более нормального способа пересчитать буфер?

Cactus64k
() автор топика
Ответ на: комментарий от ananas

К сожалению пользы от сигнала ноль.
Приделал костыль. Полет нормальный.

GtkAllocation size_allocation = {.width = gtk_widget_get_allocated_width(GTK_WIDGET(text_view))+1,
                                 .height = gtk_widget_get_allocated_height(GTK_WIDGET(text_view))};
gtk_widget_size_allocate(GTK_WIDGET(text_view), &size_allocation);

Cactus64k
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.