Domanda

Sto usando WebKitGTK+ in un'applicazione GTKMM/C ++ più grande. Sto usando JavaScriptCore per interagire con WebKitWebFrame e JSContext all'interno.

Ora sono bloccato perché ho bisogno di interagire con un componente GUI GTK quando viene chiamata una funzione JavaScript. A tal fine ho trovato il JSObjectMakeFunctionWithCallback funzione.

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

Dove il callback deve essere definito come una funzione statica con def:

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

Quindi tutto funziona tranne che ho bisogno della mia istanza di oggetti nel callback per tornare al componente GUI di cui ho bisogno per manipolare.

Ci sono tonnellate di domande simili su SO, ma la maggior parte si concentra sul passaggio dell'istanza dell'oggetto nel callback. Non riesco a vedere un modo per farlo con questa API.

Qualche idea?

È stato utile?

Soluzione

Il callback deve essere un puntatore a una funzione gratuita, quindi nessuna quantità di magia può farti passare direttamente una funzione membro. Una soluzione comune è quella di creare una funzione gratuita globale intermedia che contiene l'istanza dell'oggetto:

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

In alternativa, puoi rendere questo una funzione membro statica della tua classe GUI. Il punto principale è che è necessario ottenere il riferimento di istanza separatamente e chiamare tu stesso la funzione del membro se devi passare un puntatore di funzione semplice alla tua API.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top