2012-09-20 2 views
1

부분적으로 prev 질문을 풀었습니다.Ptr()을 SourceCompletionProvider로 변환하십시오.

은 지금은 내가 c'g_type_add_interface_static 기능을 사용하여 SourceCompletionProvider을 구현할 수 있습니다 (hpase 참조) bindings-gobject를 통해 GObject 하위 유형을 등록 할 수있어 (아직 시도하지 않았다).

유일한 문제는 c'g_object_newv에 의해 반환 된 Ptr()gtk2hs 데이터 형식 SourceCompletionProvider으로 변환하는 것입니다. 내가 어떻게 해? 어떤 힌트?

newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider)) 

무엇이 정의는 의미 않습니다

SourceCompletionProvider 는 다음과 같이 정의된다? 왜 재귀입니까? 공급자는 공급자에게 ForeignPtr입니다. 이상하게 보입니다.

감사합니다.

솔루션 :

makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr 

답변

1

이것은 newtype은, 그리고 내부 SourceCompletionProvider이 다른 유형에 대한 포인터에서이 외국 포인터를 구별하는 단지 마커 때문에 필요한 외부 SourceCompletionProvider. definition of Ptr a을 보면 data Ptr a = Ptr Addr#-a이 오른쪽에 나타나지 않는 팬텀 유형이므로 정의가 실제로 재귀가 아닙니다.

당신은 newForeignPtr_를 사용하여 Ptr()ForeignPtr()에 변환 한 후 castForeignPtrForeignPtr SourceCompletionProvider에 전송할 수 있습니다.

편집 : 좀 더보고 후, 나는 당신이 첫번째 위에서 설명한 다음 unsafeCastGObject을 사용하는 방법으로 PtrGObject에 변환해야이 일을 생각합니다. 하지만 테스트되지 않았습니다.

+0

음 ... 최종자를 추가해야한다고 생각합니다. 맞습니까? 'p'g_object_unref'를 파이널 라이저로 사용할 수 있습니다. 충분합니까? – Yuras

+0

[C 인터페이스 설명서] (http://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html#g-object-unref)를보고 나서 알 수있는 것부터 맞아. –

+0

그냥 시도했는데 - 매력처럼 작동합니다. 고맙습니다! – Yuras

관련 문제