gtksourceview2: реализовать поставщик завершения
В документации говорится о SourceCompletionProvider
:
You must implement this interface to provide proposals to SourceCompletion
Что означает "реализовать этот интерфейс" в контексте?
Должен ли я создать новый GObject
используя эти функции? Любой пример?
Когда у меня новый GObject
тогда как я могу добавить функции (например, sourceCompletionProviderGetName
) к этому?
Спасибо
1 ответ
GTK + написан на C, однако он использует glib
обеспечить объектно-ориентированный стиль интерфейса. Большая часть API gtk+ определена с использованием интерфейсов в смысле ОО. Фактическая функциональность gtk+ обеспечивается "объектами" (указателями на структуры, которые следуют соглашениям glib), которые реализуют эти интерфейсы. Таким образом, "реализовать этот интерфейс" означает именно это - написать "класс" (в C через систему glib), который реализует желаемый интерфейс (что вы делаете, устанавливая правильные хуки glib для обработки вызовов определенных функций).
В gtk2hs интерфейсы glib переводятся как классы типов со словом "класс", добавляемым в конце. SourceCompletionProviderClass
является одним из этих классов и предназначен для точного представления интерфейса glib. К сожалению, "методы класса" на стороне C в Haskell не представлены. Единственный метод, предоставляемый классом типов, - это операция приведения, которая предназначена только для устранения несоответствия между системой типов Haskell и деревьями наследования ООП. Метод glib-class преобразуется в обычную функцию Haskell, работающую с некоторыми данными, которые могут быть преобразованы в соответствующий тип. Это означает, что нет хорошего способа реализовать новый экземпляр класса через gtk2hs.
Хотя в теории вы могли бы втиснуть необходимое поведение со стороны Haskell, создав новый объект GObject, весьма вероятно, что не все необходимые функции (вам понадобятся некоторые вещи низкого уровня), так что вы нужно связать их самим (кажется, я вспоминаю, что сопровождающие gtk2hs опубликовали что-то подобное год или два назад, но сейчас не могу найти ссылку). На этом этапе, вероятно, менее подвержен ошибкам реализовать все это в C самостоятельно. У меня есть кодовая база, которая делает это для интерфейса cellrenderer, который вы можете найти полезным в качестве модели. Большая часть интересного происходит в заголовочном файле C. Вы все еще можете настроить функции Haskell, которые будут вызываться со стороны C через указатель на функцию.
Если вы действительно хотите попробовать сделать это целиком с Haskell, я бы начал с поиска довольно простого интерфейса (например, функции cellrenderer или другого). SourceCompletionProvider
) и запустив заголовок через препроцессор, чтобы увидеть, на что переводят макросы glib. Затем вы можете увидеть необходимые определения для настройки объекта glib. Наиболее важными функциями являются *_init, *_finalize, *_get_property и *_set_property, хотя некоторые другие также необходимы. *
является заполнителем для имени вашего объекта. IIRC, большинство функций по умолчанию устанавливаются G_DEFINE_TYPE
макрос, который также устанавливает префикс имени.