LINUX.ORG.RU

[vala] Как управлять стилем текста GtkEntry

 ,


0

0

Задача такая - пользователь вводит текст в GtkEntry и нужно сделать подчеркивание ошибок, подсветку парных скобок и может другие вкусности.

Я так понял это можно сделать используя gtk_entry_get_layout и gtk_entry_text_index_to_layout_index. Но PangoLayout у GtkEntry постоянно изменяется и нужно как-то вовремя обновлять его.

Посмотрел исходники виджета SexySpellEntry, там при инициализации класса сохраняют наследуемую реализацию GtkEntry::expose_event в глобальной переменной и пишут свой expose_event, который после вызывает старый.

Но это Си. Я пишу на vala, как такой трюк сделать там? Пробовал на expose_event подцепить свой обработчик через Signal.connect_after, но при изменении текста стиль обновляется только после мигания курсора.

Как последний вариант думаю написать эту часть на Си, но это не слишком удобно - придётся один класс на vala делать доступным через хедеры, писать vapi, добавлять код в Makefile, добавлять свой класс в glade.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

вешай на «changed» и «move-cursor»

ananas ★★★★★
()

Я не особо разбираюсь в Vala, но разве нельзя просто перекрыть expose_event? Она ж виртуальная.

public virtual signal bool expose_event (Gdk.EventExpose event);

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

Так при этом нужно вызывать наследуемую реализацию expose_event, ((Gtk.Entry) this).expose_event у меня вроде не прокатывало. Там для виртуальных signal-ов vala мутит не просто вызовы, а emit и connect-ы, может из-за этого.

Сигналов changed, move-cursor не достаточно, еще кучу всего похоже надо (например для мыши). Думаю это костыль.

Придется похоже эту часть на Си написать.

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

для мыши есть motion-notify. а expose - перерисовка виджета при необходимости. и навешивать на этот сигнал подобную логику - попахивает хаком и может иметь непредсказуемые побочные эффекты с разными движками gtk тем

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

Решил проблему навешиванием обработчика на GtkWidget::event. Этого оказалось достаточным для всех случаев. Хотя, скорее всего, это хак.

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