]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/PC/os2emx/pythonpm.c
Inital import
[l4.git] / l4 / pkg / python / contrib / PC / os2emx / pythonpm.c
1 /* OS/2 PM main program - creates a hidden window, and starts Python
2  * interpreter in a separate thread, so that Python scripts can be
3  * run in PM process space without a console Window.  The interpreter
4  * is incorporated by linking in the Python DLL.
5  *
6  * As it stands, I don't think this is adequate for supporting Python
7  * GUI modules, as the Python thread doesn't have its own message
8  * queue - which is required of threads that want to create/use
9  * PM windows.
10  *
11  * This code owes a lot to "OS/2 Presentation Manager Programming", by
12  * Charles Petzold.
13  *
14  * Andrew MacIntyre <andymac@bullseye.apana.org.au>, August 2001.
15  * Released under the terms of the Python 2.1.1 licence - see the LICENCE
16  * file in the Python v2.1.1 (or later) source distribution.
17  * Copyright assigned to the Python Software Foundation, 2001.
18  */
19
20 #define INCL_DOS
21 #define INCL_WIN
22 #include <os2.h>
23 #include <process.h>
24
25 #include "Python.h"
26
27 /* use structure to pass command line to Python thread */
28 typedef struct
29 {
30         int argc;
31         char **argv;
32         HWND Frame;
33         int running;
34 } arglist;
35
36 /* make this a global to simplify access.
37  * it should only be set from the Python thread, or by the code that
38  * initiates the Python thread when the thread cannot be created.
39  */
40 int PythonRC;
41
42 extern DL_EXPORT(int) Py_Main(int, char **);
43 void PythonThread(void *);
44
45 int
46 main(int argc, char **argv)
47 {
48         ULONG FrameFlags = FCF_TITLEBAR |
49                            FCF_SYSMENU |
50                            FCF_SIZEBORDER |
51                            FCF_HIDEBUTTON |
52                            FCF_SHELLPOSITION |
53                            FCF_TASKLIST;
54         HAB hab;
55         HMQ hmq;
56         HWND Client;
57         QMSG qmsg;
58         arglist args;
59         int python_tid;
60
61         /* init PM and create message queue */
62         hab = WinInitialize(0);
63         hmq = WinCreateMsgQueue(hab, 0);
64
65         /* create a (hidden) Window to house the window procedure */
66         args.Frame = WinCreateStdWindow(HWND_DESKTOP,
67                                         0,
68                                         &FrameFlags,
69                                         NULL,
70                                         "PythonPM",
71                                         0L,
72                                         0,
73                                         0,
74                                         &Client);
75
76         /* run Python interpreter in a thread */
77         args.argc = argc;
78         args.argv = argv;
79         args.running = 0;
80         if (-1 == (python_tid = _beginthread(PythonThread, NULL, 1024 * 1024, &args)))
81         {
82                 /* couldn't start thread */
83                 WinAlarm(HWND_DESKTOP, WA_ERROR);
84                 PythonRC = 1;
85         }
86         else
87         {
88                 /* process PM messages, until Python exits */
89                 while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0))
90                         WinDispatchMsg(hab, &qmsg);
91                 if (args.running > 0)
92                         DosKillThread(python_tid);
93         }
94                 
95         /* destroy window, shutdown message queue and PM */
96         WinDestroyWindow(args.Frame);
97         WinDestroyMsgQueue(hmq);
98         WinTerminate(hab);
99
100         return PythonRC;
101 }
102
103 void PythonThread(void *argl)
104 {
105         HAB hab;
106         arglist *args;
107
108         /* PM initialisation */
109         hab = WinInitialize(0);
110
111         /* start Python */
112         args = (arglist *)argl;
113         args->running = 1;
114         PythonRC = Py_Main(args->argc, args->argv);
115
116         /* enter a critical section and send the termination message */
117         DosEnterCritSec();
118         args->running = 0;
119         WinPostMsg(args->Frame, WM_QUIT, NULL, NULL);
120
121         /* shutdown PM and terminate thread */
122         WinTerminate(hab);
123         _endthread();
124 }