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();
できます!(私はGnome-shellの「lookingglass」javascriptインタープリターで試してみています)。
これは「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()
aを使用してマップを反復処理しようとしたときにも同じことが起こります。it.get_value()
そしてit.get_key()
nullのように見えます。
だから、私の質問は:どうすればの個々の要素にアクセスできますcontacts
か?
のコメントは、との間に言うことshell_contact_system_get_all
に注意してください。後者の機能は機能します(検索したい個人のIDがわかっている場合、これが私の問題です)が、前者は機能しません。これはそれと関係があるのでしょうか?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!
助けていただければ幸いです(ちなみに、これに関するドキュメントはありますか?ソースをじっと見つめ、そこからすべてのドキュメントを推測しようとすると、非常に不十分だと感じます!)