LINUX.ORG.RU

GtkNotebook - идентификация табов


0

0

Привет всем. Тут такой вопрос нарисовался: можно ли каждому табу в GtkNotebook присвоить уникальный идентификатор, что бы потом можно было его считать каким-либо образом ? Или там оно уже есть ?


Да можно конечно, если нужно. Я почему-то подозреваю, что не нужно. В любом случае, к любому объекту в gtk можно присоединить произвольные данные с помощью g_object_set_data (object, data) и потом их получать g_object_get_data (object, data)

Хотя обычно сам объект может служить идентификатором, можно использовать и такие конструкции: g_object_set_data (tab_label, GPOINTER_TO_INT(number)) g_object_get_data (tab_label, GINT_TO_POINTER(number))

anonymous
()

Сорри, конечно, немного не так: Да можно конечно, если нужно. Я почему-то подозреваю, что не нужно. В любом случае, к любому объекту в gtk можно присоединить произвольные данные с помощью

g_object_set_data (object, data)

и потом их получать

data = g_object_get_data (object)

Хотя обычно сам объект может служить идентификатором, можно использовать и такие конструкции:

g_object_set_data (tab_label, GINT_TO_POINTER(number));

number = GPOINTER_TO_INT(g_object_get_data (tab_label));

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

спасибо огромное, я подозревал про дополнительные данные, но не знал как оно делается.

ЗЫ. мне оно надо :)

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

Заодно вопрос вам, как знающему человеку :)

oid tabs_refresh()
{
	gint currpage;
	if (tab_fixed != 0)
	{	GdkPixbuf *sticon;
		gint pagecount = gtk_notebook_get_n_pages(GTK_NOTEBOOK(tab_fixed));
		for (int i=0; i<pagecount; i++)
		{	GtkWidget *child = gtk_notebook_get_nth_page(GTK_NOTEBOOK(tab_fixed),i); //get child from current page
			currpage = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(child),"id"));
			conversation *c = convo_find(0,currpage,1);
			sticon = status_icon(c->user->Status());
			const gchar *nick = s_convert_to_utf8(c->user->GetAlias(), c->user->UserEncoding()).c_str();
			GtkWidget *buf = pack_label(nick,sticon);
			gtk_notebook_set_tab_label(GTK_NOTEBOOK(tab_fixed),child,buf);
			g_free(buf);
			g_free(child);
		}
		g_free(&pagecount);
	}
	
}

что здесь может быть неправильно на первый взгляд ?

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

g_free(buf);
g_free(child);


Объекты типа widget не нужно освобождать при помощи g_free, их, скорее всего совсем не нужно освобождать, так как в gtk действует система автоматического освобождения памяти, занятой виджетами. Нужно почитать про ref counting.

GtkWidget *buf = pack_label(nick,sticon);

Объявления давать нужно в начале блока, все-таки некрасиво получается, да и gcc старый будет ругаться. 

g_free(&pagecount);

Ну а это вообще не в какие рамки С программирования не лезет. Зачем освобождать адрес статической переменной? Тем более, что память под нее не выделялась?

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

Просто я тута пытаюсь понять почему оно в Segmentation Fault вываливается, есть подозрение на то, что функция получения child или кол-ва страниц неправильно отрабатывают.

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

Да, и еще я подозреваю, что сама по себе функция convo_find не нужна. Я думаю, можно писать так

g_object_set_data (G_OBJECT(child),"conversation", c);

conversations *c = (conversation *) g_object_get_data (G_OBJECT(child),"conversation");

Без всяких преобразований в целые числа и обратно.

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

все g_free давно убрал, convo_find нужно, оно выполняет свою роль не только в этой функции. Я просто переделываю jons-gtk2-gui для licq. Там довольно специфичные фишки

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

вот за этот намек огромнейшее спасибо, сделал таким методом - все отлично запахало :)

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