1

我刚刚开始摆弄编写 gnome-shell 扩展,并且想知道如何获取用户拥有的联系人列表。

我已经找到了一些可能的文件:gnome-shell/js/ui/contactDisplay.jsgnome-shell/src/shell_contact_system.c.

现在我注意到shell_contact_system.c以下函数:

/**
 * shell_contact_system_get_all:
 * @self: A #ShellContactSystem
 *
 * Returns: (transfer none): All individuals
 */
GeeMap *
shell_contact_system_get_all (ShellContactSystem *self)
{
  GeeMap *individuals;

  g_return_val_if_fail (SHELL_IS_CONTACT_SYSTEM (self), NULL);

  individuals = folks_individual_aggregator_get_individuals (self->priv->aggregator);

  return individuals;
}

这表明在 javascript 界面中我可以使用函数(我的信念被文件也有 a并演示了使用get_all的事实加强了),所以我尝试:.cshell_contact_system_get_individualcontactDisplay.jsShell.ContactSystem.get_default().get_individual

contactSys = Shell.ContactSystem.get_default();
// get contacts
contacts = contactSys.get_all();

有用!(我正在 Gnome-shell 的“镜子”javascript 解释器中尝试它)。

它似乎是一个“Gobject”,所以我不知道如何处理这个对象来获取我的联系人姓名。我注意到(从 C 代码)这个对象是 a GeeMap *,所以查看Gee.Map 的文档,我发现我可以执行以下操作:

contacts.size   // returns 31, which is the number of contacts I have !
contacts.values // is a Gee.Collection
contacts.keys   // is a Gee.Set

然后我尝试查看contacts.valuesand contacts.key,并注意到这些to_array()方法具有:

contacts.values.to_array()
contacts.keys.to_array()

但是,当我这样做时,我会得到一个空数组contacts.xxx.to_array().size是 0,但是contacts.size是 31 吗?!!

当我尝试使用 acontacts.map_iterator()遍历地图时也会发生同样的情况;it.get_value()并且it.get_key()似乎为空。

所以,我的问题是:如何访问 的各个元素contacts

我确实注意到评论shell_contact_system_get_allReturns: (transfer none): ...while shell_contact_system_get_individualsays Returns: (transfer full): ...,并且后一个功能有效(前提是我知道我要查找的个人的 ID,这是我的问题),而前者没有。这可能与它有关吗?

此外,作为一种解决方法,我目前可以使用contactSearchProvider该类来实现这一点(当您安装gnome-contacts可以键入联系人姓名的位置时,概览将使用该类,它们将出现在概览中)。我基本上搜索''哪个应该返回我每个联系人的列表。不过,这似乎是迂回的-我觉得我应该能够使用该get_all()方法来获取所有联系人,而无需搜索空字符串...

    const ContactDisplay = imports.ui.contactDisplay;
    cds = new ContactDisplay.contactSearchProvider;
    res = cds.getInitialResultSet(['']); 
    // woohoo! res.length is 31, and res[0], res[1], ... are all not null!

任何帮助将不胜感激(顺便说一句,是否有任何关于此的文档?当我盯着源代码并尝试从中推断出所有文档时,我感到非常不合适!)

4

1 回答 1

1

我相信这是一个错误,并且您已经找到了它的位置:C 方法上的注释应该说明Returns: (transfer full):以便将结果返回给绑定。

下一个合乎逻辑的步骤是向他们的 bugzilla 报告错误和补丁,但我需要注意代码在 gnome 3.6 中已删除,所以我怀疑它是否会被修复。

联系人搜索代码现在位于 gnome-contact 应用程序中:

http://git.gnome.org/browse/gnome-contacts

于 2012-10-04T06:53:46.680 回答