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
|
from ctypes import *
libvt100 = CDLL("libvt100.so")
class vt100_rgb_color(Union):
_fields_ = [
("r", c_ubyte),
("g", c_ubyte),
("b", c_ubyte),
]
class vt100_color(Structure):
_anonymous_ = ("rgb",)
_fields_ = [
("rgb", vt100_rgb_color),
("type", c_ubyte),
]
class vt100_named_attrs(Structure):
_fields_ = [
("bold", c_ubyte, 1),
("italic", c_ubyte, 1),
("underline", c_ubyte, 1),
("inverse", c_ubyte, 1),
]
class vt100_attrs(Union):
_anonymous_ = ("named",)
_fields_ = [
("named", vt100_named_attrs),
("attrs", c_ubyte),
]
class vt100_cell_attrs(Structure):
_anonymous_ = ("cell_attrs",)
_fields_ = [
("fgcolor", vt100_color),
("bgcolor", vt100_color),
("cell_attrs", vt100_attrs),
]
class vt100_cell(Structure):
_fields_ = [
("_contents", c_char * 8),
("len", c_size_t),
("attrs", vt100_cell_attrs),
("is_wide", c_ubyte, 1),
]
def contents(self):
return self._contents[:self.len].decode('utf-8')
new_prototype = CFUNCTYPE(c_void_p, c_int, c_int)
vt100_new = new_prototype(("vt100_screen_new", libvt100))
process_string_prototype = CFUNCTYPE(c_int, c_void_p, c_char_p, c_size_t)
vt100_process_string = process_string_prototype(("vt100_screen_process_string", libvt100))
cell_at_prototype = CFUNCTYPE(POINTER(vt100_cell), c_void_p, c_int, c_int)
vt100_cell_at = cell_at_prototype(("vt100_screen_cell_at", libvt100))
delete_prototype = CFUNCTYPE(None, c_void_p)
vt100_delete = delete_prototype(("vt100_screen_delete", libvt100))
class vt100(object):
def __init__(self, rows, cols):
self.vt = vt100_new(rows, cols)
def __del__(self):
vt100_delete(self.vt)
def process(self, string):
return vt100_process_string(self.vt, string, len(string))
def cell(self, x, y):
return vt100_cell_at(self.vt, x, y).contents
|