2012-09-17 4 views
3

documentation 상태 :gtksourceview2 : 구현 완료 제공 <code>SourceCompletionProvider</code>에 대한

You must implement this interface to provide proposals to SourceCompletion 

무엇 "이 인터페이스를 구현"않습니다 문맥에서 의미?

this 기능을 사용하여 GObject을 새로 만들어야합니까? 어떤예요?.

내가 새로 GObject이되었을 때 어떻게 기능을 추가 할 수 있습니까 (예 : sourceCompletionProviderGetName)?

감사

+1

패키지 관리자에게주는주의 사항 : 귀하는 자신의 코드가 자체 기록하고 있다고 생각할 수 있습니다. 그렇지 않습니다. 설명! – AndrewC

답변

5

의 GTK + 그러나 그것은 객체 지향 스타일의 인터페이스를 제공하기 위해 glib 사용, C로 작성되었습니다. gtk + API의 대부분은 OO 의미에서 인터페이스를 사용하여 정의됩니다. 실제 gtk + 기능은 해당 인터페이스를 구현하는 "객체"(glib 규칙을 따르는 구조체에 대한 포인터)에 의해 제공됩니다. 따라서 "이 인터페이스 구현"은 원하는 인터페이스를 구현하는 "클래스"(glib 시스템을 통해 C에서 작성)를 작성하는 것입니다 (특정 함수 호출을 처리하기 위해 적절한 glib 훅을 설정하여 수행).

gtk2hs에서 glib 인터페이스는 "class"라는 단어가 끝에 추가 된 유형 클래스로 변환됩니다. SourceCompletionProviderClass은 이러한 클래스 중 하나이며 glib 인터페이스를 정확하게 나타 내기위한 것입니다. 불행하게도, C 측 "클래스 메소드"는 하스켈에서 실제로 노출되지 않습니다. 형식 클래스가 제공하는 유일한 메서드는 캐스팅 작업이며, 이는 하스켈 형식 시스템과 OOP 상속 트리 간의 불일치를 해결하기위한 것입니다. glib-class-method는 적절한 유형으로 형변환 될 수있는 일부 데이터에서 작동하는 일반 Haskell 함수로 변환됩니다. 이것은 gtk2hs를 통해 새로운 클래스 인스턴스를 구현하는 좋은 방법이 없다는 것을 의미합니다.

이론 상으로는 새로운 GObject를 생성하여 Haskell 측에서 필요한 동작을 구형화할 수 있지만 필요한 모든 기능 (일부 저급 glib 요소가 필요함)이 노출되지는 않을 가능성이 높습니다. 그래서 당신은 그들 자신을 묶을 필요가있다. (나는 gtk2hs 메인테이너가 1 년에서 2 년 전에 이것을 게시했지만 지금은 그 링크를 찾을 수 없다는 것을 상기 한 것처럼 보인다.) 이 시점에서 C에서 직접 구현하는 것이 오류가 발생하기 쉽습니다. cellrenderer interface에 대해이를 수행하는 코드베이스가 있는데, 모델로 유용 할 수 있습니다. 흥미로운 것들은 대부분 C 헤더 파일에서 발생합니다. 하스켈 함수를 함수 포인터를 통해 C 측에서 호출하도록 설정할 수 있습니다.

정말로 하스켈에서 전체적으로 해보고 싶다면 꽤 간단한 인터페이스 (예 : cellrenderer 함수 또는 다른 SourceCompletionProvider)를 찾고 헤더를 전처리기를 통해 실행하여 glib 매크로가 번역하는 것을 확인하십시오. 에. 그런 다음 glib 객체를 설정하는 데 필요한 정의를 볼 수 있습니다. 가장 중요한 기능은 * _init, * _finalize, * _get_property 및 * _set_property이지만 몇 가지 다른 기능도 필요합니다. *은 개체 이름의 자리 표시 자입니다. IIRC의 경우 대부분의 기본 함수는 G_DEFINE_TYPE 매크로에 의해 설정되며 이름 접두사도 함께 설정됩니다.

+0

'binding-gobject' (http://hackage.haskell.org/package/bindings-gobject) – Yuras

+0

@Yuras로 처리 할 수 ​​있을지 궁금합니다. 당신이 새로운 유형의 객체를 생성하고 glib 타입 시스템으로 등록해야한다면, 새로운 타입을 사용하여 GObject를 생성하고 적절한 콜백을 설정할 수 있다고 생각합니다. 그런 다음 적절한 포인터 캐스팅을 통해'binding-gobject'와'gtk2hs' 사이를 변환 할 수 있습니다. –

+0

도움 주셔서 감사합니다. 마침내'bindings-gobject'를 통해이 문제를 해결했습니다. http : // stackoverflow를 참조하십시오.co.kr/questions/12509431/convert-ptr-sourcecompletionprovider – Yuras