LINUX.ORG.RU

[textview_expose] Тормоза после скролига...


0

1

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

★★★★★
Ответ на: комментарий от dmitry_vk

Доавил в конец функции(после cairo_destroy(cr)) строчку

 
g_free(layout); 

Теперь вообще при запуске вылетает :(

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

Т.е все объекты унаследованные от GObject нужно удалять через g_object_unref? (виджеты в том числе)

P.S. Сделал так, но не помогло, всё равно тормозит, хотя сейчас нужно подольше скролом крутить...

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

это потому, что не туда добавил. в случае

   if (event->window != win)
      return FALSE;
нифига высвобождаться у тебя не будет.

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

Этот код я подглядел в mousepad, там тоже ничего не освобождается... и не тормозит... сейчас сделал так:

if (event->window != win) { 
    g_object_unref(G_OBJECT(layout)); 
    cairo_destroy(cr); 
    return FALSE; 
} 
Тормозов действительно почти не стало, спасибо, только сейчас сижу думаю, нафига я вообще этот win написал, он же не используется... :)

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

используется. чтобы лишний раз не отрисовывать всякую дрянь, когда expose дергается для перерисовки другой части окна

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