2012-04-14 10 views
1

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!)

Antwort

1

Ich glaube, das ist ein Fehler, und Sie haben bereits gefunden, wo es ist: Die Annotation auf der C-Methode sollte Returns: (transfer full): sagen, um Ergebnisse zu den Bindungen zurückzugeben.

Der nächste logische Schritt wäre, den Bug und den Patch an ihr Bugzilla zu melden, aber ich muss beachten, dass Code in gnome 3.6 entfernt wurde, also bin ich skeptisch, dass es jemals behoben wird.

Der Kontaktsuchcode nun in der gnome-Kontakt-App an lebt:

IRC

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

+0

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) –

Verwandte Themen