| /* OS/2 PM main program - creates a hidden window, and starts Python | 
 |  * interpreter in a separate thread, so that Python scripts can be | 
 |  * run in PM process space without a console Window.  The interpreter | 
 |  * is incorporated by linking in the Python DLL. | 
 |  * | 
 |  * As it stands, I don't think this is adequate for supporting Python | 
 |  * GUI modules, as the Python thread doesn't have its own message | 
 |  * queue - which is required of threads that want to create/use | 
 |  * PM windows. | 
 |  * | 
 |  * This code owes a lot to "OS/2 Presentation Manager Programming", by | 
 |  * Charles Petzold. | 
 |  * | 
 |  * Andrew MacIntyre <andymac@bullseye.apana.org.au>, August 2001. | 
 |  * Released under the terms of the Python 2.1.1 licence - see the LICENCE | 
 |  * file in the Python v2.1.1 (or later) source distribution. | 
 |  * Copyright assigned to the Python Software Foundation, 2001. | 
 |  */ | 
 |  | 
 | #define INCL_DOS | 
 | #define INCL_WIN | 
 | #include <os2.h> | 
 | #include <process.h> | 
 |  | 
 | #include "Python.h" | 
 |  | 
 | /* use structure to pass command line to Python thread */ | 
 | typedef struct | 
 | { | 
 |     int argc; | 
 |     char **argv; | 
 |     HWND Frame; | 
 |     int running; | 
 | } arglist; | 
 |  | 
 | /* make this a global to simplify access. | 
 |  * it should only be set from the Python thread, or by the code that | 
 |  * initiates the Python thread when the thread cannot be created. | 
 |  */ | 
 | int PythonRC; | 
 |  | 
 | extern DL_EXPORT(int) Py_Main(int, char **); | 
 | void PythonThread(void *); | 
 |  | 
 | int | 
 | main(int argc, char **argv) | 
 | { | 
 |     ULONG FrameFlags = FCF_TITLEBAR | | 
 |                        FCF_SYSMENU | | 
 |                        FCF_SIZEBORDER | | 
 |                        FCF_HIDEBUTTON | | 
 |                        FCF_SHELLPOSITION | | 
 |                        FCF_TASKLIST; | 
 |     HAB hab; | 
 |     HMQ hmq; | 
 |     HWND Client; | 
 |     QMSG qmsg; | 
 |     arglist args; | 
 |     int python_tid; | 
 |  | 
 |     /* init PM and create message queue */ | 
 |     hab = WinInitialize(0); | 
 |     hmq = WinCreateMsgQueue(hab, 0); | 
 |  | 
 |     /* create a (hidden) Window to house the window procedure */ | 
 |     args.Frame = WinCreateStdWindow(HWND_DESKTOP, | 
 |                                     0, | 
 |                                     &FrameFlags, | 
 |                                     NULL, | 
 |                                     "PythonPM", | 
 |                                     0L, | 
 |                                     0, | 
 |                                     0, | 
 |                                     &Client); | 
 |  | 
 |     /* run Python interpreter in a thread */ | 
 |     args.argc = argc; | 
 |     args.argv = argv; | 
 |     args.running = 0; | 
 |     if (-1 == (python_tid = _beginthread(PythonThread, NULL, 1024 * 1024, &args))) | 
 |     { | 
 |         /* couldn't start thread */ | 
 |         WinAlarm(HWND_DESKTOP, WA_ERROR); | 
 |         PythonRC = 1; | 
 |     } | 
 |     else | 
 |     { | 
 |         /* process PM messages, until Python exits */ | 
 |         while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0)) | 
 |             WinDispatchMsg(hab, &qmsg); | 
 |         if (args.running > 0) | 
 |             DosKillThread(python_tid); | 
 |     } | 
 |  | 
 |     /* destroy window, shutdown message queue and PM */ | 
 |     WinDestroyWindow(args.Frame); | 
 |     WinDestroyMsgQueue(hmq); | 
 |     WinTerminate(hab); | 
 |  | 
 |     return PythonRC; | 
 | } | 
 |  | 
 | void PythonThread(void *argl) | 
 | { | 
 |     HAB hab; | 
 |     arglist *args; | 
 |  | 
 |     /* PM initialisation */ | 
 |     hab = WinInitialize(0); | 
 |  | 
 |     /* start Python */ | 
 |     args = (arglist *)argl; | 
 |     args->running = 1; | 
 |     PythonRC = Py_Main(args->argc, args->argv); | 
 |  | 
 |     /* enter a critical section and send the termination message */ | 
 |     DosEnterCritSec(); | 
 |     args->running = 0; | 
 |     WinPostMsg(args->Frame, WM_QUIT, NULL, NULL); | 
 |  | 
 |     /* shutdown PM and terminate thread */ | 
 |     WinTerminate(hab); | 
 |     _endthread(); | 
 | } |