Ich habe gerade angefangen, mit gnome-shell Erweiterungen zu schreiben, und würde gerne wissen, wie man eine Liste von Kontakten bekommt, die ein Benutzer hat.Kontaktliste mit Gnome-Shell JS-Schnittstelle
Ich habe einige wahrscheinliche Dateien gefunden: gnome-shell/js/ui/contactDisplay.js
und gnome-shell/src/shell_contact_system.c
.
Jetzt merke ich in shell_contact_system.c
folgende Funktion:
/**
* 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;
}
Dies legt nahe, dass inder JavaScript-Oberfläche I Funktion können get_all
(mein Glaube durch die Tatsache verstärkt, dass die .c
Datei hat auch ein shell_contact_system_get_individual
und contactDisplay.js
demonstriert die Verwendung von Shell.ContactSystem.get_default().get_individual
), so versuche ich:
contactSys = Shell.ContactSystem.get_default();
// get contacts
contacts = contactSys.get_all();
Es funktioniert! (Ich probiere es in Gnome-Shells "Schauglas" Javascript-Interpreter aus).
Es scheint ein "Gobject" zu sein, also habe ich keine Ahnung, was ich mit diesem Objekt machen soll, um die Namen meiner Kontakte zu erhalten. I (aus dem C-Code) feststellen, dass dieses Objekt ein GeeMap *
ist, so am documentation for Gee.Map sucht, sehe ich mir folgende tun:
contacts.size // returns 31, which is the number of contacts I have !
contacts.values // is a Gee.Collection
contacts.keys // is a Gee.Set
Ich versuche dann bei contacts.values
und contacts.key
zu suchen, unter Hinweis auf die to_array()
Methode diese haben:
contacts.values.to_array()
contacts.keys.to_array()
jedoch, wenn ich dies tun, erhalte ich ein leeres Array wieder aus: contacts.xxx.to_array().size
0, doch contacts.size
ist 31 ?? !!
Das gleiche tritt auf, wenn ich versuche, eine contacts.map_iterator()
zu verwenden, um durch die Karte zu iterieren; it.get_value()
und it.get_key()
scheinen null zu sein.
Also, meine Frage ist: Wie kann ich auf die einzelnen Elemente von contacts
zugreifen?
Ich beachten Sie, dass der Kommentar für shell_contact_system_get_all
sagt Returns: (transfer none): ...
während shell_contact_system_get_individual
sagt Returns: (transfer full): ...
, und diese Funktion ist (vorausgesetzt, ich weiß, die ID des einzelnen Ich möchte sehen, was mein Problem ist), während die ehemaligen doesn t. Könnte das etwas damit zu tun haben?
Auch als Workaround kann ich derzeit die Klasse verwenden, um dies zu erreichen (von der Übersicht verwendet, wenn Sie gnome-contacts
eingeben, wo Sie den Namen eines Kontakts eingeben können und sie in der Übersicht angezeigt werden). Ich suche im Grunde nach ''
, die mir eine Liste von jedem Kontakt zurückgeben sollte. Es scheint Kreisverkehr aber - ich glaube, ich sollte nur in der Lage sein, die get_all()
Methode zu verwenden, um alle Kontakte zu erhalten, ohne auf eine leere Zeichenkette suchen zu müssen ...
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!
Jede mögliche Hilfe (übrigens sehr geschätzt Gibt es irgendeine Art von Dokumentation dafür? Ich fühle mich extrem unzulänglich, wenn ich auf die Quelle starre und versuche, die gesamte Dokumentation daraus abzuleiten!)
Ja, dachte so viel (Ich fragte um die # gnome-shell einmal und im Grunde die gobject Unterstützung für Folks/Gee war nicht sehr komplett - überrascht mich nicht, dass sie es fallen gelassen haben) –