我刚刚开始摆弄编写 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 界面中我可以使用函数(我的信念被文件也有 a并演示了使用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 代码)这个对象是 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.values
and 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_all
说Returns: (transfer none): ...
while shell_contact_system_get_individual
says 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!
任何帮助将不胜感激(顺便说一句,是否有任何关于此的文档?当我盯着源代码并尝试从中推断出所有文档时,我感到非常不合适!)