[Python-checkins] CVS: python/dist/src/Mac/Python pyGUSISIOUX.cp,1.2,1.3

Jack Jansen jackjansen@users.sourceforge.net
Mon, 08 Oct 2001 08:35:40 -0700


Update of /cvsroot/python/python/dist/src/Mac/Python
In directory usw-pr-cvs1:/tmp/cvs-serv15421/python/Mac/Python

Modified Files:
	pyGUSISIOUX.cp 
Log Message:
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.

Index: pyGUSISIOUX.cp
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Python/pyGUSISIOUX.cp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** pyGUSISIOUX.cp	2001/04/25 22:07:27	1.2
--- pyGUSISIOUX.cp	2001/10/08 15:35:38	1.3
***************
*** 31,34 ****
--- 31,40 ----
  extern Boolean SIOUXUseWaitNextEvent;
  
+ static PyReadHandler sInConsole = 0L;
+ static PyWriteHandler sOutConsole = 0L;
+ static PyWriteHandler sErrConsole = 0L;
+ 
+ inline bool hasCustomConsole(void) { return sInConsole != 0L; }
+ 
  class GUSISIOUXSocket : public GUSISocket {
  public:
***************
*** 43,54 ****
  bool select(bool * canRead, bool * canWrite, bool *);
  
! 	static GUSISIOUXSocket *	Instance();
! private:
! 	static GUSISIOUXSocket *	sInstance;
! 	
! 	GUSISIOUXSocket();
! 	bool initialized;
! 	void Initialize();
! 	bool fDelayConsole;
  };
  class GUSISIOUXDevice : public GUSIDevice {
--- 49,58 ----
  bool select(bool * canRead, bool * canWrite, bool *);
  
! 	static GUSISIOUXSocket *	Instance(int fd);
! private:	
! 	GUSISIOUXSocket(int fd);
! 	static bool initialized;
! 	static void Initialize();
! 	int fFd;
  };
  class GUSISIOUXDevice : public GUSIDevice {
***************
*** 64,89 ****
  	static GUSISIOUXDevice *	sInstance;
  };
- GUSISIOUXSocket * GUSISIOUXSocket::sInstance;
  
! GUSISIOUXSocket * GUSISIOUXSocket::Instance()
  {
! 	if (!sInstance)
! 		if (sInstance = new GUSISIOUXSocket)
! 			sInstance->AddReference();
! 
! 	return sInstance;
  }
  // This declaration lies about the return type
  extern "C" void SIOUXHandleOneEvent(EventRecord *userevent);
  
! GUSISIOUXSocket::GUSISIOUXSocket() 
  {
! 	if (PyMac_GetDelayConsoleFlag())
! 		fDelayConsole = true;
! 	else
! 		fDelayConsole = false;
! 	if ( fDelayConsole )
! 		initialized = 0;
! 	else
  		Initialize();
  	/* Tell the upper layers there's no unseen output */
--- 68,84 ----
  	static GUSISIOUXDevice *	sInstance;
  };
  
! GUSISIOUXSocket * GUSISIOUXSocket::Instance(int fd)
  {
! 	return new GUSISIOUXSocket(fd);
  }
  // This declaration lies about the return type
  extern "C" void SIOUXHandleOneEvent(EventRecord *userevent);
  
