summaryrefslogtreecommitdiffstats
path: root/Demo/cwilib/vt100win.py
blob: 122e5f9dfaee582f3237fe38ed186dfdd2228235 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 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
		self.last_x = -1
		self.last_y = -1

	def __del__(self):
		self.close()

	def open(self, title):
		stdwin.setfont('7x14')
		self.charwidth = stdwin.textwidth('m')
		self.lineheight = stdwin.lineheight()
		self.docwidth = self.width * self.charwidth
		self.docheight = self.height * self.lineheight
		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
		self.window.change(((-10, -10),
			  (self.docwidth+10, self.docheight+10)))

	def draw(self, detail):
		d = self.window.begindrawing()
		fg = stdwin.getfgcolor()
		red = stdwin.fetchcolor('red')
		d.cliprect(detail)
		d.erase(detail)
		lh = self.lineheight
		cw = self.charwidth
		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()

	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))

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