Question

J'utilise WebKitGTK + dans une application GTKmm / C ++ plus grande.J'utilise JavaScriptCore pour interagir avec WebKitWebFrame et JSContext à l'intérieur.

Je suis bloqué maintenant car j'ai besoin d'interagir avec un composant GUI GTK lorsqu'une fonction javascript est appelée.À cette fin, j'ai trouvé le fonction JSObjectMakeFunctionWithCallback .

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

Où le rappel doit être défini comme une fonction statique avec def:

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

Donc tout fonctionne sauf que j'ai besoin de mon instance d'objet dans le callback pour revenir au composant GUI que je dois manipuler.

Il y a des tonnes de questions similaires sur SO, mais la plupart se concentrent sur le passage de l'instance d'objet dans le rappel.Je ne vois pas comment faire cela avec cette API.

Des idées?

Était-ce utile?

La solution

Le rappel doit être un pointeur vers une fonction libre, donc aucune quantité de magie ne peut vous amener à passer directement une fonction membre.Une solution courante consiste à créer une fonction libre globale intermédiaire qui contient l'instance d'objet:

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

Vous pouvez également en faire une fonction membre statique de votre classe GUI.Le point principal est que vous devez obtenir la référence d'instance séparément et appeler la fonction membre vous-même si vous devez passer un pointeur de fonction simple à votre API.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top