我刚刚开始摆弄编写 gnome-shell 扩展,想知道如何获取用户拥有的联系人列表。
我已经追踪了一些可能的文件:gnome-shell/js/ui/contactDisplay.js
和gnome-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_individual
,contactDisplay.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.values
和contacts.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_individual
说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!
任何帮助将不胜感激(顺便问一下,是否有任何关于此的文档?当我盯着源头并试图从中推断出所有文档时,我感到非常不足!
这是一个错误,你已经找到了它的位置:C 方法上的注释应该说Returns: (transfer full):
,以便将结果返回给绑定。
下一个合乎逻辑的步骤是将错误和补丁报告给他们的 bugzilla,但我需要注意代码在 gnome 3.6 中删除,所以我怀疑它是否会被修复。
联系人搜索代码现在位于 gnome-contact 应用程序中,网址为:
http://git.gnome.org/browse/gnome-contacts