[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Замяна на gtk_action_disconnect_proxy
From: |
Yavor Doganov |
Subject: |
Замяна на gtk_action_disconnect_proxy |
Date: |
Wed, 19 Aug 2009 16:03:36 +0300 |
User-agent: |
Wanderlust/2.15.6 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.7 Emacs/23.1 (i486-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) |
От вчера си блъскам главата как да избегна употребата на
gtk_action_disconnect_proxy в Kazehakase. Тази функция се води
остаряла от 2.16 нагоре и според документацията трябва да се използва
gtk_activatable_set_related_action.
Kz използва -DGTK_DISABLE_DEPRECATED в CPPFLAGS, което скрива
декларацията и води до следното предупреждение:
kz-actions.c: In function 'kz_actions_remove_smartbookmarks':
kz-actions.c:2719: warning: implicit declaration of function 'gtk_action_discon\
nect_proxy'
Това може да е проблем при някои архитектури, където размера на
указателя e по-голям от размера на int (ia64, amd64). В Дебиан (при
ia64 специално) автоматично проверяват логовете за такива косвени
преобразувания, т.е. това ще бъде FTBFS на ia64 и много вероятно
SIGSEGV ако тази порция от кода се изпълни.
Лесният вариант е да разкарам всички *_DISABLE_DEPRECATED, чиято
употреба по принцип е глупава идея освен ако един проект не се развива
бурно и непрекъснато изисква все по-нови версии на библиотеките.
Другият е да се мигрира към новата функция. Не ми стана ясно от
документацията как точно трябва да стане това -- как и къде се
инициализира GtkActivatable, свойството "related-action" и т.н.
Киров, Ивайло -- помощ! :-)
Ето я функцията на Kz, където се използва това (преформатирах я в стил
GNU с цел по-добра четимост):
void
kz_actions_remove_smartbookmarks (KzWindow *kz, KzBookmark *bookmark)
{
GList *children, *node;
children = kz_bookmark_folder_get_children (KZ_BOOKMARK_FOLDER (bookmark));
for (node = children; node; node = g_list_next (node))
{
gpointer p;
guint id;
gchar *action_name;
const gchar *title;
GtkAction *action;
GSList *p_node, *proxies;
KzBookmark *child = node->data;
if (!KZ_IS_SMART_BOOKMARK (child) && !kz_bookmark_is_folder (child))
continue;
title = kz_bookmark_get_title(child);
if (title && g_str_has_prefix (title, "LocationEntry"))
action_name = g_strdup ("LocationEntry");
else
action_name = g_strdup_printf ("SmartBookmark:%p", child);
action = gtk_action_group_get_action (kz->actions, action_name);
if (!action)
continue;
proxies = gtk_action_get_proxies (action);
if (proxies)
{
GSList *copy;
/* disconenct proxy explicitly */
copy = g_slist_copy (proxies);
for (p_node = copy; p_node; p_node = g_slist_next (p_node))
{
if (p_node->data && GTK_IS_WIDGET (p_node->data))
{
gtk_action_disconnect_proxy (action,
GTK_WIDGET (p_node->data));
}
}
g_slist_free (copy);
}
if (title && g_str_has_prefix (title, "LocationEntry"))
{
g_free (action_name);
continue;
}
/* remove old one */
p = g_object_get_data (G_OBJECT (action), action_name);
if (p)
{
id = GPOINTER_TO_UINT (p);
gtk_ui_manager_remove_ui (kz->menu_merge, id);
}
g_free (action_name);
}
g_list_free(children);
}
- Замяна на gtk_action_disconnect_proxy,
Yavor Doganov <=