Получение списка контактов с интерфейсом Gnome-Shell JS
Я только начал заниматься написанием расширений 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();
Оно работает! (Я пробую это в интерпретаторе javascript "зеркала" Gnome-shell).
Похоже, что это "объект", поэтому я понятия не имею, что делать с этим объектом, чтобы получить имена моих контактов. Я заметил (из кода 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): ...
и последняя функция работает (при условии, что я знаю идентификатор человека, которого я хочу найти, что является моей проблемой), тогда как первая - нет. Может ли это быть как-то связано с этим?
Кроме того, в качестве обходного пути, я могу в настоящее время использовать 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!
Любая помощь будет принята с благодарностью (кстати, есть ли какая-либо документация по этому поводу? Я чувствую себя крайне неадекватно, когда смотрю на источник и пытаюсь вывести из него всю документацию!)
1 ответ
Я считаю, что это ошибка, и вы уже нашли, где это: аннотация на метод C должен сказать Returns: (transfer full):
чтобы вернуть результаты в привязки.
Следующим логическим шагом было бы сообщить об ошибке и патче их bugzilla, но я должен отметить, что код был удален в GNOME 3.6, поэтому я скептически отношусь к тому, что он когда-либо будет исправлен.
Код поиска контактов теперь находится в приложении gnome-contact по адресу: