2011-09-10 4 views
1

私は、より大きなGTKmm/C++アプリケーションでWebKitGTK +を使用しています。 JavaScriptCoreを使用して、WebKitWebFrameおよびJSContextと対話します。コールバックには、オブジェクトのインスタンスメンバを渡すためのconst関数が必要です

javascript関数が呼び出されたときにGTK GUIコンポーネントとやり取りする必要があるため、今は止まっています。この目的のために私はJSObjectMakeFunctionWithCallback関数を見つけました。コールバックはDEFと静的関数として定義する必要があります

JSStringRef str = JSStringCreateWithUTF8CString("ClickCallback"); 
JSObjectRef func = JSObjectMakeFunctionWithCallback(m_jsRef, str, ClickCallback); 
JSObjectSetProperty(m_jsRef, JSContextGetGlobalObject(m_jsRef), str, func, kJSPropertyAttributeNone, NULL); 
JSStringRelease(str); 

static JSValueRef ClickCallback(JSContextRef ctx, JSObjectRef func, JSObjectRef self, size_t argc, const JSValueRef argv[], JSValueRef* exception) 

私は私がする必要があるGUIコンポーネントに戻って取得するためにコールバックで私のオブジェクトのインスタンスを必要とする以外だから、すべてが働いています操作する。

SOに類似した質問がたくさんありますが、ほとんどの場合、オブジェクトインスタンスをコールバックに渡すことに焦点を当てています。私はこのAPIでこれを行う方法を見ることができません。

アイデア?

+0

静的関数でなくともメンバ関数である必要はありません。 –

+2

APIは、何らかの「コンテキスト」クッキー(通常はvoid *)を渡すことなく、コールバックを登録できるようにすると嫌です。 –

+0

@エミール - まさに。 V8では、特別な 'Data'ポインタを関数に渡される' Arguments'オブジェクトに付加することで、これを可能にしています。とても苦労しない。 – namuol

答えて

4

コールバックはフリー関数へのポインタである必要がありますので、メンバー関数を直接渡すことはできません。あなたがこれはあなたのGUIクラスの静的メンバ関数にすることができ、また

JSValueRef ClickCallback(...) 
{ 
    Foo & obj = getInstance(); // implement this somehow 
    return obj.click(...); 
} 

:一つの共通の解決策は、オブジェクトのインスタンスを保持している中間グローバルフリー機能を作ることです。要点は、プレーン関数ポインタをAPIに渡す必要がある場合は、インスタンス参照を別途取得してメンバー関数を呼び出す必要があることです。

+0

@Kerrek SB、ありがとう。これが私の進め方です。それは少しクリーナーになるが、私はいくつかの魔法を期待していた... – Mark