Я только начал возиться с написанием расширений 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).
Похоже, это «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): ...
, и последняя функция работает (при условии, что я знаю идентификатор человека, которого я хочу найти, что является моей проблемой), тогда как первая не работает. Может ли это быть как-то связано с этим?
Кроме того, в качестве обходного пути в настоящее время я могу использовать класс 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!
Любая помощь будет принята с благодарностью (кстати, есть ли какая-либо документация по этому поводу? Я чувствую себя крайне неадекватным, когда смотрю на источник и пытаюсь вывести из него всю документацию!)