Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a0472f7

Browse files
committed
Mods by Alexandre Parenteau to allow embedding programs to disable the MacPython console window completely, and optionally route console output (and input) to routines provided by the embedding app.
Things don't fully work yet, but at least it doesn't break anything.
1 parent 509ad42 commit a0472f7

3 files changed

Lines changed: 90 additions & 45 deletions

File tree

Mac/Build/PythonCore.exp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ GUSISetupFactories
55
__vt__15GUSISIOUXDevice # GUSISIOUXDevice::__vt
66
__vt__15GUSISIOUXSocket # GUSISIOUXSocket::__vt
77
sInstance__15GUSISIOUXDevice # GUSISIOUXDevice::sInstance
8-
sInstance__15GUSISIOUXSocket # GUSISIOUXSocket::sInstance
8+
initialized__15GUSISIOUXSocket # GUSISIOUXSocket::initialized
99
__dt__15GUSISIOUXDeviceFv # GUSISIOUXDevice::~GUSISIOUXDevice()
10+
PyMac_DummyWriteHandler
11+
PyMac_DummyReadHandler
12+
PyMac_SetConsoleHandler
1013
GUSISetupConsoleDescriptors
1114
open__15GUSISIOUXDeviceFR13GUSIFileTokeni # GUSISIOUXDevice::open(GUSIFileToken&,int)
1215
Want__15GUSISIOUXDeviceFR13GUSIFileToken # GUSISIOUXDevice::Want(GUSIFileToken&)
@@ -20,8 +23,8 @@ write__15GUSISIOUXSocketFRC12GUSIGatherer # GUSISIOUXSocket::write(const GUSIGa
2023
read__15GUSISIOUXSocketFRC13GUSIScatterer # GUSISIOUXSocket::read(const GUSIScatterer&)
2124
__dt__15GUSISIOUXSocketFv # GUSISIOUXSocket::~GUSISIOUXSocket()
2225
Initialize__15GUSISIOUXSocketFv # GUSISIOUXSocket::Initialize()
23-
__ct__15GUSISIOUXSocketFv # GUSISIOUXSocket::GUSISIOUXSocket()
24-
Instance__15GUSISIOUXSocketFv # GUSISIOUXSocket::Instance()
26+
__ct__15GUSISIOUXSocketFi # GUSISIOUXSocket::GUSISIOUXSocket(int)
27+
Instance__15GUSISIOUXSocketFi # GUSISIOUXSocket::Instance(int)
2528
Py_FileSystemDefaultEncoding
2629
_PyBuiltin_Init
2730
_PyEval_SliceIndex

Mac/Build/PythonCoreCarbon.exp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ GUSISetupFactories
55
__vt__15GUSISIOUXDevice # GUSISIOUXDevice::__vt
66
__vt__15GUSISIOUXSocket # GUSISIOUXSocket::__vt
77
sInstance__15GUSISIOUXDevice # GUSISIOUXDevice::sInstance
8-
sInstance__15GUSISIOUXSocket # GUSISIOUXSocket::sInstance
8+
initialized__15GUSISIOUXSocket # GUSISIOUXSocket::initialized
99
__dt__15GUSISIOUXDeviceFv # GUSISIOUXDevice::~GUSISIOUXDevice()
10+
PyMac_DummyWriteHandler
11+
PyMac_DummyReadHandler
12+
PyMac_SetConsoleHandler
1013
GUSISetupConsoleDescriptors
1114
open__15GUSISIOUXDeviceFR13GUSIFileTokeni # GUSISIOUXDevice::open(GUSIFileToken&,int)
1215
Want__15GUSISIOUXDeviceFR13GUSIFileToken # GUSISIOUXDevice::Want(GUSIFileToken&)
@@ -20,8 +23,8 @@ write__15GUSISIOUXSocketFRC12GUSIGatherer # GUSISIOUXSocket::write(const GUSIGa
2023
read__15GUSISIOUXSocketFRC13GUSIScatterer # GUSISIOUXSocket::read(const GUSIScatterer&)
2124
__dt__15GUSISIOUXSocketFv # GUSISIOUXSocket::~GUSISIOUXSocket()
2225
Initialize__15GUSISIOUXSocketFv # GUSISIOUXSocket::Initialize()
23-
__ct__15GUSISIOUXSocketFv # GUSISIOUXSocket::GUSISIOUXSocket()
24-
Instance__15GUSISIOUXSocketFv # GUSISIOUXSocket::Instance()
26+
__ct__15GUSISIOUXSocketFi # GUSISIOUXSocket::GUSISIOUXSocket(int)
27+
Instance__15GUSISIOUXSocketFi # GUSISIOUXSocket::Instance(int)
2528
Py_FileSystemDefaultEncoding
2629
_PyBuiltin_Init
2730
_PyEval_SliceIndex

