gug-bg-herd
[Top][All Lists]
Advanced

[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);
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]