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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
"Reimplementation of the standard extension module '_curses_panel' using cffi."
from _curses import _ensure_initialised, _check_ERR, error, ffi, lib
def _call_lib(method_name, *args):
return getattr(lib, method_name)(*args)
def _call_lib_check_ERR(method_name, *args):
return _check_ERR(_call_lib(method_name, *args), method_name)
def _mk_no_arg_no_return(method_name):
def _execute():
_ensure_initialised()
return _call_lib_check_ERR(method_name)
_execute.__name__ = method_name
return _execute
def _mk_no_arg_return_val(method_name):
def _execute():
return _call_lib(method_name)
_execute.__name__ = method_name
return _execute
def _mk_args_no_return(method_name):
def _execute(*args):
return _call_lib_check_ERR(method_name, *args)
_execute.__name__ = method_name
return _execute
# ____________________________________________________________
bottom_panel = _mk_no_arg_no_return("bottom_panel")
hide_panel = _mk_no_arg_no_return("hide_panel")
show_panel = _mk_no_arg_no_return("show_panel")
top_panel = _mk_no_arg_no_return("top_panel")
panel_hidden = _mk_no_arg_return_val("panel_hidden")
move_panel = _mk_args_no_return("move_panel")
_panels = []
def _add_panel(panel):
_panels.insert(0, panel)
def _remove_panel(panel):
_panels.remove(panel)
def _find_panel(pan):
for panel in _panels:
if panel._pan == pan:
return panel
return None
class Panel(object):
def __init__(self, pan, window):
self._pan = pan
self._window = window
_add_panel(self)
def __del__(self):
_remove_panel(self)
lib.del_panel(self._pan)
def above(self):
pan = lib.panel_above(self._pan)
if pan == ffi.NULL:
return None
return _find_panel(pan)
def below(self):
pan = lib.panel_below(self._pan)
if pan == ffi.NULL:
return None
return _find_panel(pan)
def window(self):
return self._window
def replace_panel(self, window):
panel = _find_panel(self._pan)
_check_ERR(lib.replace_panel(self._pan, window._win), "replace_panel")
panel._window = window
return None
def set_panel_userptr(self, obj):
code = lib.set_panel_userptr(self._pan, ffi.cast("void *", obj))
return _check_ERR(code, "set_panel_userptr")
def userptr(self):
# XXX: This is probably wrong.
obj = lib.panel_userptr(self._pan)
if obj == ffi.NULL:
raise error("no userptr set")
return obj
def bottom_panel():
_ensure_initialised()
pan = lib.panel_above(ffi.NULL)
if pan == ffi.NULL:
return None
return _find_panel(pan)
def new_panel(window):
pan = lib.new_panel(window._win)
return Panel(pan, window)
def panel_below():
_ensure_initialised()
pan = lib.panel_below(ffi.NULL)
if pan == ffi.NULL:
return None
return _find_panel(pan)
def update_panels():
_ensure_initialised()
lib.update_panels()
return None
|