2016-07-29 9 views
0

Я просто нарисовать конкретное содержание в GtkTextView в «рисовать» сигнал,Рисунок в GtkTextView, то очистка

на следующей эмиссии сигнала рисую разные вещи в GtkTextView.

В следующем вызове сигнала, если нет ничего, чтобы его нарисовать, он очищает все предыдущие чертежи, что хорошо.

Но когда он собирается нарисовать новый контент, он рисует все предыдущие одновременно, а не только необходимый. Это нехорошо.


Я пробовал много вещей, чтобы предотвратить такое поведение, все возможные комбинации с cairo_save() и cairo_restore(), кажется, не делает это.

Как я могу заставить его не рисовать каждый предыдущий рисунок сразу, а только новый?

+0

Почему вы возитесь с сигналом ничьей GtkTextView? Я не уверен, что это поддерживается GTK. Во всяком случае, как вы вызываете перерисовки? Вы называете что-то вроде https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-queue-draw? –

+0

Это единственный способ редактировать собственный cajro_t виджета. Я подключаю сигнал и проверяю состояние проверки. Это ведет себя странно, и я не могу этого понять. Не могу понять, что это шаблон вообще. Он ничего не будет рисовать в первый раз, сигнал должен быть испущен несколько раз, чтобы получить контент. очередь в очереди делает незначительную разницу, но я все равно использую ее. Я думаю, что сигнал излучается очень часто, в основном из-за анимации курсора. (blinking/state w/e) – Malina

+0

@UliSchlachter Я хочу, чтобы он рисовал разные вещи, один раз, каждый раз, когда я хочу и очищаю предыдущие рисунки. Независимо от того, что я пробовал, он уже делает это, но всегда что-то не так. – Malina

ответ

0

Сигнал «ничьей» должен использоваться только для изменения внешнего вида GtkTextView.


За то, что я хочу, это может работать в соответствии с просьбой:

void draw_on_textview (GtkWidget* textview) 
{ 
    cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(textview)); 

    // Do ALL the drawing AT ONCE here.. 

    cairo_destroy(cr); 
} 

Когда содержание должно быть удалено:

gtk_widget_queue_draw(textview); 

Однако это все еще немного отличается, чем подход. Как указано в @jcoppens, вместо этого следует использовать draw_layer. Поэтому я не считаю это ответом, а некоторым возможным подходом, который я мог бы использовать в качестве альтернативы, если больше нет другого, чтобы обеспечить лучший способ.