3

ドキュメントには次のことが記載されていSourceCompletionProviderます。

You must implement this interface to provide proposals to SourceCompletion

コンテキストで「このインターフェースを実装する」とはどういう意味ですか?

この関数GObjectを使用して新規作成する必要がありますか? 例はありますか?.

new がある場合GObject、関数 ( など) を追加するにはどうすればよいsourceCompletionProviderGetNameですか?

ありがとう

4

1 に答える 1

6

gtk+ は C で書かれていglibますが、オブジェクト指向スタイルのインターフェースを提供するために使用されています。gtk+ API の多くは、オブジェクト指向の意味でインターフェースを使用して定義されています。実際の gtk+ 機能は、これらのインターフェースを実装する「オブジェクト」 (glib 規則に従う構造体へのポインター) によって提供されます。したがって、「このインターフェイスを実装する」とは、まさにそれを意味します-目的のインターフェイスを実装する「クラス」を(glibシステムを介してCで)作成します(これは、特定の関数呼び出しを処理するための適切なglibフックを設定することによって行います)。

gtk2hs では、glib インターフェイスは型クラスとして変換され、末尾に「クラス」という単語が追加されます。 SourceCompletionProviderClassこれらのクラスの 1 つであり、glib インターフェースを正確に表すことを意図しています。残念ながら、C 側の「クラス メソッド」は実際には Haskell では公開されていません。型クラスが提供する唯一のメソッドはキャスト操作であり、Haskell 型システムと OOP 継承ツリーの間の不一致を回避するためだけのものです。glib-class-method は、適切な型にキャストできるデータを操作する通常の Haskell 関数に変換されます。これは、gtk2hs を介して新しいクラス インスタンスを実装する良い方法がないことを意味します。

理論的には、新しい GObject を作成することで、Haskell 側から必要な動作を押し込むことができるかもしれませんが、必要なすべての関数 (低レベルの glib が必要になる) が公開されているわけではない可能性が高いため、それらを自分でバインドする必要があります (gtk2hs メンテナーが 1 年か 2 年前にこのような投稿をしたことを思い出すようですが、現在はリンクが見つかりません)。その時点で、自分ですべてを C で実装した方がおそらくエラーが発生しにくいでしょう。cellrenderer インターフェイス用にこれを行うコードベースがあり、モデルとして役立つ場合があります。興味深いことのほとんどは、C ヘッダー ファイルで行われます。関数ポインターを介して C 側から呼び出されるように Haskell 関数を設定することもできます。

本当に Haskell から完全に実行したい場合は、かなり単純なインターフェイス (cellrenderer 関数や別の関数などSourceCompletionProvider) を見つけて、プリプロセッサを介してヘッダーを実行し、glib マクロが何に変換されるかを確認することから始めます。次に、glib オブジェクトを設定するために必要な定義を確認できます。最も重要な関数は、*_init、*_finalize、*_get_property、および *_set_property ですが、他にも必要な関数がいくつかあります。は*、オブジェクトの名前のプレースホルダーです。IIRC では、ほとんどのデフォルト関数はG_DEFINE_TYPEマクロによって設定され、名前のプレフィックスも設定されます。

于 2012-09-17T13:19:31.480 に答える