! bool GUSISIOUXSocket::initialized = false;
! 
! GUSISIOUXSocket::GUSISIOUXSocket(int fd) : fFd(fd) 
  {
! 	if (!PyMac_GetDelayConsoleFlag() && !hasCustomConsole() && !initialized)
  		Initialize();
  	/* Tell the upper layers there's no unseen output */
***************
*** 94,115 ****
  GUSISIOUXSocket::Initialize()
  {
! 	initialized = 1;
! 	InstallConsole(0);
! 	GUSISetHook(GUSI_EventHook+nullEvent, 	(GUSIHook)SIOUXHandleOneEvent);
! 	GUSISetHook(GUSI_EventHook+mouseDown, 	(GUSIHook)SIOUXHandleOneEvent);
! 	GUSISetHook(GUSI_EventHook+mouseUp, 	(GUSIHook)SIOUXHandleOneEvent);
! 	GUSISetHook(GUSI_EventHook+updateEvt, 	(GUSIHook)SIOUXHandleOneEvent);
! 	GUSISetHook(GUSI_EventHook+diskEvt, 	(GUSIHook)SIOUXHandleOneEvent);
! 	GUSISetHook(GUSI_EventHook+activateEvt, (GUSIHook)SIOUXHandleOneEvent);
! 	GUSISetHook(GUSI_EventHook+osEvt, 		(GUSIHook)SIOUXHandleOneEvent);
! 	PyMac_InitMenuBar();
  }
  GUSISIOUXSocket::~GUSISIOUXSocket()
  {
! 	if ( !initialized ) return;
  	RemoveConsole();
  }
  ssize_t GUSISIOUXSocket::read(const GUSIScatterer & buffer)
  {
  	if ( !initialized ) Initialize();
  	GUSIStdioFlush();
--- 89,125 ----
  GUSISIOUXSocket::Initialize()
  {
! 	if(!initialized && !hasCustomConsole())
! 	{
! 		initialized = true;
! 		InstallConsole(0);
! 		GUSISetHook(GUSI_EventHook+nullEvent, 	(GUSIHook)SIOUXHandleOneEvent);
! 		GUSISetHook(GUSI_EventHook+mouseDown, 	(GUSIHook)SIOUXHandleOneEvent);
! 		GUSISetHook(GUSI_EventHook+mouseUp, 	(GUSIHook)SIOUXHandleOneEvent);
! 		GUSISetHook(GUSI_EventHook+updateEvt, 	(GUSIHook)SIOUXHandleOneEvent);
! 		GUSISetHook(GUSI_EventHook+diskEvt, 	(GUSIHook)SIOUXHandleOneEvent);
! 		GUSISetHook(GUSI_EventHook+activateEvt, (GUSIHook)SIOUXHandleOneEvent);
! 		GUSISetHook(GUSI_EventHook+osEvt, 		(GUSIHook)SIOUXHandleOneEvent);
! 		PyMac_InitMenuBar();
! 	}
  }
  GUSISIOUXSocket::~GUSISIOUXSocket()
  {
! 	if ( !initialized || hasCustomConsole() )
! 		return;
! 	
! 	initialized = false;
  	RemoveConsole();
  }
  ssize_t GUSISIOUXSocket::read(const GUSIScatterer & buffer)
  {
+ 	if(hasCustomConsole())
+ 	{
+ 		if(fFd == 0)
+ 			return buffer.SetLength(
+ 				sInConsole((char *) buffer.Buffer(), (int)buffer.Length()));
+ 		
+ 		return 0;
+ 	}
+ 	
  	if ( !initialized ) Initialize();
  	GUSIStdioFlush();
***************
*** 122,125 ****
--- 132,145 ----
  ssize_t GUSISIOUXSocket::write(const GUSIGatherer & buffer)
  {
+ 	if(hasCustomConsole())
+ 	{
+ 		if(fFd == 1)
+ 			return sOutConsole((char *) buffer.Buffer(), (int)buffer.Length());
+ 		else if(fFd == 2)
+ 			return sErrConsole((char *) buffer.Buffer(), (int)buffer.Length());
+ 		
+ 		return 0;
+ 	}
+ 	
  	ssize_t rv;
  			
***************
*** 199,211 ****
  GUSISocket * GUSISIOUXDevice::open(GUSIFileToken &, int)
  {
! 	return GUSISIOUXSocket::Instance();
  }
  void GUSISetupConsoleDescriptors()
  {
  	GUSIDescriptorTable * table = GUSIDescriptorTable::Instance();
- 	GUSISIOUXSocket *     SIOUX = GUSISIOUXSocket::Instance();
  	
! 	table->InstallSocket(SIOUX);
! 	table->InstallSocket(SIOUX);
! 	table->InstallSocket(SIOUX);
  }
--- 219,250 ----
  GUSISocket * GUSISIOUXDevice::open(GUSIFileToken &, int)
  {
! 	return GUSISIOUXSocket::Instance(1);
  }
  void GUSISetupConsoleDescriptors()
  {
  	GUSIDescriptorTable * table = GUSIDescriptorTable::Instance();
  	
! 	table->InstallSocket(GUSISIOUXSocket::Instance(0));
! 	table->InstallSocket(GUSISIOUXSocket::Instance(1));
! 	table->InstallSocket(GUSISIOUXSocket::Instance(2));
! }
! 
! void PyMac_SetConsoleHandler(PyReadHandler stdinH, PyWriteHandler stdoutH, PyWriteHandler stderrH)
! {
! 	if(stdinH && stdoutH && stderrH)
! 	{
! 		sInConsole = stdinH;
! 		sOutConsole = stdoutH;
! 		sErrConsole = stderrH;
! 	}
! }
! 
! long PyMac_DummyReadHandler(char *buffer, long n)
! {
! 	return 0;
! }
! 
! long PyMac_DummyWriteHandler(char *buffer, long n)
! {
! 	return 0;
  }