Доброго всем времени суток... Доделываю простенький текстовый редактор, добавил нумерацию строк для GtkTextView, для этого подцепился к событию expose виджета и в нём рисую номера:
gboolean textview_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
GtkTextView * textview = GTK_TEXT_VIEW(widget);
GdkWindow * win ;
cairo_t * cr = gdk_cairo_create(event->window);
GtkTextIter iter;
int layout_width;
int col = 5; // line number rectangle will be include 5 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_border_window_size(GTK_TEXT_VIEW (textview),
GTK_TEXT_WINDOW_LEFT,
layout_width+margin);
win = gtk_text_view_get_window(textview, GTK_TEXT_WINDOW_LEFT);
if (event->window != win)
return FALSE;
// draw left rectangle for line numbers
cairo_set_source_rgb(cr,0.90,0.90,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);
gtk_text_view_buffer_to_window_coords(textview, GTK_TEXT_WINDOW_TEXT, 0, yrange, NULL, &yrange);
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;
}
TextView лежит в GtkScrolledWindow, код работает, номера строк выводятся, всё в порядке, проблема в том что если я начну скролом крутить вверх-вниз, то через некоторое время начинаются жуткие тормоза, начинает сильно тормозить интерфейс и шуршать винт. Вот думаю что не так сделал, в какую сторону покопать? :)