| /* 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(); | |
| } |