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
|