1

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いるという事実によって私の信念が強化されています)。.cshell_contact_system_get_individualcontactDisplay.jsShell.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.keyto_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_individualReturns: (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!

助けていただければ幸いです(ちなみに、これに関するドキュメントはありますか?ソースをじっと見つめ、そこからすべてのドキュメントを推測しようとすると、非常に不十分だと感じます!)

4

1 に答える 1

1

これはバグであり、すでにどこにあるかを見つけたと思いReturns: (transfer full):ます。バインディングに結果を返すために、Cメソッドのアノテーションで言う必要があります。

次の論理的なステップは、バグとパッチをBugzillaに報告することですが、コードがgnome 3.6で削除されたことに注意する必要があるため、修正されるかどうかは疑問です。

連絡先検索コードは、次のgnome-contactアプリに存在するようになりました。

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

于 2012-10-04T06:53:46.680 に答える