GTK +是用C,但是它使用glib
提供一種面向對象的風格界面。大多數gtk + API都是使用OO意義上的接口定義的。實際的gtk +功能由實現這些接口的「對象」(指向遵循glib約定的結構的指針)提供。所以「實現這個接口」的意思就是 - 寫一個實現所需接口(通過設置適當的glib鉤子來處理特定函數調用)的「類」(在C中通過glib系統)。
在gtk2hs中,glib接口被翻譯爲類型類,並在末尾添加單詞「class」。 SourceCompletionProviderClass
是這些類中的一個,它的意思是準確地表示glib接口。不幸的是,C端「類方法」在Haskell中並未真正公開。類類提供的唯一方法是轉換操作,這只是解決Haskell類型系統和OOP繼承樹之間的不匹配問題。 glib-class-method被轉換爲一個常規的Haskell函數,該函數對一些可以轉換爲適當類型的數據進行操作。這意味着沒有好的方法來通過gtk2hs實現一個新的類實例。
雖然理論上你可能會通過創建一個新的GObject來從Haskell方面強化必要的行爲,但很可能並非所有必要的函數(你需要一些低級的glib東西)都暴露出來,所以你需要自己綁定它們(我似乎回憶起gtk2hs的維護者在一兩年前發佈了類似的內容,但現在找不到鏈接)。在那個時候,它可能不太容易出錯,你自己用C來實現它。我有一個代碼庫,可以爲cellrenderer interface這樣做,您可能會發現它可以用作模型。大部分有趣的東西都發生在C頭文件中。您仍然可以通過函數指針設置從C端調用的Haskell函數。
如果你真的想嘗試完全從Haskell完成,我會先找到一個相當簡單的接口(比如我的cellrenderer函數,或者其他的SourceCompletionProvider
),然後通過preprocesser運行頭部來查看glib宏的翻譯至。然後你可以看到設置glib對象的必要定義。最重要的功能是* _init,* _finalize,* _get_property和* _set_property,但也需要一些其他功能。 *
是您的對象的名稱的佔位符。 IIRC中,大多數默認功能都是由設置名稱前綴的G_DEFINE_TYPE
宏設置的。
軟件包維護者須知:您可能認爲您的代碼是自我記錄的。事實並非如此。說明! – AndrewC