Для обратного вызова требуется постоянная функция, как передать экземпляр элемента объекта - PullRequest
1 голос
/ 10 сентября 2011

Я использую WebKitGTK + в более крупном приложении GTKmm / C ++. Я использую JavaScriptCore для взаимодействия с WebKitWebFrame и JSContext внутри.

Я застрял сейчас, когда мне нужно взаимодействовать с компонентом GTK GUI, когда вызывается функция javascript. С этой целью я нашел функцию JSObjectMakeFunctionWithCallback .

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

Где обратный вызов должен быть определен как статическая функция с def:

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

Так что все работает, за исключением того, что мне нужен экземпляр моего объекта в обратном вызове, чтобы вернуться к компоненту GUI, которым я должен манипулировать.

Существует множество похожих вопросов по SO, но большинство фокусируется на передаче экземпляра объекта в обратный вызов. Я не вижу способа сделать это с этим API.

Есть идеи?

1 Ответ

4 голосов
/ 10 сентября 2011

Обратный вызов должен быть указателем на свободную функцию, поэтому никакое количество магии не может заставить вас передать функцию-член напрямую.Одним из распространенных решений является создание промежуточной глобальной свободной функции, которая содержит экземпляр объекта:

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

В качестве альтернативы, вы можете сделать это статической функцией-членом вашего класса GUI.Суть в том, что вы должны получить ссылку на экземпляр отдельно и вызывать функцию-член самостоятельно, если вам нужно передать простой указатель на функцию вашего API.

...