Mac/Python/pyGUSISIOUX.cp

Lines changed: 78 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
#include "macglue.h"
3131
extern Boolean SIOUXUseWaitNextEvent;
3232

33+
static PyReadHandler sInConsole = 0L;
34+
static PyWriteHandler sOutConsole = 0L;
35+
static PyWriteHandler sErrConsole = 0L;
36+
37+
inline bool hasCustomConsole(void) { return sInConsole != 0L; }
38+
3339
class GUSISIOUXSocket : public GUSISocket {
3440
public:
3541
~GUSISIOUXSocket();
@@ -42,14 +48,12 @@ virtual int fstat(struct stat * buf);
4248
virtual int isatty();
4349
bool select(bool * canRead, bool * canWrite, bool *);
4450

45-
static GUSISIOUXSocket * Instance();
46-
private:
47-
static GUSISIOUXSocket * sInstance;
48-
49-
GUSISIOUXSocket();
50-
bool initialized;
51-
void Initialize();
52-
bool fDelayConsole;
51+
static GUSISIOUXSocket * Instance(int fd);
52+
private:
53+
GUSISIOUXSocket(int fd);
54+
static bool initialized;
55+
static void Initialize();
56+
int fFd;
5357
};
5458
class GUSISIOUXDevice : public GUSIDevice {
5559
public:
@@ -63,28 +67,19 @@ private:
6367

6468
static GUSISIOUXDevice * sInstance;
6569
};
66-
GUSISIOUXSocket * GUSISIOUXSocket::sInstance;
6770

68-
GUSISIOUXSocket * GUSISIOUXSocket::Instance()
71+
GUSISIOUXSocket * GUSISIOUXSocket::Instance(int fd)
6972
{
70-
if (!sInstance)
71-
if (sInstance = new GUSISIOUXSocket)
72-
sInstance->AddReference();
73-
74-
return sInstance;
73+
return new GUSISIOUXSocket(fd);
7574
}
7675
// This declaration lies about the return type
7776
extern "C" void SIOUXHandleOneEvent(EventRecord *userevent);
7877

