# Copyright 2000-2004 Michael Hudson mwh@python.net
#
# All Rights Reserved
#
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose is hereby granted without fee,
# provided that the above copyright notice appear in all copies and
# that both that copyright notice and this permission notice appear in
# supporting documentation.
#
# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO
# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
from Foundation import NSObject, NSFileHandle, NSNotificationCenter, \
NSFileHandleDataAvailableNotification
from AppKit import NSApp
import os
# creating a thread for each keypress is probably a little excessive!
# XXX arrow keys don't quite work
class CocoaInteracter(NSObject):
def init(self, con, inputfilehandle=None, outputfilehandle=None):
self = NSObject.init(self)
if inputfilehandle is None:
inputfilehandle = NSFileHandle.fileHandleWithStandardInput()
if outputfilehandle is None:
outputfilehandle = NSFileHandle.fileHandleWithStandardOutput()
self.ifh = inputfilehandle
self.ofh = outputfilehandle
self.con = con
con.prepare()
NSNotificationCenter.defaultCenter().addObserver_selector_name_object_(
self, "handleInput:", NSFileHandleDataAvailableNotification, self.ifh)
self.ifh.waitForDataInBackgroundAndNotify()
NSApp().delegate().con = self.con
return self
def handleInput_(self, aNotification):
try:
data = self.ifh.availableData()
for c in unicode(data.bytes(), self.con.reader.console.encoding):
self.con.reader.console.event_queue.push(c)
while not self.con.reader.console.event_queue.empty():
self.con.handle1(block=0)
except EOFError:
self.con.restore()
print "session ends"
else:
self.ifh.waitForDataInBackgroundAndNotify()
syntax highlighted by Code2HTML, v. 0.9.1