使用 Gnome-Shell JS 界面获取联系人列表



我刚刚开始摆弄编写 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界面中我可以使用函数get_all(我的信念得到了以下事实的加强:.c文件也有一个shell_contact_system_get_individualcontactDisplay.js演示了Shell.ContactSystem.get_default().get_individual的使用),所以我尝试:

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

它有效!(我正在Gnome-shell的"镜子"JavaScript解释器中尝试它)。

它似乎是一个"Gobject",所以我不知道如何处理这个对象来获取我的联系人姓名。我注意到(从 C 代码中)这个对象是一个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.valuescontacts.key,并指出它们具有to_array()方法:

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

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

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

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

我确实注意到shell_contact_system_get_all的评论说Returns: (transfer none): ...,而shell_contact_system_get_individualReturns: (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!
任何

帮助将不胜感激(顺便问一下,是否有任何关于此的文档?当我盯着源头并试图从中推断出所有文档时,我感到非常不足!

我相信

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新