79-
GUSISIOUXSocket::GUSISIOUXSocket()
78+
bool GUSISIOUXSocket::initialized = false;
79+
80+
GUSISIOUXSocket::GUSISIOUXSocket(int fd) : fFd(fd)
8081
{
81-
if (PyMac_GetDelayConsoleFlag())
82-
fDelayConsole = true;
83-
else
84-
fDelayConsole = false;
85-
if ( fDelayConsole )
86-
initialized = 0;
87-
else
82+
if (!PyMac_GetDelayConsoleFlag() && !hasCustomConsole() && !initialized)
8883
Initialize();
8984
/* Tell the upper layers there's no unseen output */
9085
PyMac_OutputSeen();
@@ -93,24 +88,39 @@ GUSISIOUXSocket::GUSISIOUXSocket()
9388
void
9489
GUSISIOUXSocket::Initialize()
9590
{
96-
initialized = 1;
97-
InstallConsole(0);
98-
GUSISetHook(GUSI_EventHook+nullEvent, (GUSIHook)SIOUXHandleOneEvent);
99-
GUSISetHook(GUSI_EventHook+mouseDown, (GUSIHook)SIOUXHandleOneEvent);
100-
GUSISetHook(GUSI_EventHook+mouseUp, (GUSIHook)SIOUXHandleOneEvent);
101-
GUSISetHook(GUSI_EventHook+updateEvt, (GUSIHook)SIOUXHandleOneEvent);
102-
GUSISetHook(GUSI_EventHook+diskEvt, (GUSIHook)SIOUXHandleOneEvent);
103-
GUSISetHook(GUSI_EventHook+activateEvt, (GUSIHook)SIOUXHandleOneEvent);
104-
GUSISetHook(GUSI_EventHook+osEvt, (GUSIHook)SIOUXHandleOneEvent);
105-
PyMac_InitMenuBar();
91+
if(!initialized && !hasCustomConsole())
92+
{
93+
initialized = true;
94+
InstallConsole(0);
95+
GUSISetHook(GUSI_EventHook+nullEvent, (GUSIHook)SIOUXHandleOneEvent);
96+
GUSISetHook(GUSI_EventHook+mouseDown, (GUSIHook)SIOUXHandleOneEvent);
97+
GUSISetHook(GUSI_EventHook+mouseUp, (GUSIHook)SIOUXHandleOneEvent);
98+
GUSISetHook(GUSI_EventHook+updateEvt, (GUSIHook)SIOUXHandleOneEvent);
99+
GUSISetHook(GUSI_EventHook+diskEvt, (GUSIHook)SIOUXHandleOneEvent);
100+
GUSISetHook(GUSI_EventHook+activateEvt, (GUSIHook)SIOUXHandleOneEvent);
101+
GUSISetHook(GUSI_EventHook+osEvt, (GUSIHook)SIOUXHandleOneEvent);
102+
PyMac_InitMenuBar();
103+
}
106104
}
107105
GUSISIOUXSocket::~GUSISIOUXSocket()
108106
{
109-
if ( !initialized ) return;
107+
if ( !initialized || hasCustomConsole() )
108+
return;
109+
110+
initialized = false;
110111
RemoveConsole();
111112
}
112113
ssize_t GUSISIOUXSocket::read(const GUSIScatterer & buffer)
113114
{
115+
if(hasCustomConsole())
116+
{
117+
if(fFd == 0)
118+
return buffer.SetLength(
119+
sInConsole((char *) buffer.Buffer(), (int)buffer.Length()));
120+
121+
return 0;
122+
}
123+
114124
if ( !initialized ) Initialize();
115125
GUSIStdioFlush();
116126
PyMac_OutputSeen();
@@ -121,6 +131,16 @@ ssize_t GUSISIOUXSocket::read(const GUSIScatterer & buffer)
121131
}
122132
ssize_t GUSISIOUXSocket::write(const GUSIGatherer & buffer)
123133
{
134+
if(hasCustomConsole())
135+
{
136+
if(fFd == 1)
137+
return sOutConsole((char *) buffer.Buffer(), (int)buffer.Length());
138+
else if(fFd == 2)
139+
return sErrConsole((char *) buffer.Buffer(), (int)buffer.Length());
140+
141+
return 0;
142+
}
143+
124144
ssize_t rv;
125145

126146
if ( !initialized ) Initialize();
@@ -198,14 +218,33 @@ bool GUSISIOUXDevice::Want(GUSIFileToken & file)
198218
}
199219
GUSISocket * GUSISIOUXDevice::open(GUSIFileToken &, int)
200220
{
201-
return GUSISIOUXSocket::Instance();
221+
return GUSISIOUXSocket::Instance(1);
202222
}
203223
void GUSISetupConsoleDescriptors()
204224
{
205225
GUSIDescriptorTable * table = GUSIDescriptorTable::Instance();
206-
GUSISIOUXSocket * SIOUX = GUSISIOUXSocket::Instance();
207226

208-
table->InstallSocket(SIOUX);
209-
table->InstallSocket(SIOUX);
210-
table->InstallSocket(SIOUX);
227+
table->InstallSocket(GUSISIOUXSocket::Instance(0));
228+
table->InstallSocket(GUSISIOUXSocket::Instance(1));
229+
table->InstallSocket(GUSISIOUXSocket::Instance(2));
230+
}
231+
232+
void PyMac_SetConsoleHandler(PyReadHandler stdinH, PyWriteHandler stdoutH, PyWriteHandler stderrH)
233+
{
234+
if(stdinH && stdoutH && stderrH)
235+
{
236+
sInConsole = stdinH;
237+
sOutConsole = stdoutH;
238+
sErrConsole = stderrH;
239+
}
240+
}
241+
242+
long PyMac_DummyReadHandler(char *buffer, long n)
243+
{
244+
return 0;
245+
}
246+
247+
long PyMac_DummyWriteHandler(char *buffer, long n)
248+
{
249+
return 0;
211250
}

0 commit comments

Comments
 (0)