Доброго всем времени суток... Доделываю простенький текстовый редактор, добавил нумерацию строк для 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, код работает, номера строк выводятся, всё в порядке, проблема в том что если я начну скролом крутить вверх-вниз, то через некоторое время начинаются жуткие тормоза, начинает сильно тормозить интерфейс и шуршать винт. Вот думаю что не так сделал, в какую сторону покопать? :)


