Доброго времени суток, сделал в gtktextview нумерацию строк, всё работает, но проблема в том что когда я проматываю текст скролом(ползунком сбоку) нумерация «смазывается», номера встают один на другой, стираются и т.д , достаточно развернуть окно или наоборот его свернуть и всё становится нормально, т.е виджет перерисовывается и всё становится ок, gtktextview лежит в gtkscrolledwindow, как лечить? Добавлять в обработчике scroll-child вызов функции отрисовки textview-a?
Вот код события перерисовки gtktextview:
gboolean textview_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
cairo_t * cr = gdk_cairo_create(event->window);
GtkTextView * textview = GTK_TEXT_VIEW(widget);
GtkTextIter iter;
int layout_width;
int col = 4; /* line number rectangle will be include 4 digits only */
int margin = 5;
char * empty_str = g_strnfill(col, 0x30);
int yrange;
int line_height;
PangoLayout * layout = gtk_widget_create_pango_layout(widget, empty_str);
g_free (empty_str);
pango_layout_get_pixel_size(layout, &layout_width, NULL);
gtk_text_view_set_left_margin(GTK_TEXT_VIEW(textview), layout_width+margin+1);
/* draw left rectangle for line numbers */
cairo_set_source_rgb(cr,0.85,0.85,1);
cairo_set_line_width(cr, 1);
cairo_rectangle(cr, 0,event->area.y, layout_width+margin, event->area.height);
cairo_fill_preserve(cr);
/* draw line numbers */
cairo_set_source_rgb(cr,0.5,0.5,0.5);
gtk_text_view_get_line_at_y(textview, &iter, event->area.y, NULL);
while(!gtk_text_iter_is_end(&iter)) {
gtk_text_view_get_line_yrange(textview, &iter, &yrange, &line_height);
int line_number = gtk_text_iter_get_line(&iter);
char * line_num_str = g_strdup_printf ("%d", line_number+1);
pango_layout_set_text(layout, line_num_str, -1);
int ph = pango_layout_get_height(layout);
int pw = pango_layout_get_width(layout);
pango_layout_get_pixel_size(layout, &pw, NULL);
cairo_move_to(cr, layout_width-pw, yrange-ph);
pango_cairo_show_layout (cr, layout);
gtk_text_iter_forward_line(&iter);
g_free(line_num_str);
}
cairo_destroy(cr);
return FALSE;
}