You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.0 KiB
124 lines
3.0 KiB
/* 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(); |
|
}
|
|
|