Getting list of contacts with Gnome-Shell JS inter

2019-05-31 08:58发布

I've just started fiddling with writing gnome-shell extensions, and would like to know how to get a list of contacts a user has.

I've tracked down some likely files: gnome-shell/js/ui/contactDisplay.js and gnome-shell/src/shell_contact_system.c.

Now I notice in shell_contact_system.c the following function:

/**
 * 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;
}

This suggests that inthe javascript interface I can use function get_all (my belief is reinforced by the fact that the .c file also has a shell_contact_system_get_individual and contactDisplay.js demonstrates the use of Shell.ContactSystem.get_default().get_individual), so I try:

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

It works! (I'm trying it out in Gnome-shell's "looking glass" javascript interpreter).

It appears to be a 'Gobject' so I have no idea what to do with this object to get the names of my contacts out. I notice (from the C code) that this object is a GeeMap *, so looking at the documentation for Gee.Map, I see I can do the following:

contacts.size   // returns 31, which is the number of contacts I have !
contacts.values // is a Gee.Collection
contacts.keys   // is a Gee.Set

I then try to look at contacts.values and contacts.key, noting the to_array() method these have:

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

However when I do this I get an empty array back out: contacts.xxx.to_array().size is 0, yet contacts.size is 31 ?? !!

The same occurs when I attempt to use a contacts.map_iterator() to iterate through the map; it.get_value() and it.get_key() appear to be null.

So, my question is: How can I access the individual elements of contacts?

I do note that the comment for shell_contact_system_get_all says Returns: (transfer none): ... whilst shell_contact_system_get_individual says Returns: (transfer full): ..., and the latter function works (provided I know the ID of the individual I want to look up, which is my problem), whereas the former doesn't. Could this be something to do with it?

Also, as a workaround, I can currently make use of the contactSearchProvider class to achieve this (used by the overview when you intall gnome-contacts where you can type the name of a contact and they'll appear in the overview). I basically search for '' which should return me a list of every contact. It seems roundabout though - I feel I should just be able to use the get_all() method to get all the contacts without having to search on an empty string...

    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!

Any help would be greatly appreciated (by the way, is there any sort of documentation about for this? I feel extremely inadequate when I stare at the source and try to deduce all the documentation from it!)

1条回答
Lonely孤独者°
2楼-- · 2019-05-31 09:41

I believe this is a bug and that you already found where it is: the annotation on the C method should say Returns: (transfer full): in order to give back results to the bindings.

The next logical step would be to report the bug and the patch to their bugzilla, but I need to note that code was removed in gnome 3.6 so I'm skeptical it will be ever fixed.

The contact search code now lives in the gnome-contact app at:

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

查看更多
登录 后发表回答