LINUX.ORG.RU

GtkTextView, добавил нумерацию строк, но оно субъекивно подтормаживает :(


0

1

Кинул на форму GtkTextView, у него отпределил событие expose-event, пытаясь добавить нумерацию строк, нумерация работает, но почему-то, когда загружаешь текст, хотя бы в пару сотен строк, субъективно подтормаживает(прокручиваю скролом вверх-вниз) :( В чём может быть проблема? Может идеи подкините (за основу брал код из mousepad)

gboolean textview_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)

{
	GdkWindow 	* 	win;
	GtkTextIter 	iter; 
	GtkTextView * 	textview 		= GTK_TEXT_VIEW(widget);
	cairo_t 	* 	cr 				= gdk_cairo_create(event->window);	
	int 			layout_width	= 30;
	int 			yrange;
	int 			line_height;
	PangoLayout * 	layout 		= gtk_widget_create_pango_layout(widget, "");

	*/
	win = gtk_text_view_get_window(textview, GTK_TEXT_WINDOW_LEFT);
	if (event->window != win) {
		g_object_unref(G_OBJECT(layout));
		cairo_destroy(cr);
		return FALSE;
	}

	/* 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-5, yrange-ph);
		pango_cairo_show_layout(cr, layout);
		gtk_text_iter_forward_line(&iter); 
		g_free(line_num_str);
	} 
	g_object_unref(G_OBJECT(layout));
	cairo_destroy(cr);
	return FALSE;

}


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

Это да, просто аналогично рисуется в Mousepad, но там почему-то не торозит (. А есть способ рисовать только на видиой области?

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

просто аналогично рисуется в Mousepad

Ничего подобного. От какой версии у тебя сырцы?

но там почему-то не торозит

Потому-что там определется число линий, видимых на экране.

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

Точно не скажу, была какая-то 0.2.< какая-то там>, или даже более ранняя. Просто этот код лежал уменя в загажнике почти год, сейчас вот достал, думаю допилить :) В сырцах mousepad это дело находится в файле linenum.c. Там есть функция get_lines, которая крутит до конца текста,

while(!gtk_text_iter_is_end(&iter)) {
...
}
и заполняет массив. Потом по этому массиву рисуются номера строк. А у меня по сути функция «get_lines» выкинута, а цикл while крeтится непосредственно в expose.

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

Там есть функция get_lines, которая крутит до конца текста

Опять ты обманываешь. Внутре цикла есть проверка на выход за пределы видимости:

if ((y + height) >= y2)
break;

Возьми свежий код и сделай по подобию.

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

Ааа.. вон оно чё, не досморел... ох уж эта невнимательность. Благодарю, буду переделывать по аналогии :)

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