_curses_panel.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. "Reimplementation of the standard extension module '_curses_panel' using cffi."
  2. from _curses import _ensure_initialised, _check_ERR, error, ffi, lib
  3. def _call_lib(method_name, *args):
  4. return getattr(lib, method_name)(*args)
  5. def _call_lib_check_ERR(method_name, *args):
  6. return _check_ERR(_call_lib(method_name, *args), method_name)
  7. def _mk_no_arg_no_return(method_name):
  8. def _execute():
  9. _ensure_initialised()
  10. return _call_lib_check_ERR(method_name)
  11. _execute.__name__ = method_name
  12. return _execute
  13. def _mk_no_arg_return_val(method_name):
  14. def _execute():
  15. return _call_lib(method_name)
  16. _execute.__name__ = method_name
  17. return _execute
  18. def _mk_args_no_return(method_name):
  19. def _execute(*args):
  20. return _call_lib_check_ERR(method_name, *args)
  21. _execute.__name__ = method_name
  22. return _execute
  23. # ____________________________________________________________
  24. bottom_panel = _mk_no_arg_no_return("bottom_panel")
  25. hide_panel = _mk_no_arg_no_return("hide_panel")
  26. show_panel = _mk_no_arg_no_return("show_panel")
  27. top_panel = _mk_no_arg_no_return("top_panel")
  28. panel_hidden = _mk_no_arg_return_val("panel_hidden")
  29. move_panel = _mk_args_no_return("move_panel")
  30. _panels = []
  31. def _add_panel(panel):
  32. _panels.insert(0, panel)
  33. def _remove_panel(panel):
  34. _panels.remove(panel)
  35. def _find_panel(pan):
  36. for panel in _panels:
  37. if panel._pan == pan:
  38. return panel
  39. return None
  40. class Panel(object):
  41. def __init__(self, pan, window):
  42. self._pan = pan
  43. self._window = window
  44. _add_panel(self)
  45. def __del__(self):
  46. _remove_panel(self)
  47. lib.del_panel(self._pan)
  48. def above(self):
  49. pan = lib.panel_above(self._pan)
  50. if pan == ffi.NULL:
  51. return None
  52. return _find_panel(pan)
  53. def below(self):
  54. pan = lib.panel_below(self._pan)
  55. if pan == ffi.NULL:
  56. return None
  57. return _find_panel(pan)
  58. def window(self):
  59. return self._window
  60. def replace_panel(self, window):
  61. panel = _find_panel(self._pan)
  62. _check_ERR(lib.replace_panel(self._pan, window._win), "replace_panel")
  63. panel._window = window
  64. return None
  65. def set_panel_userptr(self, obj):
  66. code = lib.set_panel_userptr(self._pan, ffi.cast("void *", obj))
  67. return _check_ERR(code, "set_panel_userptr")
  68. def userptr(self):
  69. # XXX: This is probably wrong.
  70. obj = lib.panel_userptr(self._pan)
  71. if obj == ffi.NULL:
  72. raise error("no userptr set")
  73. return obj
  74. def bottom_panel():
  75. _ensure_initialised()
  76. pan = lib.panel_above(ffi.NULL)
  77. if pan == ffi.NULL:
  78. return None
  79. return _find_panel(pan)
  80. def new_panel(window):
  81. pan = lib.new_panel(window._win)
  82. return Panel(pan, window)
  83. def panel_below():
  84. _ensure_initialised()
  85. pan = lib.panel_below(ffi.NULL)
  86. if pan == ffi.NULL:
  87. return None
  88. return _find_panel(pan)
  89. def update_panels():
  90. _ensure_initialised()
  91. lib.update_panels()
  92. return None