diff options
Diffstat (limited to 'sip/qt/qobject.sip')
-rw-r--r-- | sip/qt/qobject.sip | 2086 |
1 files changed, 0 insertions, 2086 deletions
diff --git a/sip/qt/qobject.sip b/sip/qt/qobject.sip deleted file mode 100644 index c0c30e5..0000000 --- a/sip/qt/qobject.sip +++ /dev/null @@ -1,2086 +0,0 @@ -// This is the SIP interface definition for TQObject. -// -// Copyright (c) 2007 -// Riverbank Computing Limited <[email protected]> -// -// This file is part of PyTQt. -// -// This copy of PyTQt is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2, or (at your option) any later -// version. -// -// PyTQt is supplied in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -// details. -// -// You should have received a copy of the GNU General Public License along with -// PyTQt; see the file LICENSE. If not, write to the Free Software Foundation, -// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - -%ExportedDoc -<Sect2><Title>TQObject</Title> -<FuncSynopsis> - <FuncDef>bool <Function>disconnect</Function></FuncDef> - <ParamDef>const TQObject *<Parameter>receiver</Parameter></ParamDef> - <ParamDef>const char *<Parameter>member</Parameter> = 0</ParamDef> -</FuncSynopsis> -<Para> -Not yet implemented. -</Para> - -<FuncSynopsis> - <FuncDef>bool <Function>disconnect</Function></FuncDef> - <ParamDef>const char *<Parameter>signal</Parameter> = 0</ParamDef> - <ParamDef>const TQObject *<Parameter>receiver</Parameter> = 0</ParamDef> - <ParamDef>const char *<Parameter>member</Parameter> = 0</ParamDef> -</FuncSynopsis> -<Para> -Not yet implemented. -</Para> - -<FuncSynopsis> - <FuncDef>static bool <Function>disconnect</Function></FuncDef> - <ParamDef>const TQObject *<Parameter>sender</Parameter></ParamDef> - <ParamDef>const char *<Parameter>signal</Parameter></ParamDef> - <ParamDef>const TQObject *<Parameter>receiver</Parameter></ParamDef> - <ParamDef>const char *<Parameter>member</Parameter></ParamDef> -</FuncSynopsis> -<Para> -At the moment PyTQt does not support the full behaviour of the corresponding TQt -method. In particular, specifying None (ie. 0 in C++) for the -<Literal>signal</Literal> and <Literal>receiver</Literal> parameters is not yet -supported. -</Para> -</Sect2> -%End - - -class TQObject : TQt -{ -%TypeHeaderCode -#include <tqobject.h> -#include <tqapplication.h> -%End - -public: - TQObject(TQObject * /TransferThis/ = 0,const char * = 0); - -%ConvertToSubClassCode - static struct class_graph { - const char *name; - sipWrapperType **type; - int yes, no; - } graph[] = { - {sipName_TQWidget, &sipClass_TQWidget, 25, 1}, -#if defined(SIP_FEATURE_TQt_ASSISTANTCLIENT) - {sipName_TQAssistantClient, &sipClass_TQAssistantClient, -1, 2}, -#else - {NULL, NULL, -1, 2}, -#endif - {sipName_TQSessionManager, &sipClass_TQSessionManager, -1, 3}, - {sipName_TQTranslator, &sipClass_TQTranslator, -1, 4}, - {sipName_TQProcess, &sipClass_TQProcess, -1, 5}, - {sipName_TQToolTipGroup, &sipClass_TQToolTipGroup, -1, 6}, -#if defined(SIP_FEATURE_TQt_FILEDIALOG) - {sipName_TQFileIconProvider, &sipClass_TQFileIconProvider, -1, 7}, -#else - {NULL, NULL, -1, 7}, -#endif -#if defined(SIP_FEATURE_TQt_ACTION) - {sipName_TQAction, &sipClass_TQAction, 89, 8}, -#else - {NULL, NULL, -1, 8}, -#endif - {sipName_TQObjectCleanupHandler, &sipClass_TQObjectCleanupHandler, -1, 9}, - {sipName_TQTimer, &sipClass_TQTimer, -1, 10}, - {sipName_TQLayout, &sipClass_TQLayout, 90, 11}, -#if defined(SIP_FEATURE_TQt_NETWORKPROTOCOL) - {sipName_TQUrlOperator, &sipClass_TQUrlOperator, -1, 12}, -#else - {NULL, NULL, -1, 12}, -#endif - {sipName_TQStyleSheet, &sipClass_TQStyleSheet, -1, 13}, - {sipName_TQValidator, &sipClass_TQValidator, 94, 14}, -#if defined(SIP_FEATURE_TQt_NETWORKPROTOCOL) - {sipName_TQNetworkOperation, &sipClass_TQNetworkOperation, -1, 15}, -#else - {NULL, NULL, -1, 15}, -#endif - {sipName_TQAccel, &sipClass_TQAccel, -1, 16}, - {sipName_TQEventLoop, &sipClass_TQEventLoop, -1, 17}, -#if defined(SIP_FEATURE_TQt_NETWORKPROTOCOL) - {sipName_TQNetworkProtocol, &sipClass_TQNetworkProtocol, -1, 18}, -#else - {NULL, NULL, -1, 18}, -#endif -#if defined(SIP_FEATURE_TQt_SOUND) - {sipName_TQSound, &sipClass_TQSound, -1, 19}, -#else - {NULL, NULL, -1, 19}, -#endif - {sipName_TQApplication, &sipClass_TQApplication, -1, 20}, - {sipName_TQDragObject, &sipClass_TQDragObject, 97, 21}, - {sipName_TQSocketNotifier, &sipClass_TQSocketNotifier, -1, 22}, - {sipName_TQStyle, &sipClass_TQStyle, 103, 23}, - {sipName_TQSignalMapper, &sipClass_TQSignalMapper, -1, 24}, -#if defined(SIP_FEATURE_TQt_CLIPBOARD) - {sipName_TQClipboard, &sipClass_TQClipboard, -1, -1}, -#else - {NULL, NULL, -1, -1}, -#endif - {sipName_TQStatusBar, &sipClass_TQStatusBar, -1, 26}, -#if defined(SIP_FEATURE_TQt_SIZEGRIP) - {sipName_TQSizeGrip, &sipClass_TQSizeGrip, -1, 27}, -#else - {NULL, NULL, -1, 27}, -#endif - {sipName_TQTabWidget, &sipClass_TQTabWidget, -1, 28}, - {sipName_TQDateEdit, &sipClass_TQDateEdit, -1, 29}, - {sipName_TQMainWindow, &sipClass_TQMainWindow, -1, 30}, - {sipName_TQDateTimeEdit, &sipClass_TQDateTimeEdit, -1, 31}, - {sipName_TQTimeEdit, &sipClass_TQTimeEdit, -1, 32}, - {sipName_TQFrame, &sipClass_TQFrame, 46, 33}, - {sipName_TQScrollBar, &sipClass_TQScrollBar, -1, 34}, -#if defined(SIP_FEATURE_TQt_DIAL) - {sipName_TQDial, &sipClass_TQDial, -1, 35}, -#else - {NULL, NULL, -1, 35}, -#endif - {sipName_TQButton, &sipClass_TQButton, 75, 36}, - {sipName_TQTabBar, &sipClass_TQTabBar, -1, 37}, - {sipName_TQDialog, &sipClass_TQDialog, 79, 38}, - {sipName_TQComboBox, &sipClass_TQComboBox, -1, 39}, - {sipName_TQHeader, &sipClass_TQHeader, -1, 40}, - {sipName_TQDockArea, &sipClass_TQDockArea, -1, 41}, - {sipName_TQSplashScreen, &sipClass_TQSplashScreen, -1, 42}, - {sipName_TQSlider, &sipClass_TQSlider, -1, 43}, - {sipName_TQSpinBox, &sipClass_TQSpinBox, -1, 44}, -#if defined(SIP_FEATURE_TQt_WORKSPACE) - {sipName_TQWorkspace, &sipClass_TQWorkspace, -1, 45}, -#else - {NULL, NULL, -1, 45}, -#endif - {sipName_TQDesktopWidget, &sipClass_TQDesktopWidget, -1, -1}, - {sipName_TQGrid, &sipClass_TQGrid, -1, 47}, - {sipName_TQLineEdit, &sipClass_TQLineEdit, -1, 48}, - {sipName_TQToolBox, &sipClass_TQToolBox, -1, 49}, - {sipName_TQWidgetStack, &sipClass_TQWidgetStack, -1, 50}, - {sipName_TQDockWindow, &sipClass_TQDockWindow, 60, 51}, - {sipName_TQMenuBar, &sipClass_TQMenuBar, -1, 52}, - {sipName_TQLabel, &sipClass_TQLabel, -1, 53}, - {sipName_TQGroupBox, &sipClass_TQGroupBox, 61, 54}, - {sipName_TQPopupMenu, &sipClass_TQPopupMenu, -1, 55}, -#if defined(SIP_FEATURE_TQt_SPLITTER) - {sipName_TQSplitter, &sipClass_TQSplitter, -1, 56}, -#else - {NULL, NULL, -1, 56}, -#endif - {sipName_TQProgressBar, &sipClass_TQProgressBar, -1, 57}, - {sipName_TQScrollView, &sipClass_TQScrollView, 66, 58}, - {sipName_TQHBox, &sipClass_TQHBox, 74, 59}, - {sipName_TQLCDNumber, &sipClass_TQLCDNumber, -1, -1}, - {sipName_TQToolBar, &sipClass_TQToolBar, -1, -1}, - {sipName_TQButtonGroup, &sipClass_TQButtonGroup, 64, 62}, - {sipName_TQHGroupBox, &sipClass_TQHGroupBox, -1, 63}, - {sipName_TQVGroupBox, &sipClass_TQVGroupBox, -1, -1}, - {sipName_TQVButtonGroup, &sipClass_TQVButtonGroup, -1, 65}, - {sipName_TQHButtonGroup, &sipClass_TQHButtonGroup, -1, -1}, -#if defined(SIP_FEATURE_TQt_ICONVIEW) - {sipName_TQIconView, &sipClass_TQIconView, -1, 67}, -#else - {NULL, NULL, -1, 67}, -#endif - {sipName_TQListView, &sipClass_TQListView, -1, 68}, - {sipName_TQListBox, &sipClass_TQListBox, -1, 69}, - {sipName_TQGridView, &sipClass_TQGridView, -1, 70}, - {sipName_TQTextEdit, &sipClass_TQTextEdit, 71, -1}, - {sipName_TQTextBrowser, &sipClass_TQTextBrowser, -1, 72}, - {sipName_TQMultiLineEdit, &sipClass_TQMultiLineEdit, -1, 73}, - {sipName_TQTextView, &sipClass_TQTextView, -1, -1}, - {sipName_TQVBox, &sipClass_TQVBox, -1, -1}, - {sipName_TQToolButton, &sipClass_TQToolButton, -1, 76}, - {sipName_TQRadioButton, &sipClass_TQRadioButton, -1, 77}, - {sipName_TQPushButton, &sipClass_TQPushButton, -1, 78}, - {sipName_TQCheckBox, &sipClass_TQCheckBox, -1, -1}, -#if defined(WS_X11) && defined(SIP_FEATURE_TQt_PRINTDIALOG) - {sipName_TQPrintDialog, &sipClass_TQPrintDialog, -1, 80}, -#else - {NULL, NULL, -1, 80}, -#endif - {sipName_TQErrorMessage, &sipClass_TQErrorMessage, -1, 81}, -#if defined(SIP_FEATURE_TQt_INPUTDIALOG) - {sipName_TQInputDialog, &sipClass_TQInputDialog, -1, 82}, -#else - {NULL, NULL, -1, 82}, -#endif -#if defined(SIP_FEATURE_TQt_MESSAGEBOX) - {sipName_TQMessageBox, &sipClass_TQMessageBox, -1, 83}, -#else - {NULL, NULL, -1, 83}, -#endif -#if defined(SIP_FEATURE_TQt_WIZARD) - {sipName_TQWizard, &sipClass_TQWizard, -1, 84}, -#else - {NULL, NULL, -1, 84}, -#endif -#if defined(SIP_FEATURE_TQt_COLORDIALOG) - {sipName_TQColorDialog, &sipClass_TQColorDialog, -1, 85}, -#else - {NULL, NULL, -1, 85}, -#endif -#if defined(SIP_FEATURE_TQt_FONTDIALOG) - {sipName_TQFontDialog, &sipClass_TQFontDialog, -1, 86}, -#else - {NULL, NULL, -1, 86}, -#endif -#if defined(SIP_FEATURE_TQt_FILEDIALOG) - {sipName_TQFileDialog, &sipClass_TQFileDialog, -1, 87}, -#else - {NULL, NULL, -1, 87}, -#endif -#if defined(SIP_FEATURE_TQt_PROGRESSDIALOG) - {sipName_TQProgressDialog, &sipClass_TQProgressDialog, -1, 88}, -#else - {NULL, NULL, -1, 88}, -#endif -#if defined(SIP_FEATURE_TQt_TABDIALOG) - {sipName_TQTabDialog, &sipClass_TQTabDialog, -1, -1}, -#else - {NULL, NULL, -1, -1}, -#endif -#if defined(SIP_FEATURE_TQt_ACTION) - {sipName_TQActionGroup, &sipClass_TQActionGroup, -1, -1}, -#else - {NULL, NULL, -1, -1}, -#endif - {sipName_TQGridLayout, &sipClass_TQGridLayout, -1, 91}, - {sipName_TQBoxLayout, &sipClass_TQBoxLayout, 92, -1}, - {sipName_TQHBoxLayout, &sipClass_TQHBoxLayout, -1, 93}, - {sipName_TQVBoxLayout, &sipClass_TQVBoxLayout, -1, -1}, - {sipName_TQDoubleValidator, &sipClass_TQDoubleValidator, -1, 95}, - {sipName_TQIntValidator, &sipClass_TQIntValidator, -1, 96}, - {sipName_TQRegExpValidator, &sipClass_TQRegExpValidator, -1, -1}, - {sipName_TQTextDrag, &sipClass_TQTextDrag, -1, 98}, - {sipName_TQStoredDrag, &sipClass_TQStoredDrag, 101, 99}, -#if defined(SIP_FEATURE_TQt_ICONVIEW) && defined(SIP_FEATURE_TQt_DRAGANDDROP) - {sipName_TQIconDrag, &sipClass_TQIconDrag, -1, 100}, -#else - {NULL, NULL, -1, 100}, -#endif - {sipName_TQImageDrag, &sipClass_TQImageDrag, -1, -1}, - {sipName_TQColorDrag, &sipClass_TQColorDrag, -1, 102}, - {sipName_TQUriDrag, &sipClass_TQUriDrag, -1, -1}, - {sipName_TQCommonStyle, &sipClass_TQCommonStyle, 104, -1}, -#if defined(SIP_FEATURE_TQt_STYLE_WINDOWS) - {sipName_TQWindowsStyle, &sipClass_TQWindowsStyle, 106, 105}, -#else - {NULL, NULL, -1, 105}, -#endif -#if defined(SIP_FEATURE_TQt_STYLE_MOTIF) - {sipName_TQMotifStyle, &sipClass_TQMotifStyle, 107, -1}, -#else - {NULL, NULL, -1, -1}, -#endif -#if defined(SIP_FEATURE_TQt_STYLE_PLATINUM) - {sipName_TQPlatinumStyle, &sipClass_TQPlatinumStyle, -1, 110}, -#else - {NULL, NULL, -1, 110}, -#endif -#if defined(SIP_FEATURE_TQt_STYLE_CDE) - {sipName_TQCDEStyle, &sipClass_TQCDEStyle, -1, 108}, -#else - {NULL, NULL, -1, 108}, -#endif -#if defined(SIP_FEATURE_TQt_STYLE_MOTIFPLUS) - {sipName_TQMotifPlusStyle, &sipClass_TQMotifPlusStyle, -1, 109}, -#else - {NULL, NULL, -1, 109}, -#endif -#if defined(SIP_FEATURE_TQt_STYLE_SGI) - {sipName_TQSGIStyle, &sipClass_TQSGIStyle, -1, -1}, -#else - {NULL, NULL, -1, -1}, -#endif -#if defined(PYQT_STYLE_WINDOWSXP) - {sipName_TQWindowsXPStyle, &sipClass_TQWindowsXPStyle, -1, -1}, -#else - {NULL, NULL, -1, -1}, -#endif - }; - - int i = 0; - - sipClass = NULL; - - do - { - struct class_graph *cg = &graph[i]; - - if (cg->name != NULL && sipCpp->inherits(cg->name)) - { - sipClass = *cg->type; - i = cg->yes; - } - else - i = cg->no; - } - while (i >= 0); -%End - - // This is really virtual. With the way we are implementing it doesn't - // need to be and has the advantage that the C++ implementation can be - // used in %ConvertToSubClassCode to get the C++ name for Python - // sub-classes. However, it is also means that C++ plugins can't get - // the true (Python) class name. - SIP_PYOBJECT className() const; -%MethodCode - sipRes = PyUnicode_FromString(sipSelf->ob_type->tp_name); -%End - - // Note that tr() and trUtf8() are really static methods. We pretend - // they aren't so that we can use self to get hold of the class name. - // We could mimic moc's behaviour more accurately by creating tr() and - // trUtf8() methods for a Python sub-class instance in the sub-class's - // ctor. - - TQString tr(SIP_PYOBJECT sourceText /TypeHint="str"/,const char * = 0); -%MethodCode - if (tqApp) - { - const char *source = PyTQt_qt_encode(&a0, TQApplication::DefaultCodec); - - if (source) - { - sipRes = new TQString(tqApp->translate(Py_TYPE(sipSelf)->tp_name, source, - a1, TQApplication::DefaultCodec)); - Py_DECREF(a0); - } - else - { - sipIsErr = 1; - } - } - else - { - const char *source = sipString_AsUTF8String(&a0); - - if (source) - { - sipRes = new TQString(QString::fromUtf8(source)); - Py_DECREF(a0); - } - else - { - sipIsErr = 1; - } - } -%End - - TQString trUtf8(SIP_PYOBJECT sourceText /TypeHint="str"/,const char * = 0); -%MethodCode - if (tqApp) - { - const char *source = PyTQt_qt_encode(&a0, TQApplication::DefaultCodec); - - if (source) - { - sipRes = new TQString(tqApp->translate(Py_TYPE(sipSelf)->tp_name, source, - a1, TQApplication::UnicodeUTF8)); - Py_DECREF(a0); - } - else - { - sipIsErr = 1; - } - } - else - { - const char *source = sipString_AsUTF8String(&a0); - - if (source) - { - sipRes = new TQString(TQString::fromUtf8(source)); - Py_DECREF(a0); - } - else - { - sipIsErr = 1; - } - } -%End - virtual TQMetaObject *metaObject() const /AutoGen/; - virtual bool event(TQEvent *); - virtual bool eventFilter(TQObject *,TQEvent *); - - bool isA(const char *) const; -%MethodCode - // The TQt implementation doesn't know anything about Python - // sub-classes. For SIP v4 we use the Python type's name. For - // SIP v3 we use the broken TQt behaviour as it's deprecated and - // we want to keep things simple. - -#if SIP_VERSION >= 0x040000 - sipRes = (strcmp(sipSelf -> ob_type -> tp_name,a0) == 0); -#else - Py_BEGIN_ALLOW_THREADS - sipRes = sipCpp -> TQObject::isA(a0); - Py_END_ALLOW_THREADS -#endif -%End - - bool inherits(const char *) const; -%MethodCode - // The TQt implementation doesn't know anything about Python - // sub-classes. For SIP v4 we use the Python type's MRO. For - // SIP v3 we use the broken TQt behaviour as it's deprecated and - // we want to keep things simple. - -#if SIP_VERSION >= 0x040000 - PyObject *mro = sipSelf -> ob_type -> tp_mro; - - sipRes = 0; - - for (int i = 0; i < PyTuple_GET_SIZE(mro); ++i) - if (strcmp(((PyTypeObject *)PyTuple_GET_ITEM(mro,i)) -> tp_name,a0) == 0) - { - sipRes = 1; - break; - } -#else - Py_BEGIN_ALLOW_THREADS - sipRes = sipCpp -> TQObject::inherits(a0); - Py_END_ALLOW_THREADS -#endif -%End - - const char *name() const; - const char *name(const char *) const; - virtual void setName(const char *); - bool isWidgetType() const; - bool highPriority() const; - bool signalsBlocked() const; - void blockSignals(bool); - int startTimer(int); - void killTimer(int); - void killTimers(); - TQObject *child(const char *,const char * = 0,bool = 1); - const TQObjectList *children() const; - static const TQObjectList *objectTrees(); - - TQObjectList *queryList(char * = 0,char * = 0,bool = 1,bool = 1) const; -%MethodCode - // The TQt implementation doesn't know anything about Python - // sub-classes. For SIP v4 we get all classes and then use the - // Python type's MRO to weed out those we don't want. For SIP - // v3 we use the broken TQt behaviour as it's deprecated and we - // want to keep things simple. - -#if SIP_VERSION >= 0x040000 - sipRes = sipCpp -> TQObject::queryList(0, a1, a2, a3); - - if (a0 && sipRes) - { - TQObject *o = sipRes -> first(); - - while (o) - { - bool remove = TRUE; - PyObject *pyo = sipConvertFromInstance(o, sipClass_TQObject, 0); - - if (pyo) - { - PyObject *mro = pyo -> ob_type -> tp_mro; - - for (int i = 0; i < PyTuple_GET_SIZE(mro); ++i) - if (strcmp(((PyTypeObject *)PyTuple_GET_ITEM(mro,i)) -> tp_name,a0) == 0) - { - remove = FALSE; - break; - } - - Py_DECREF(pyo); - } - - if (remove) - { - sipRes -> remove(); - o = sipRes -> current(); - } - else - o = sipRes -> next(); - } - } -#else - Py_BEGIN_ALLOW_THREADS - sipRes = sipCpp -> TQObject::queryList(a0, a1, a2, a3); - Py_END_ALLOW_THREADS -#endif -%End - - virtual void insertChild(TQObject * /Transfer/); - virtual void removeChild(TQObject * /TransferBack/); - void installEventFilter(const TQObject *); - void removeEventFilter(const TQObject *); - - static SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_QOBJECT,SIP_SLOT); -%MethodCode - sipRes = sipConnectRx(a0,a1,a2,a3,0); -%End - - static SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_PYCALLABLE); -%MethodCode - sipRes = sipConnectRx(a0,a1,a2,0,0); -%End - - SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_SLOT) const; -%MethodCode - sipRes = sipConnectRx(a0,a1,sipSelf,a2,0); -%End - - static SIP_PYOBJECT disconnect(SIP_QOBJECT,SIP_SIGNAL,SIP_QOBJECT,SIP_SLOT); -%MethodCode - sipRes = sipDisconnectRx(a0,a1,a2,a3); -%End - - static SIP_PYOBJECT disconnect(SIP_QOBJECT,SIP_SIGNAL,SIP_PYCALLABLE); -%MethodCode - sipRes = sipDisconnectRx(a0,a1,a2,0); -%End - -// bool disconnect(const char * = 0,const TQObject * = 0,const char * = 0); -// bool disconnect(const TQObject *,const char * = 0); - void dumpObjectTree(); - void dumpObjectInfo(); - TQObject *parent() const; - - void emit(SIP_SIGNAL,SIP_PYTUPLE); -%MethodCode - if (pyqt3EmitSignal(sipSelf, a0, a1) < 0) - sipIsErr = 1; -%End - -%If (TQt_PROPERTIES) - virtual bool setProperty(const char *,const TQVariant &); - virtual TQVariant property(const char *) const; -%End - -signals: - void destroyed(); - void destroyed(TQObject *); - -public slots: - void deleteLater(); - -public: - // This is actually protected, but we never need to call the real - // method. - SIP_PYOBJECT sender(); -%MethodCode - sipRes = pyqt3GetSender(); -%End - -protected: - virtual void timerEvent(TQTimerEvent *); - virtual void childEvent(TQChildEvent *); - virtual void customEvent(TQCustomEvent *); - -private: - TQObject(const TQObject &); -}; - - -SIP_PYOBJECT QT_TR_NOOP(SIP_PYOBJECT); -%MethodCode - Py_INCREF(a0); - sipRes = a0; -%End - - -SIP_PYOBJECT QT_TRANSLATE_NOOP(SIP_PYOBJECT,SIP_PYOBJECT); -%MethodCode - Py_INCREF(a1); - sipRes = a1; -%End - - -SIP_PYOBJECT SLOT(const char * /Encoding="ASCII"/) /TypeHint="QT_SLOT"/; -%MethodCode - if (!a0) - { - PyErr_Format(PyExc_TypeError,"qt.SLOT() slot name cannot be None"); - sipIsErr = 1; - } - else - { - int len = strlen(a0); - - if ((sipRes = PyBytes_FromStringAndSize(NULL,1 + len)) == NULL) - sipIsErr = 1; - else - { - char *dp = PyBytes_AS_STRING(sipRes); - - *dp++ = '1'; - - memcpy(dp,a0,len + 1); - } - } -%End - - -SIP_PYOBJECT SIGNAL(const char * /Encoding="ASCII"/) /TypeHint="QT_SIGNAL"/; -%MethodCode - if (!a0) - { - PyErr_Format(PyExc_TypeError,"qt.SIGNAL() signal cannot be None"); - sipIsErr = 1; - } - else - { - int len = strlen(a0); - - if ((sipRes = PyBytes_FromStringAndSize(NULL,1 + len)) == NULL) - sipIsErr = 1; - else - { - char *dp = PyBytes_AS_STRING(sipRes); - - *dp++ = '2'; - - memcpy(dp,a0,len + 1); - } - } -%End - - -SIP_PYOBJECT PYSIGNAL(const char * /Encoding="ASCII"/); -%MethodCode - if (!a0) - { - PyErr_Format(PyExc_TypeError,"qt.PYSIGNAL() signal cannot be None"); - sipIsErr = 1; - } - else - { - int len = strlen(a0); - - if ((sipRes = PyBytes_FromStringAndSize(NULL,1 + len)) == NULL) - sipIsErr = 1; - else - { - char *dp = PyBytes_AS_STRING(sipRes); - - *dp++ = '9'; - - memcpy(dp,a0,len + 1); - } - } -%End - - -%ModuleHeaderCode - -int pyqt3EmitSignal(PyObject *self, const char *sig, PyObject *sigargs); -PyObject *pyqt3GetSender(); - -%End - - -// This is the TQt support code for SIP v4.4 and later. -%ModuleCode - -#include <string.h> - -#include <tqobject.h> -#include <tqvariant.h> -#include <tqmetaobject.h> -#include <private/qucom_p.h> -#include <private/qucomextra_p.h> - - -// These optional parts of the legacy TQt support API for SIP are implemented. -#undef sipTQtEmitSignal -#undef sipTQtConnectPySignal -#undef sipTQtDisconnectPySignal - - -// Declare explicit C linkage. -extern "C" -{ - static void *sipTQtCreateUniversalSlot(sipWrapper *, const char *, - PyObject *, const char *, const char **, int); - static void sipTQtDestroyUniversalSlot(void *); - static void *sipTQtFindSlot(void *, const char *, PyObject *, const char *, - const char **); - static int sipTQtConnect(void *, const char *, void *, const char *, int); - static int sipTQtDisconnect(void *, const char *, void *, const char *); - static int sipTQtSameSignalSlotName(const char *, const char *); - static sipSlot *sipTQtFindSipslot(void *, void **); - static int sipTQtEmitSignal(PyObject *, const char *, PyObject *); - static int sipTQtConnectPySignal(PyObject *, const char *, PyObject *, - const char *); - static void sipTQtDisconnectPySignal(PyObject *, const char *, - PyObject *, const char *); -} - - -extern "C" { - -// The meta-type for PyTQt classes. It is just a marker type so that we can -// safely cast to get access to PyTQt3-specific data structures. -PyTypeObject pyqtWrapperType_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "qt.pyqtWrapperType", /* tp_name */ - sizeof (sipWrapperType), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - 0, /* tp_print */ -#endif - 0, /* tp_getattr */ - 0, /* tp_setattr */ -#if PY_VERSION_HEX >= 0x03050000 - 0, /* tp_as_async */ -#else - 0, /* tp_reserved */ -#endif - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ -#if PY_VERSION_HEX >= 0x03040000 - 0, /* tp_finalize */ -#endif -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall */ -#endif -#if PY_VERSION_HEX == 0x03080000 - 0, /* tp_print (deprecated) */ -#endif -}; - - -/* - * An entry in a linked list of slots. - */ -typedef struct _pyqt3SlotList { - /* The receiver. */ - sipSlot rx; - - /* Next in the list. */ - struct _pyqt3SlotList *next; -} pyqt3SlotList; - - -/* - * A Python signal. - */ -typedef struct _pyqt3PySig { - /* The name of the signal. */ - char *name; - - /* The list of receivers. */ - pyqt3SlotList *rxlist; - - /* Next in the list. */ - struct _pyqt3PySig *next; -} pyqt3PySig; - - -/* - * The C++ wrapper object used by PyTQt3. - */ -typedef struct _pyqtWrapper { - /* The super-type. */ - sipWrapper super; - - /* The list of Python signals. */ - pyqt3PySig *pySigList; -} pyqtWrapper; - - -/* - * Clear any slots connected to any Python signals. - */ -static void clear_py_signals_slots(pyqtWrapper *pw) -{ - pyqt3PySig *ps; - - for (ps = pw->pySigList; ps != NULL; ps = ps->next) - { - pyqt3SlotList *psrx; - - for (psrx = ps->rxlist; psrx != NULL; psrx = psrx->next) - sipClearAnySlotReference(&psrx->rx); - } -} - - -/* - * Find the given Python signal. - */ -static pyqt3PySig *find_py_signal(pyqtWrapper *pw, const char *sig) -{ - pyqt3PySig *ps; - - for (ps = pw->pySigList; ps != NULL; ps = ps->next) - if (sipTQtSameSignalSlotName(ps->name, sig)) - return ps; - - return 0; -} - - -/* - * Free an slot list entry. - */ -static void free_slot_list(pyqt3SlotList *sl) -{ - sipFreeSipslot(&sl->rx); - sipFree(sl); -} - - -/* - * The instance clear slot. - */ -static int pyqtWrapper_clear(pyqtWrapper *self) -{ - clear_py_signals_slots(self); - - return sipWrapper_Type->tp_clear((PyObject *)self); -} - - -/* - * The instance dealloc slot. - */ -static void pyqtWrapper_dealloc(pyqtWrapper *self) -{ - clear_py_signals_slots(self); - - while (self->pySigList != NULL) - { - pyqt3PySig *ps; - pyqt3SlotList *psrx; - - /* Take this one out of the list. */ - ps = self->pySigList; - self->pySigList = ps->next; - - while ((psrx = ps->rxlist) != NULL) - { - ps->rxlist = psrx->next; - free_slot_list(psrx); - } - - sipFree(ps->name); - sipFree(ps); - } - - sipWrapper_Type->tp_dealloc((PyObject *)self); -} - - -/* - * The instance traverse slot. - */ -static int pyqtWrapper_traverse(pyqtWrapper *self, visitproc visit, void *arg) -{ - int vret; - pyqt3PySig *ps; - - if ((vret = sipWrapper_Type->tp_traverse((PyObject *)self, visit, arg)) != 0) - return vret; - - for (ps = self->pySigList; ps != NULL; ps = ps->next) - { - pyqt3SlotList *psrx; - - for (psrx = ps->rxlist; psrx != NULL; psrx = psrx->next) - if ((vret = sipVisitSlot(&psrx->rx, visit, arg)) != 0) - return vret; - } - - return 0; -} - - -static sipWrapperType pyqtWrapper_Type = { -#if !defined(STACKLESS) - { -#endif - { - PyVarObject_HEAD_INIT(&pyqtWrapperType_Type, 0) - "qt.pyqtWrapper", /* tp_name */ - sizeof (pyqtWrapper), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pyqtWrapper_dealloc, /* tp_dealloc */ -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall_offset */ -#else - 0, /* tp_print */ -#endif - 0, /* tp_getattr */ - 0, /* tp_setattr */ -#if PY_VERSION_HEX >= 0x03050000 - 0, /* tp_as_async */ -#else - 0, /* tp_reserved */ -#endif - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)pyqtWrapper_traverse, /* tp_traverse */ - (inquiry)pyqtWrapper_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ -#if PY_VERSION_HEX >= 0x03040000 - 0, /* tp_finalize */ -#endif -#if PY_VERSION_HEX >= 0x03080000 - 0, /* tp_vectorcall */ -#endif -#if PY_VERSION_HEX == 0x03080000 - 0, /* tp_print (deprecated) */ -#endif - }, -#if !defined(STACKLESS) - }, -#endif - 0, - 0, - 0 -}; - -}; - - -// This enumerates the different dynamic signal argument types. -enum pyqt3SigArgType { - unknown_sat, - char_sat, - uchar_sat, - string_sat, - ustring_sat, - short_sat, - ushort_sat, - int_sat, - uint_sat, - long_sat, - ulong_sat, - longlong_sat, - ulonglong_sat, - float_sat, - double_sat, - enum_sat, - bool_sat, - void_sat, - class_sat, - classp_sat, - mtype_sat, - mtypep_sat, - qvariant_sat, - qvariantp_sat, - pyobject_sat, - schar_sat, - sstring_sat, - wchar_sat, - wstring_sat -}; - - -// This defines a single dynamic signal argument type. -struct pyqt3SigArg -{ - // The type. - pyqt3SigArgType atype; - - union { - // The Python type for classes. - sipWrapperType *wt; - - // The data for mapped types. - const sipTypeDef *mt; - - // The Python type for named enums. - PyTypeObject *et; - } u; -}; - - -// A parsed signal signature. -struct pyqt3Signature { - // The number of arguments. - int sg_nrargs; - - // The parsed arguments (heap). - pyqt3SigArg *sg_args; - - // The unparsed signature (heap). - char *sg_signature; - - // The next in the list. - pyqt3Signature *sg_next; -}; - - -// A connection to a universal slot. -struct pyqt3SlotConnection -{ - // The transmitter TQObject. - void *sc_transmitter; - - // The parsed signature. - const pyqt3Signature *sc_signature; - - // The slot. - sipSlot sc_slot; -}; - - -// This class is used as a slot on behalf of connections to a Python callable. -// It is derived from TQObject but is not run through moc. Instead the normal -// moc-generated methods are handwritten in order to implement a universal -// slot. This requires some knowledge of the internal implementation of -// signals and slots but it is likely that they will only change between major -// TQt versions. -class UniversalSlot : public TQObject -{ -public: - UniversalSlot(TQObject *qtx, pyqt3SlotConnection *conn, const char **member); - ~UniversalSlot(); - - virtual TQMetaObject *metaObject() const - { - return staticMetaObject(); - } - - virtual bool tqt_invoke(int, TQUObject *args); - static TQMetaObject *staticMetaObject(); - - static TQObject *lastSender; - - static UniversalSlot *unislots; - UniversalSlot *nextus, *prevus; - pyqt3SlotConnection conn; - -private: - static TQMetaObject *metaObj; -}; - - -// Create a universal slot. Note that this will leak if there is no signal -// transmitter (ie. no parent) - TQTimer.singleShot() for example. -UniversalSlot::UniversalSlot(TQObject *qtx, pyqt3SlotConnection *connection, const char **member) : TQObject() -{ - // Save the connection. - conn = *connection; - - // Detect when the transmitter is destroyed. - if (qtx) - connect(qtx, SIGNAL(destroyed(TQObject *)), SLOT(deleteLater())); - - // Return the slot to connect to. - *member = SLOT(unislot()); - - // Add this one to the global list. - nextus = unislots; - - if (nextus) - nextus -> prevus = this; - - prevus = 0; - unislots = this; -} - - -// Destroy a universal slot. -UniversalSlot::~UniversalSlot() -{ - SIP_BLOCK_THREADS - sipFreeSipslot(&conn.sc_slot); - SIP_UNBLOCK_THREADS - - // Remove this one from the global list. - if (nextus) - nextus -> prevus = prevus; - - if (prevus) - prevus -> nextus = nextus; - else - unislots = nextus; -} - - -// The last Python signal sender. -static PyObject *py_sender = 0; - - -TQMetaObject *UniversalSlot::metaObj = 0; - -static TQMetaObjectCleanUp cleanUp_UniversalSlot("UniversalSlot", &UniversalSlot::staticMetaObject); - -TQObject *UniversalSlot::lastSender = 0; -UniversalSlot *UniversalSlot::unislots = 0; - - -TQMetaObject *UniversalSlot::staticMetaObject() -{ - if (metaObj) - return metaObj; - - // Define a single slot that takes no arguments and so will accept any - // connection. - static const TQUMethod slot = {"unislot", 0, 0}; - static const TQMetaData slot_tbl[] = { - {"unislot()", &slot, TQMetaData::Public} - }; - - metaObj = TQMetaObject::new_metaobject( - "UniversalSlot", TQObject::staticMetaObject(), - slot_tbl, 1, - 0, 0, -#ifndef TQT_NO_PROPERTIES - 0, 0, - 0, 0, -#endif - 0, 0); - - cleanUp_UniversalSlot.setMetaObject(metaObj); - - return metaObj; -} - - -bool UniversalSlot::tqt_invoke(int id, TQUObject *qargs) -{ - if (id - staticMetaObject()->slotOffset() != 0) - return TQObject::tqt_invoke(id, qargs); - - bool ok = TRUE; - const pyqt3Signature *psig = conn.sc_signature; - TQVariant *qv; - - // Save in case it is asked for later. - lastSender = const_cast<TQObject *>(sender()); - - // If the sender was a TQSignal then the single argument will be wrapped - // in a TQVariant instance. At the moment we handle int argument as - // that is all that is needed by PyTQt (and PyKDE). - if (lastSender->inherits("TQSignal")) - qv = &static_QUType_TQVariant.get(qargs + 1); - else - qv = 0; - -#ifdef WITH_THREAD - PyGILState_STATE state = PyGILState_Ensure(); -#endif - - PyObject *argtup = PyTuple_New(psig->sg_nrargs); - - if (!argtup) - ok = FALSE; - else - { - for (int a = 0; a < psig->sg_nrargs; ++a) - { - PyObject *arg; - - ++qargs; - - switch (psig->sg_args[a].atype) - { - case char_sat: - case schar_sat: - case uchar_sat: - arg = PyBytes_FromStringAndSize((char *)static_QUType_ptr.get(qargs), 1); - break; - - case string_sat: - case sstring_sat: - case ustring_sat: - arg = PyBytes_FromString((char *)static_QUType_ptr.get(qargs)); - break; - - case short_sat: - arg = PyLong_FromLong(*(short *)static_QUType_ptr.get(qargs)); - break; - - case ushort_sat: - arg = PyLong_FromUnsignedLong(*(unsigned short *)static_QUType_ptr.get(qargs)); - break; - - case int_sat: - if (qv) - arg = PyLong_FromLong(qv -> asInt()); - else - arg = PyLong_FromLong(static_QUType_int.get(qargs)); - break; - - case uint_sat: - arg = PyLong_FromUnsignedLong(*(unsigned *)static_QUType_ptr.get(qargs)); - break; - - case long_sat: - arg = PyLong_FromLong(*(long *)static_QUType_ptr.get(qargs)); - break; - - case ulong_sat: - arg = PyLong_FromUnsignedLong(*(unsigned long *)static_QUType_ptr.get(qargs)); - break; - - case longlong_sat: - arg = PyLong_FromLongLong(*(PY_LONG_LONG *)static_QUType_ptr.get(qargs)); - break; - - case ulonglong_sat: - arg = PyLong_FromUnsignedLongLong(*(unsigned PY_LONG_LONG *)static_QUType_ptr.get(qargs)); - break; - - case float_sat: - arg = PyFloat_FromDouble(*(float *)static_QUType_ptr.get(qargs)); - break; - - case double_sat: - arg = PyFloat_FromDouble(static_QUType_double.get(qargs)); - break; - - case enum_sat: - arg = sipConvertFromNamedEnum(*(int *)static_QUType_ptr.get(qargs), psig->sg_args[a].u.et); - break; - - case bool_sat: - arg = PyLong_FromLong(static_QUType_bool.get(qargs)); - break; - - case void_sat: - arg = sipConvertFromVoidPtr((void *)static_QUType_ptr.get(qargs)); - break; - - case class_sat: - case classp_sat: - arg = sipConvertFromInstance((void *)static_QUType_ptr.get(qargs),psig->sg_args[a].u.wt,0); - break; - - case mtype_sat: - case mtypep_sat: - arg = sipConvertFromMappedType((void *)static_QUType_ptr.get(qargs),psig->sg_args[a].u.mt,0); - break; - - case qvariant_sat: - case qvariantp_sat: - arg = sipConvertFromInstance((void *)&static_QUType_TQVariant.get(qargs),sipClass_TQVariant,0); - break; - - case pyobject_sat: - arg = (PyObject *)static_QUType_ptr.get(qargs); - break; - - default: - arg = Py_NotImplemented; - Py_INCREF(Py_NotImplemented); - } - - PyTuple_SET_ITEM(argtup, a, arg); - } - - // Dispatch to the real slot. - if (ok) - { - PyObject *res = sipInvokeSlot(&conn.sc_slot, argtup); - - if (res) - Py_DECREF(res); - else - ok = FALSE; - } - - Py_DECREF(argtup); - } - - if (!ok) - PyErr_Print(); - -#ifdef WITH_THREAD - PyGILState_Release(state); -#endif - - return ok; -} - - -static pyqt3Signature *parseSignature(const char *sig); -static void parseType(const char *type, pyqt3SigArg *arg); - - -// Factory function to create a universal slot instance. Returns a pointer to -// the instance or 0 if there was an error. -static void *sipTQtCreateUniversalSlot(sipWrapper *tx, const char *sig, - PyObject *rxObj, const char *slot, const char **member, int) -{ - pyqt3SlotConnection conn; - - /* Initialise the connection. */ - if (tx && sipGetAddress(&tx->super) == NULL) - { - conn.sc_transmitter = 0; - } - else - { - conn.sc_transmitter = (tx ? sipGetCppPtr(&tx->super, 0) : 0); - } - - /* Save the real slot. */ - if (sipSaveSlot(&conn.sc_slot, rxObj, slot) < 0) - return 0; - - /* Parse the signature and create the universal slot. */ - if ((conn.sc_signature = parseSignature(sig)) == NULL) - { - sipFreeSipslot(&conn.sc_slot); - return 0; - } - - TQObject *qtx = 0; - - // See if the transmitter is a TQObject in which case we will connect - // to it's destroyed signal so that the universal slot can be destroyed - // at the same time. (Note that we used to do this by making the - // universal slot a child of the transmitter. This doesn't work as - // expected because TQWidget destroys its children before emitting the - // destroyed signal.) - if (tx && PyObject_TypeCheck((PyObject *)tx, (PyTypeObject *)sipClass_TQObject)) - qtx = reinterpret_cast<TQObject *>(conn.sc_transmitter); - - return new UniversalSlot(qtx, &conn, member); -} - - -// Parse the signal arguments for a connection. -static pyqt3Signature *parseSignature(const char *sig) -{ - static pyqt3Signature *psig_list = NULL; - pyqt3Signature *psig; - const char *sp, *ep; - - // First see if it has already been parsed. Note that both sides of a - // connection will probably be parsed twice because the function names will - // be different even though the signatures will probably be the same. We - // could be more clever, the most saving is when repeatedly emitting a - // signal for which this is sufficient. - for (psig = psig_list; psig != NULL; psig = psig->sg_next) - if (sipTQtSameSignalSlotName(psig->sg_signature, sig)) - return psig; - - // Create a new one including space for the copy of the signature. - if ((psig = (pyqt3Signature *)sipMalloc(sizeof (pyqt3Signature) + strlen(sig) + 1)) == NULL) - return NULL; - - psig->sg_signature = (char *)&psig[1]; - psig->sg_nrargs = 0; - psig->sg_args = 0; - - // Find the start and end of the arguments. - sp = strchr(sig, '('); - ep = strrchr(sig, ')'); - - // If the signal isn't well formed we assume TQt will pick it up. - if (sp && ep && sp < ep) - { - // Copy the signature arguments while counting them and removing - // non-significant spaces. Each argument is left as a '\0' terminated - // string. - char *dp = psig->sg_signature; - int depth = 0, nrcommas = 0, argstart = TRUE; - - for (;;) - { - char ch = *++sp; - - if (strchr(",*&)<>", ch)) - { - // Backup over any previous trailing space. - if (dp > psig->sg_signature && dp[-1] == ' ') - --dp; - - if (sp == ep) - { - *dp = '\0'; - break; - } - - if (ch == ',' && depth == 0) - { - *dp++ = '\0'; - ++nrcommas; - argstart = TRUE; - } - else - { - *dp++ = ch; - - // Make sure commas in template arguments are ignored. - if (ch == '<') - ++depth; - else if (ch == '>') - --depth; - } - } - else if (ch == ' ') - { - // Ignore leading and multiple spaces. - if (!argstart && dp[-1] != ' ') - *dp++ = ch; - } - else - { - *dp++ = ch; - argstart = FALSE; - } - } - - // Handle the arguments now they are in a normal form. - if (*psig->sg_signature) - { - char *arg = psig->sg_signature; - int a; - - // Allocate the space. - psig->sg_nrargs = nrcommas + 1; - - if ((psig->sg_args = (pyqt3SigArg *)sipMalloc(sizeof (pyqt3SigArg) * psig->sg_nrargs)) == NULL) - { - sipFree(psig); - return NULL; - } - - for (a = 0; a < psig->sg_nrargs; ++a) - { - parseType(arg, &psig->sg_args[a]); - - // Move to the start of the next argument. - arg += strlen(arg) + 1; - } - } - } - - // Make a deep copy of the signal. - strcpy(psig->sg_signature, sig); - - // Add it to the list so it can be re-used. - psig->sg_next = psig_list; - psig_list = psig; - - return psig; -} - - -// Parse a single type. -static void parseType(const char *type, pyqt3SigArg *arg) -{ - size_t btlen = 0; - int unsup, isref = FALSE, indir = 0; - const char *ep; - pyqt3SigArgType sat = unknown_sat; - - // Find the start of the significant part of the type. - if (strncmp(type, "const ", 6) == 0) - type += 6; - - // Find the length of the base type, the number of indirections and if it - // is a reference. - for (ep = type; *ep; ++ep) - if (*ep == '&') - isref = TRUE; - else if (*ep == '*') - ++indir; - else - ++btlen; - - // Extract the base type as a separate string. - char type_str[btlen + 1]; - - strncpy(type_str, type, btlen); - type_str[btlen] = '\0'; - - // Resolve any typedef which may mean more indirection. - type = sipResolveTypedef(type_str); - - // See if we need to make another copy. - bool copy = false; - - if (type) - { - btlen = strlen(type); - - // Remove any additional indirection. - while (btlen) - { - if (type[--btlen] == '*') - { - copy = true; - ++indir; - } - } - } - else - type = type_str; - - // Make sure this doesn't go out of scope while it is being used. - char base_type_str[btlen + 1]; - - if (copy) - { - // Extract the base type again. - strncpy(base_type_str, type, btlen); - base_type_str[btlen] = '\0'; - type = base_type_str; - } - - // Assume that anything other than a base type is unsupported. - unsup = (isref || indir); - - // Parse the base type. - switch (btlen) - { - case 3: - if (strcmp(type, "int") == 0) - sat = int_sat; - break; - - case 4: - if (strcmp(type, "bool") == 0) - sat = bool_sat; - else if (strcmp(type, "long") == 0) - sat = long_sat; - else if (strcmp(type, "char") == 0) - { - sat = (indir ? string_sat : char_sat); - unsup = (isref || indir > 1); - } - else if (strcmp(type, "void") == 0) - { - sat = void_sat; - unsup = (isref || indir != 1); - } - break; - - case 5: - if (strcmp(type, "float") == 0) - sat = float_sat; - else if (strcmp(type, "short") == 0) - sat = short_sat; - break; - - case 6: - if (strcmp(type, "double") == 0) - sat = double_sat; - break; - - case 7: - if (strcmp(type, "__int64") == 0) - sat = longlong_sat; - else if (strcmp(type, "wchar_t") == 0) - { - sat = (indir ? wstring_sat : wchar_sat); - unsup = (isref || indir > 1); - } - break; - - case 8: - if (strcmp(type, "unsigned") == 0) - sat = uint_sat; - else if (strcmp(type, "TQVariant") == 0) - { - if (indir == 0) - { - sat = qvariant_sat; - unsup = FALSE; - } - else if (indir == 1) - { - sat = qvariantp_sat; - unsup = FALSE; - } - } - break; - - case 9: - if (strcmp(type, "long long") == 0) - sat = longlong_sat; - break; - - case 11: - if (strcmp(type, "signed char") == 0) - { - sat = (indir ? sstring_sat : schar_sat); - unsup = (isref || indir > 1); - } - break; - - case 12: - if (strcmp(type, "unsigned int") == 0) - sat = uint_sat; - break; - - case 13: - if (strcmp(type, "unsigned long") == 0) - sat = ulong_sat; - else if (strcmp(type, "unsigned char") == 0) - { - sat = (indir ? ustring_sat : uchar_sat); - unsup = (isref || indir > 1); - } - else if (strcmp(type, "PyTQt_PyObject") == 0 && indir == 0) - { - sat = pyobject_sat; - unsup = FALSE; - } - break; - - case 14: - if (strcmp(type, "unsigned short") == 0) - sat = ushort_sat; - break; - - case 16: - if (strcmp(type, "unsigned __int64") == 0) - sat = ulonglong_sat; - break; - - case 18: - if (strcmp(type, "unsigned long long") == 0) - sat = ulonglong_sat; - break; - } - - if (sat == unknown_sat) - { - const sipTypeDef *td = sipFindType(type); - - if (td) - { - if (sipTypeIsClass(td)) - { - if (indir == 0) - sat = class_sat; - else if (indir == 1) - sat = classp_sat; - - arg->u.wt = (sipWrapperType *)sipTypeAsPyTypeObject(td); - } - else if (sipTypeIsMapped(td)) - { - if (indir == 0) - sat = mtype_sat; - else if (indir == 1) - sat = mtypep_sat; - - arg->u.mt = td; - } - else if (sipTypeIsEnum(td)) - { - if (indir == 0) - sat = enum_sat; - - arg->u.et = sipTypeAsPyTypeObject(td); - } - } - } - else if (unsup) - sat = unknown_sat; - - arg->atype = sat; -} - - -// Dispose of a receiver that might be a universal slot. -static void sipTQtDestroyUniversalSlot(void *rx) -{ - for (UniversalSlot *us = UniversalSlot::unislots; us; us = us->nextus) - if (us == reinterpret_cast<TQObject *>(rx)) - { - delete us; - break; - } -} - - -// Search for the universal slot connected to a particular TQt signal. -static void *sipTQtFindSlot(void *tx, const char *sig, PyObject *rxObj, - const char *slot, const char **member) -{ - for (UniversalSlot *us = UniversalSlot::unislots; us; us = us->nextus) - { - pyqt3SlotConnection *conn = &us->conn; - - if (conn->sc_transmitter != tx) - continue; - - if (!sipTQtSameSignalSlotName(conn->sc_signature->sg_signature, sig)) - continue; - - if (sipSameSlot(&conn->sc_slot, rxObj, slot)) - { - *member = SLOT(unislot()); - return us; - } - } - - return 0; -} - - -// Connect a TQt signal to a TQt slot. -static int sipTQtConnect(void *tx, const char *sig, void *rx, const char *slot, int) -{ - return TQObject::connect(reinterpret_cast<TQObject *>(tx), sig, - reinterpret_cast<TQObject *>(rx), slot); -} - - -// Disconnect a TQt signal from a TQt slot. -static int sipTQtDisconnect(void *tx, const char *sig, void *rx, const char *slot) -{ - return TQObject::disconnect(reinterpret_cast<TQObject *>(tx), sig, - reinterpret_cast<TQObject *>(rx), slot); -} - - -// See if two signal or slot names are the same. -static int sipTQtSameSignalSlotName(const char *s1, const char *s2) -{ - // moc formats signal names, so we should first convert the supplied - // string to the same format before comparing them. Instead we just - // compare them as they are, but ignoring all spaces - this will have - // the same result. - do - { - // Skip any spaces. - - while (*s1 == ' ') - ++s1; - - while (*s2 == ' ') - ++s2; - - if (*s1++ != *s2) - return 0; - } - while (*s2++ != '\0'); - - return 1; -} - - -// Return the next slot for a particular transmitter. This will be called with -// the GIL locked. -static sipSlot *sipTQtFindSipslot(void *tx, void **context) -{ - UniversalSlot *us = *reinterpret_cast<UniversalSlot **>(context); - - if (!us) - us = UniversalSlot::unislots; - - sipSlot *slot = 0; - - while (us) - { - pyqt3SlotConnection *this_conn = &us->conn; - - us = us->nextus; - - if (this_conn->sc_transmitter == tx) - { - slot = &this_conn->sc_slot; - break; - } - } - - *context = us; - - return slot; -} - - -// Connect a slot from a Python signal. -static int sipTQtConnectPySignal(PyObject *txObj, const char *sig, - PyObject *rxObj, const char *slot) -{ - pyqt3PySig *ps; - pyqt3SlotList *psrx; - pyqtWrapper *pw = (pyqtWrapper *)txObj; - - /* Create a new one if necessary. */ - if ((ps = find_py_signal(pw, sig)) == NULL) - { - if ((ps = (pyqt3PySig *)sipMalloc(sizeof (pyqt3PySig))) == NULL) - return -1; - - if ((ps->name = (char *)sipMalloc(strlen(sig) + 1)) == NULL) - { - sipFree(ps); - return -1; - } - - strcpy(ps->name, sig); - - ps->rxlist = NULL; - ps->next = pw->pySigList; - - pw->pySigList = ps; - } - - /* Create the new receiver. */ - if ((psrx = (pyqt3SlotList *)sipMalloc(sizeof (pyqt3SlotList))) == NULL) - return -1; - - if (sipSaveSlot(&psrx->rx, rxObj, slot) < 0) - { - sipFree(psrx); - return -1; - } - - psrx->next = ps->rxlist; - ps->rxlist = psrx; - - return 0; -} - - -// Disconnect a slot from a Python signal. -static void sipTQtDisconnectPySignal(PyObject *txObj, const char *sig, - PyObject *rxObj, const char *slot) -{ - pyqt3PySig *ps; - - if ((ps = find_py_signal((pyqtWrapper *)txObj, sig)) != NULL) - { - pyqt3SlotList **psrxp; - - for (psrxp = &ps->rxlist; *psrxp != NULL; psrxp = &(*psrxp)->next) - { - pyqt3SlotList *psrx = *psrxp; - - if (sipSameSlot(&psrx->rx, rxObj, slot)) - { - *psrxp = psrx->next; - free_slot_list(psrx); - break; - } - } - } -} - - -// Emit a signal for the sip module. -static int sipTQtEmitSignal(PyObject *self, const char *sig, PyObject *sigargs) -{ - return pyqt3EmitSignal(self, sig, sigargs); -} - - -// Emit a Python or TQt signal. -int pyqt3EmitSignal(PyObject *self, const char *sig, PyObject *sigargs) -{ - // Don't do anything if signals are blocked. TQt signals would be blocked - // anyway, but this blocks Python signals as well. - void *tx = sipGetCppPtr((sipSimpleWrapper *)self, sipType_TQObject); - - if (!tx) - return 0; - - if (reinterpret_cast<TQObject *>(tx)->signalsBlocked()) - return 0; - - // See if it is a TQt signal. - if (*sig == '2') - { - pyqt3QtSignal *tab; - - // Search the table. - for (tab = ((pyqt3ClassTypeDef *)((sipWrapperType *)(self->ob_type))->type)->qt3_emit; tab->st_name != NULL; ++tab) - { - const char *sp, *tp; - bool found; - - // Compare only the base name. - sp = &sig[1]; - tp = tab->st_name; - - found = true; - - while (*sp != '\0' && *sp != '(' && *tp != '\0') - if (*sp++ != *tp++) - { - found = false; - break; - } - - if (found) - return (*tab->st_emitfunc)((sipSimpleWrapper *)self, sigargs); - } - - // It wasn't found if we got this far. - PyErr_Format(PyExc_NameError, "Invalid signal %s", &sig[1]); - - return -1; - } - - pyqt3PySig *ps = find_py_signal((pyqtWrapper *)self, sig); - - if (ps) - { - int rc = 0; - pyqt3SlotList *rxlist = ps->rxlist; - - // Forget the last TQt sender and remember this one. - UniversalSlot::lastSender = 0; - py_sender = self; - - // Apply the arguments to each slot method. - while (rxlist && rc >= 0) - { - pyqt3SlotList *next; - PyObject *res; - - // We get the next in the list before calling the slot in case the - // list gets changed by the slot - usually because the slot - // disconnects itself. - next = rxlist->next; - - res = sipInvokeSlot(&rxlist->rx, sigargs); - - if (res) - Py_DECREF(res); - else - rc = -1; - - rxlist = next; - } - - // Forget this as a sender. - py_sender = NULL; - - return rc; - } - - return 0; -} - - -// Return the most recent signal sender. -PyObject *pyqt3GetSender() -{ - PyObject *sender; - - // If there is a TQt sender then it is more recent than the last Python - // sender, so use it instead. - if (UniversalSlot::lastSender) - { - sender = sipConvertFromType(UniversalSlot::lastSender, sipType_TQObject, - NULL); - } - else - { - sender = (py_sender ? py_sender : Py_None); - Py_INCREF(sender); - } - - return sender; -} - -%End - -%InitialisationCode - // Initialise the meta-type. - pyqtWrapperType_Type.tp_base = sipWrapperType_Type; - - if (PyType_Ready(&pyqtWrapperType_Type) < 0) - Py_FatalError("qt: Failed to initialise pyqtWrapperType type"); - - // Register the meta-type. - if (sipRegisterPyType((PyTypeObject *)&pyqtWrapperType_Type) < 0) - Py_FatalError("qt: Failed to register pyqtWrapperType type"); - - // Initialise the super-type. - pyqtWrapper_Type.super.ht_type.tp_base = sipWrapper_Type; - - if (PyType_Ready((PyTypeObject *)&pyqtWrapper_Type) < 0) - Py_FatalError("qt: Failed to initialise pyqtWrapper type"); - - // Register the super-type. - if (sipRegisterPyType((PyTypeObject *)&pyqtWrapper_Type) < 0) - Py_FatalError("qt: Failed to register pyqtWrapper type"); -%End |