// This is the SIP interface definition for TQApplication. // // Copyright (c) 2007 // Riverbank Computing Limited // // 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 TQApplication TQApplication int &argc char **argv This takes one parameter which is a list of argument strings. Arguments used by TQt are removed from the list. TQApplication int &argc char **argv bool GUIenabled This takes two parameters, the first of which is a list of argument strings. Arguments used by TQt are removed from the list. TQApplication int &argc char **argv Type type This takes two parameters, the first of which is a list of argument strings. Arguments used by TQt are removed from the list. (TQt v2.2+) int exec This has been renamed to exec_loop in Python. %End TQApplication *qApp; class TQApplication : TQObject { %TypeHeaderCode #include #include %End public: TQApplication(SIP_PYLIST) /PostHook=__pyTQtTQAppHook__/ [(int &,char **)]; %MethodCode // The Python interface is a list of argument strings that is // modified. int argc; char **argv; // Convert the list. if ((argv = pyArgvToC(a0,argc)) == NULL) sipIsErr = 1; else { // Create it now the arguments are right. static int nargc; nargc = argc; Py_BEGIN_ALLOW_THREADS sipCpp = new sipTQApplication(nargc,argv); Py_END_ALLOW_THREADS // Now modify the original list. updatePyArgv(a0,argc,argv); } %End TQApplication(SIP_PYLIST,bool) /PostHook=__pyTQtTQAppHook__/ [(int &,char **,bool)]; %MethodCode // The Python interface is a list of argument strings that is // modified. int argc; char **argv; // Convert the list. if ((argv = pyArgvToC(a0,argc)) == NULL) sipIsErr = 1; else { // Create it now the arguments are right. static int nargc; nargc = argc; Py_BEGIN_ALLOW_THREADS sipCpp = new sipTQApplication(nargc,argv,a1); Py_END_ALLOW_THREADS // Now modify the original list. updatePyArgv(a0,argc,argv); } %End %If (TQt_2_2_0 -) enum Type { Tty, GuiClient, GuiServer }; TQApplication(SIP_PYLIST,Type /Constrained/) /PostHook=__pyTQtTQAppHook__/ [(int &,char **,Type)]; %MethodCode // The Python interface is a list of argument strings that is // modified. int argc; char **argv; // Convert the list. if ((argv = pyArgvToC(a0,argc)) == NULL) sipIsErr = 1; else { // Create it now the arguments are right. static int nargc; nargc = argc; Py_BEGIN_ALLOW_THREADS sipCpp = new sipTQApplication(nargc,argv,(TQApplication::Type)a1); Py_END_ALLOW_THREADS // Now modify the original list. updatePyArgv(a0,argc,argv); } %End %End ~TQApplication(); %MethodCode // Make sure all remaining top level widgets are not owned by // Python. When a PyTQt script terminates we have no control // over the order in which the TQApplication instance and the // top level widgets are destroyed. If the former happens // first then we get a seg. fault. We could take the approach // of only pretending to delete the TQApplication instance, but // TQt seems to allow an application to delete the TQApplication // instance and then create another one. The approach we take // is to transfer ownership of all top level widgets away from // Python so that the C++ dtor is not called if they are // destroyed after the TQApplication instance. This might be // seen as a memory leak - but if we really are terminating // then it doesn't matter, and if we are just deleting the // TQApplication instance then (I think) we should have already // deleted the top level widgets manually. In any event, the X // server resources will be freed. TQWidgetList *tlw = TQApplication::topLevelWidgets(); TQWidgetListIt it(*tlw); TQWidget *w; while ((w = it.current()) != 0) { PyObject *sw; if ((sw = sipGetWrapper(w,sipClass_TQWidget)) != NULL) sipTransferTo(sw,NULL); ++it; } delete tlw; %End int argc() const; SIP_PYLIST argv() const; %MethodCode // The Python interface returns a list of strings. int argc = sipCpp -> argc(); if ((sipRes = PyList_New(argc)) == NULL) sipIsErr = 1; else for (int a = 0; a < argc; ++a) if (PyList_SetItem(sipRes,a,PyString_FromString(sipCpp -> argv()[a])) < 0) { Py_DECREF(sipRes); sipIsErr = 1; break; } %End %If (TQt_2_3_0 -) Type type() const; %End %If (- TQt_2_00) static GUIStyle style(); static void setStyle(GUIStyle); %End %If (TQt_2_00 -) static TQStyle &style(); static void setStyle(TQStyle * /Transfer/); %End %If (TQt_3_0_0 -) static TQStyle *setStyle(const TQString &); %End %If (- TQt_2_00) enum ColorSpec { NormalColor = 0, CustomColor = 1, PrivateColor = 4, ManyColor = 4, TrueColor = 4 }; %End %If (TQt_2_00 -) enum ColorSpec { NormalColor = 0, CustomColor = 1, ManyColor = 2 }; %End static int colorSpec(); static void setColorSpec(int); static TQCursor *overrideCursor(); static void setOverrideCursor(TQCursor &,bool = 0); static void restoreOverrideCursor(); static bool hasGlobalMouseTracking(); static void setGlobalMouseTracking(bool); %If (- TQt_2_00) static TQPalette *palette(); static void setPalette(TQPalette &,bool = 0); static TQFont *font(); static void setFont(const TQFont &,bool = 0); %End %If (TQt_2_00 -) static TQPalette palette(const TQWidget * = 0); static void setPalette(TQPalette &,bool = 0,const char * = 0); static TQFont font(const TQWidget * = 0); static void setFont(const TQFont &,bool = 0,const char * = 0); %End static TQFontMetrics fontMetrics(); TQWidget *mainWidget() const; %If (- TQt_2_00) // We may not need the /Transfer/ now that the TQApplication dtor is // instrumented, but we'll leave it in so as not to break old programs // needlessly. void setMainWidget(TQWidget * /Transfer/); %End %If (TQt_2_00 -) virtual void setMainWidget(TQWidget *); virtual void polish(TQWidget *); %End static TQWidgetList *allWidgets(); static TQWidgetList *topLevelWidgets(); %If (- TQt_3_0_0) static TQWidget *desktop(); %End %If (TQt_3_0_0 -) static TQDesktopWidget *desktop(); %End static TQWidget *activePopupWidget(); static TQWidget *activeModalWidget(); static TQClipboard *clipboard(); TQWidget *focusWidget() const; %If (TQt_2_00 -) TQWidget *activeWindow() const; %End static TQWidget *widgetAt(int,int,bool = 0); static TQWidget *widgetAt(const TQPoint &,bool = 0); %If (TQt_3_1_0 -) static TQEventLoop *eventLoop(); %End int exec() /PyName=exec_loop, ReleaseGIL, PreHook=__pyTQtPreEventLoopHook__, PostHook=__pyTQtPostEventLoopHook__/; void processEvents() /ReleaseGIL/; void processEvents(int) /ReleaseGIL/; void processOneEvent() /ReleaseGIL/; %If (TQt_3_0_0 -) bool hasPendingEvents(); %End int enter_loop() /ReleaseGIL/; void exit_loop(); %If (TQt_2_00 -) int loopLevel() const; %End static void exit(int = 0); static bool sendEvent(TQObject *,TQEvent *) /ReleaseGIL/; static void postEvent(TQObject *,TQEvent * /Transfer/) /ReleaseGIL/; static void sendPostedEvents(TQObject *,int) /ReleaseGIL/; %If (TQt_2_00 -) static void sendPostedEvents() /ReleaseGIL/; static void removePostedEvents(TQObject *); %End virtual bool notify(TQObject *,TQEvent *) /ReleaseGIL/; static bool startingUp(); static bool closingDown(); static void flushX(); %If (TQt_3_0_0 -) static void flush(); %End static void syncX(); static void beep(); %If (TQt_2_00 -) void setDefaultCodec(TQTextCodec *); TQTextCodec *defaultCodec() const; void installTranslator(TQTranslator *); void removeTranslator(TQTranslator *); %End %If (TQt_2_00 - TQt_3_0_0) TQString translate(const char *,const char *) const; %End %If (TQt_2_2_0 - TQt_3_0_0) TQString translate(const char *,const char *,const char *) const; %End %If (TQt_3_0_0 -) enum Encoding { DefaultCodec, UnicodeUTF8 }; TQString translate(const char *,const char *,const char * = 0, Encoding = DefaultCodec) const; %End %If (TQt_3_2_0 -) TQString applicationDirPath(); TQString applicationFilePath(); %End %If (- TQt_3_0_0) static void setWinStyleHighlightColor(const TQColor &); static const TQColor &winStyleHighlightColor(); %End %If (TQt_2_00 -) static void setDesktopSettingsAware(bool); static bool desktopSettingsAware(); static void setCursorFlashTime(int); static int cursorFlashTime(); %End static void setDoubleClickInterval(int); static int doubleClickInterval(); %If (TQt_2_1_0 -) static void setWheelScrollLines(int); static int wheelScrollLines(); %If (TQt_2_2_0 -) static void setGlobalStrut(const TQSize &); static TQSize globalStrut(); %End %If (TQt_3_0_0 -) static void setLibraryPaths(const TQStringList &); static TQStringList libraryPaths(); static void addLibraryPath(const TQString &); static void removeLibraryPath(const TQString &); %End static void setStartDragTime(int); static int startDragTime(); static void setStartDragDistance(int); static int startDragDistance(); %If (TQt_3_0_0 -) static void setReverseLayout(bool); static bool reverseLayout(); static int horizontalAlignment(int); %End %If (TQt_2_2_0 -) static bool isEffectEnabled(TQt::UIEffect); static void setEffectEnabled(TQt::UIEffect,bool = 1); %End %End %If (TQt_2_00 -) bool isSessionRestored() const; TQString sessionId() const; %If (TQt_3_1_0 -) TQString sessionKey() const; %End virtual void commitData(TQSessionManager &); virtual void saveState(TQSessionManager &); %End %If (TQt_2_1_0 -) void wakeUpGuiThread(); %End %If (TQt_THREAD_SUPPORT) %If (TQt_2_2_0 -) void lock() /ReleaseGIL/; void unlock(bool = 1); bool locked(); %End %If (TQt_3_0_0 -) bool tryLock(); %End %End signals: void lastWindowClosed(); %If (TQt_2_00 -) void aboutToQuit(); %End %If (TQt_2_1_0 -) void guiThreadAwake(); %End public slots: void quit(); %If (TQt_2_00 -) void closeAllWindows(); %End %If (TQt_3_2_0 -) void aboutTQt(); %End protected: %If (TQt_3_1_0 -) bool event(TQEvent *); %End private: TQApplication(const TQApplication &); %TypeCode #include // Convert a Python argv list to a conventional C argc count and argv array. static char **pyArgvToC(PyObject *argvlist,int &argc) { char **argv; argc = PyList_Size(argvlist); // Allocate space for two copies of the argument pointers, plus the // terminating NULL. if ((argv = (char **)sipMalloc(2 * (argc + 1) * sizeof (char *))) == NULL) return NULL; // Convert the list. for (int a = 0; a < argc; ++a) { char *arg; // Get the argument and allocate memory for it. if ((arg = PyString_AsString(PyList_GetItem(argvlist,a))) == NULL || (argv[a] = (char *)sipMalloc(strlen(arg) + 1)) == NULL) return NULL; // Copy the argument and save a pointer to it. strcpy(argv[a],arg); argv[a + argc + 1] = argv[a]; } argv[argc + argc + 1] = argv[argc] = NULL; return argv; } // Remove arguments from the Python argv list that have been removed from the // C argv array. static void updatePyArgv(PyObject *argvlist,int argc,char **argv) { for (int a = 0, na = 0; a < argc; ++a) { // See if it was removed. if (argv[na] == argv[a + argc + 1]) ++na; else PyList_SetSlice(argvlist,na,na + 1,NULL); } } %End }; enum TQtMsgType { TQtDebugMsg, TQtWarningMsg, TQtFatalMsg }; SIP_PYCALLABLE qInstallMsgHandler(SIP_PYCALLABLE /AllowNone/); %MethodCode void (*old)(TQtMsgType, const char *); // Treat None as the default handler. old = qInstallMsgHandler((a0 != Py_None) ? pyqtMsgHandler : 0); // If we recognise the old handler, then return it. Otherwise return // the default handler. This doesn't exactly mimic the TQt behaviour // but it is probably close enough for the way it will be used. sipRes = (old == pyqtMsgHandler) ? pyqtPyMsgHandler : Py_None; Py_INCREF(sipRes); // Save the new Python handler. Py_XDECREF(pyqtPyMsgHandler); pyqtPyMsgHandler = a0; Py_INCREF(pyqtPyMsgHandler); %End %ModuleCode // The user supplied Python handler. static PyObject *pyqtPyMsgHandler = 0; // The C++ wrapper around the Python handler. static void pyqtMsgHandler(TQtMsgType type, const char *msg) { PyObject *res; SIP_BLOCK_THREADS #if SIP_VERSION >= 0x040200 res = sipCallMethod(0, pyqtPyMsgHandler, "Es", type, sipEnum_TQtMsgType, msg); #elif SIP_VERSION >= 0x040000 res = sipCallMethod(0, pyqtPyMsgHandler, "es", type, msg); #else PyObject *args = Py_BuildValue("is", type, msg); if (args != NULL) { res = PyEval_CallObject(pyqtPyMsgHandler, args); Py_DECREF(args); } #endif Py_XDECREF(res); if (res != NULL && res != Py_None) { PyErr_SetString(PyExc_TypeError, "invalid result type from PyTQt message handler"); res = NULL; } if (res == NULL) PyErr_Print(); SIP_UNBLOCK_THREADS } %End