vt100win.py 1.92 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2 3 4 5 6 7 8 9 10 11
# VT100 terminal emulator in a STDWIN window.

import stdwin
from stdwinevents import *
from vt100 import VT100

class VT100win(VT100):

	def __init__(self):
		VT100.__init__(self)
		self.window = None
12 13
		self.last_x = -1
		self.last_y = -1
Guido van Rossum's avatar
Guido van Rossum committed
14 15 16 17 18 19

	def __del__(self):
		self.close()

	def open(self, title):
		stdwin.setfont('7x14')
20 21 22 23
		self.charwidth = stdwin.textwidth('m')
		self.lineheight = stdwin.lineheight()
		self.docwidth = self.width * self.charwidth
		self.docheight = self.height * self.lineheight
Guido van Rossum's avatar
Guido van Rossum committed
24 25 26 27 28 29 30 31 32 33 34 35
		stdwin.setdefwinsize(self.docwidth + 2, self.docheight + 2)
		stdwin.setdefscrollbars(0, 0)
		self.window = stdwin.open(title)
		self.window.setdocsize(self.docwidth + 2, self.docheight + 2)

	def close(self):
		if self.window:
			self.window.close()
		self.window = None

	def show(self):
		if not self.window: return
36 37
		self.window.change(((-10, -10),
			  (self.docwidth+10, self.docheight+10)))
Guido van Rossum's avatar
Guido van Rossum committed
38 39 40 41 42 43 44

	def draw(self, detail):
		d = self.window.begindrawing()
		fg = stdwin.getfgcolor()
		red = stdwin.fetchcolor('red')
		d.cliprect(detail)
		d.erase(detail)
45 46
		lh = self.lineheight
		cw = self.charwidth
Guido van Rossum's avatar
Guido van Rossum committed
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
		for y in range(self.height):
			d.text((0, y*lh), self.lines[y].tostring())
			if self.attrs[y] <> self.blankattr:
				for x in range(len(self.attrs[y])):
					if self.attrs[y][x] == 7:
						p1 = x*cw, y*lh
						p2 = (x+1)*cw, (y+1)*lh
						d.invert((p1, p2))
		x = self.x * cw
		y = self.y * lh
		d.setfgcolor(red)
		d.invert((x, y), (x+cw, y+lh))
		d.setfgcolor(fg)
		d.close()

62 63 64 65 66 67 68 69 70 71 72 73
	def move_to(self, x, y):
		VT100.move_to(self, x, y)
		if not self.window: return
		if self.y != self.last_y:
			self.window.change((0, self.last_y * self.lineheight),
				  (self.width*self.charwidth,
				  (self.last_y+1) * self.lineheight))
		self.last_x = self.x
		self.last_y = y
		self.window.change((0, self.y * self.lineheight),
			  (self.width*self.charwidth,
			  (self.y+1) * self.lineheight))
Guido van Rossum's avatar
Guido van Rossum committed
74 75 76

	def send(self, str):
		VT100.send(self, str)
77 78
##		self.show()