changeset 303:98b211f3ee34 signals

fix for #19
author eldar_ins@eldar-laptop
date Sat, 12 Dec 2009 16:01:55 +0500
parents 55ee4603365d
children 04b52676b45f
files generator/cppheadergenerator.cpp generator/cppimplgenerator.cpp generator/dgenerator.cpp generator/typesystem_core.xml include/qtd_core.h qt/qtd/MetaMarshall.d
diffstat 6 files changed, 29 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/generator/cppheadergenerator.cpp	Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/cppheadergenerator.cpp	Sat Dec 12 16:01:55 2009 +0500
@@ -198,6 +198,7 @@
 //        << "  QT_TR_FUNCTIONS" << end
       << "  virtual int qt_metacall(QMetaObject::Call, int, void **);" << endl
       << "  int __override_qt_metacall(QMetaObject::Call _c, int _id, void **_a);" << endl
+      << "  virtual const QMetaObject *metaObject() const;" << endl
 
       << "private:" << endl;
     }
--- a/generator/cppimplgenerator.cpp	Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/cppimplgenerator.cpp	Sat Dec 12 16:01:55 2009 +0500
@@ -506,8 +506,10 @@
         }
     }
     // D-side signal callbacks
-    if (java_class->isQObject())
-        s << "    qtd_" << java_class->name() << "_qt_metacall_dispatch = (QtMetacallCallback)sigs[0];" << endl;
+    if (java_class->isQObject()) {
+        s << "    qtd_" << java_class->name() << "_qt_metacall_dispatch = (QtMetacallCallback)sigs[0];" << endl
+          << "    qtd_" << java_class->name() << "_metaObject_dispatch = (MetaObjectCallback)sigs[1];" << endl;
+    }
     s << "}" << endl;
 }
 
@@ -1350,11 +1352,18 @@
       */
 
     if(cpp_shared)
-        s << "QtMetacallCallback qtd_" << java_class->name() << "_qt_metacall_dispatch;" << endl;
+        s << "MetaObjectCallback qtd_" << java_class->name() << "_metaObject_dispatch;" << endl
+          << "QtMetacallCallback qtd_" << java_class->name() << "_qt_metacall_dispatch;" << endl;
     else
-        s << "extern \"C\" int qtd_" << java_class->name() << "_qt_metacall_dispatch(void *d_entity, QMetaObject::Call _c, int _id, void **_a);" << endl << endl;
-
-    s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl
+        s << "extern \"C\" const QMetaObject* qtd_" << java_class->name() << "_metaObject_dispatch(void *d_entity);" << endl
+          << "extern \"C\" int qtd_" << java_class->name() << "_qt_metacall_dispatch(void *d_entity, QMetaObject::Call _c, int _id, void **_a);" << endl;
+
+    s << endl
+      << "const QMetaObject * " << shellClassName(java_class) << "::metaObject() const" << endl
+      << "{" << endl
+      << "    return qtd_" << java_class->name() << "_metaObject_dispatch(this->dId);" << endl
+      << "}" << endl << endl
+      << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl
       << "{" << endl
       << "    return qtd_" << java_class->name() << "_qt_metacall_dispatch(this->dId, _c, _id, _a);" << endl
       << "}" << endl << endl
--- a/generator/dgenerator.cpp	Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/dgenerator.cpp	Sat Dec 12 16:01:55 2009 +0500
@@ -2573,9 +2573,10 @@
                 initArgs = "virt_arr.ptr";
 
             if (d_class->isQObject()) {
-                // qt_metacalls
-                s << endl << INDENT << "void*[1] sign_arr;" << endl;
+                // qt_metacall, metaObject
+                s << endl << INDENT << "void*[2] sign_arr;" << endl;
                 s << INDENT << "sign_arr[0] = &qtd_" << d_class->name() << "_qt_metacall_dispatch;" << endl;
+                s << INDENT << "sign_arr[1] = &qtd_" << d_class->name() << "_metaObject_dispatch;" << endl;
                 initArgs += ", sign_arr.ptr";
             }
 
@@ -2682,8 +2683,13 @@
       << "private extern(C) int qtd_" << d_class->name() << "_qt_metacall_dispatch(void *d_entity, QMetaObject.Call _c, int _id, void **_a) {"
       << "    auto d_object = cast(" << d_class->name() << ") d_entity;"
       << "    return d_object.qt_metacall(_c, _id, _a);"
+      << "}" << endl << endl
+
+      << "private extern(C) void* qtd_" << d_class->name() << "_metaObject_dispatch(void *d_entity) {"
+      << "    auto d_object = cast(" << d_class->name() << ") d_entity;"
+      << "    return d_object.metaObject().nativeId();"
       << "}" << endl << endl;
-}
+  }
 
 void writeMetaMethodSignatures(QTextStream &s, const QString &var_name, AbstractMetaFunctionList meta_funcs)
 {
--- a/generator/typesystem_core.xml	Sat Dec 12 03:22:54 2009 +0500
+++ b/generator/typesystem_core.xml	Sat Dec 12 16:01:55 2009 +0500
@@ -559,7 +559,6 @@
   <rejection class="QObject" function-name="disconnectNotify"/>
   <rejection class="QObject" function-name="registerUserData"/>
   <rejection class="QObject" function-name="sender"/>
-  <rejection class="QTimer" function-name="singleShot"/>
   <rejection class="QProcess" function-name="pid"/>
   <rejection class="QRegion" function-name="cleanUp"/>
   <rejection class="QSettings" function-name="registerFormat"/>
--- a/include/qtd_core.h	Sat Dec 12 03:22:54 2009 +0500
+++ b/include/qtd_core.h	Sat Dec 12 16:01:55 2009 +0500
@@ -83,6 +83,7 @@
 
 extern "C" typedef void (*EmitCallback)(void*, void**);
 extern "C" typedef int (*QtMetacallCallback)(void *d_entity, QMetaObject::Call _c, int _id, void **_a);
+extern "C" typedef const QMetaObject* (*MetaObjectCallback)(void *d_entity);
 
 template <class T>
 void call_destructor(T *a)
--- a/qt/qtd/MetaMarshall.d	Sat Dec 12 03:22:54 2009 +0500
+++ b/qt/qtd/MetaMarshall.d	Sat Dec 12 16:01:55 2009 +0500
@@ -58,7 +58,7 @@
 // converts an argumnent from C++ to D in qt_metacall
 string metaCallArgument(T)(string ptr)
 {
-    static if (isQObjectType!T)
+    static if (isQObjectType!T || isObjectType!T)
         return T.stringof ~ ".__getObject(*cast(void**)(" ~ ptr ~ "))";
     else static if (isNativeType!T)
         return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
@@ -72,7 +72,7 @@
 // converts a D argument type to C++ for registering in Qt meta system
 string qtDeclArg(T)()
 {
-    static if (isQObjectType!T)
+    static if (isQObjectType!T || isObjectType!T)
         return T.stringof ~ "*";
     else static if (isStringType!T)
         return "QString";
@@ -85,7 +85,7 @@
 // converts an argument from D to C++ in a signal emitter
 string convertSignalArgument(T)(string arg)
 {
-    static if (isQObjectType!T)
+    static if (isQObjectType!T || isObjectType!T)
         return arg ~ ".__nativeId";
     else static if (isStringType!T)
         return "_qt" ~ arg;