LINUX.ORG.RU

[GtkTextView] «Замазываются» номера строк


0

1

Доброго времени суток, сделал в 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;
}
★★★★★

у тебя велосипед с квадратными колесами

используй GtkSourceView или же нумерацию делай через GtkTextMark

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

Мне нужна нумерация и простенькая подсветка синтаксиса(основные элементы), поэтому в данном случае предпочел сделать велосипед, да и «полегче» думаю будет :)

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

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

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

Разве? Есть два варианта: 1) Брать GtkSourceView и использовать его, тогда придется таскать эту библиотеку с собой 2) Добавить нужный функционал самому, думаю что для подстветки и нумерации строк кода много не потребуется + не нужно будет таскать стороннюю либу с собой.

P.S. Чем итераторы отличаются от textmarks и как их использовать в данном случае?

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

>GtkSourceView

ах, да, забыл, этот виджет идет отдельной либой. но какой смысл от нее отказываться? она достаточно популярна и я слабо верю в десктоп-систему без этой либы, покуда она используется ооооочень много где.

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

походу, кастрированный встраиваемый вариант gtksourceview есть в исходниках medit. можно там посмотреть

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

> Чем итераторы отличаются от textmarks и как их использовать в данном случае?

доку почитать влом? грубо говоря, итератор - любая часть текста, тобой определенная, textmarks - строки, требующие какой-то пометки, для каковых пометок в gtktextview есть специально отведенная область.

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