| import sys | |
| if sys.platform == 'win32': | |
| #This module does not exist in windows | |
| raise ImportError('No module named _curses') | |
| from cffi import FFI | |
| ffi = FFI() | |
| ffi.cdef(""" | |
| typedef ... WINDOW; | |
| typedef ... SCREEN; | |
| typedef unsigned long... mmask_t; | |
| typedef unsigned char bool; | |
| typedef unsigned long... chtype; | |
| typedef chtype attr_t; | |
| typedef struct | |
| { | |
| short id; /* ID to distinguish multiple devices */ | |
| int x, y, z; /* event coordinates (character-cell) */ | |
| mmask_t bstate; /* button state bits */ | |
| } | |
| MEVENT; | |
| static const int ERR, OK; | |
| static const int TRUE, FALSE; | |
| static const int KEY_MIN, KEY_MAX; | |
| static const int COLOR_BLACK; | |
| static const int COLOR_RED; | |
| static const int COLOR_GREEN; | |
| static const int COLOR_YELLOW; | |
| static const int COLOR_BLUE; | |
| static const int COLOR_MAGENTA; | |
| static const int COLOR_CYAN; | |
| static const int COLOR_WHITE; | |
| static const chtype A_ATTRIBUTES; | |
| static const chtype A_NORMAL; | |
| static const chtype A_STANDOUT; | |
| static const chtype A_UNDERLINE; | |
| static const chtype A_REVERSE; | |
| static const chtype A_BLINK; | |
| static const chtype A_DIM; | |
| static const chtype A_BOLD; | |
| static const chtype A_ALTCHARSET; | |
| static const chtype A_INVIS; | |
| static const chtype A_PROTECT; | |
| static const chtype A_CHARTEXT; | |
| static const chtype A_COLOR; | |
| static const int BUTTON1_RELEASED; | |
| static const int BUTTON1_PRESSED; | |
| static const int BUTTON1_CLICKED; | |
| static const int BUTTON1_DOUBLE_CLICKED; | |
| static const int BUTTON1_TRIPLE_CLICKED; | |
| static const int BUTTON2_RELEASED; | |
| static const int BUTTON2_PRESSED; | |
| static const int BUTTON2_CLICKED; | |
| static const int BUTTON2_DOUBLE_CLICKED; | |
| static const int BUTTON2_TRIPLE_CLICKED; | |
| static const int BUTTON3_RELEASED; | |
| static const int BUTTON3_PRESSED; | |
| static const int BUTTON3_CLICKED; | |
| static const int BUTTON3_DOUBLE_CLICKED; | |
| static const int BUTTON3_TRIPLE_CLICKED; | |
| static const int BUTTON4_RELEASED; | |
| static const int BUTTON4_PRESSED; | |
| static const int BUTTON4_CLICKED; | |
| static const int BUTTON4_DOUBLE_CLICKED; | |
| static const int BUTTON4_TRIPLE_CLICKED; | |
| static const int BUTTON_SHIFT; | |
| static const int BUTTON_CTRL; | |
| static const int BUTTON_ALT; | |
| static const int ALL_MOUSE_EVENTS; | |
| static const int REPORT_MOUSE_POSITION; | |
| int setupterm(char *, int, int *); | |
| WINDOW *stdscr; | |
| int COLORS; | |
| int COLOR_PAIRS; | |
| int COLS; | |
| int LINES; | |
| int baudrate(void); | |
| int beep(void); | |
| int box(WINDOW *, chtype, chtype); | |
| bool can_change_color(void); | |
| int cbreak(void); | |
| int clearok(WINDOW *, bool); | |
| int color_content(short, short*, short*, short*); | |
| int copywin(const WINDOW*, WINDOW*, int, int, int, int, int, int, int); | |
| int curs_set(int); | |
| int def_prog_mode(void); | |
| int def_shell_mode(void); | |
| int delay_output(int); | |
| int delwin(WINDOW *); | |
| WINDOW * derwin(WINDOW *, int, int, int, int); | |
| int doupdate(void); | |
| int echo(void); | |
| int endwin(void); | |
| char erasechar(void); | |
| void filter(void); | |
| int flash(void); | |
| int flushinp(void); | |
| chtype getbkgd(WINDOW *); | |
| WINDOW * getwin(FILE *); | |
| int halfdelay(int); | |
| bool has_colors(void); | |
| bool has_ic(void); | |
| bool has_il(void); | |
| void idcok(WINDOW *, bool); | |
| int idlok(WINDOW *, bool); | |
| void immedok(WINDOW *, bool); | |
| WINDOW * initscr(void); | |
| int init_color(short, short, short, short); | |
| int init_pair(short, short, short); | |
| int intrflush(WINDOW *, bool); | |
| bool isendwin(void); | |
| bool is_linetouched(WINDOW *, int); | |
| bool is_wintouched(WINDOW *); | |
| const char * keyname(int); | |
| int keypad(WINDOW *, bool); | |
| char killchar(void); | |
| int leaveok(WINDOW *, bool); | |
| char * longname(void); | |
| int meta(WINDOW *, bool); | |
| int mvderwin(WINDOW *, int, int); | |
| int mvwaddch(WINDOW *, int, int, const chtype); | |
| int mvwaddnstr(WINDOW *, int, int, const char *, int); | |
| int mvwaddstr(WINDOW *, int, int, const char *); | |
| int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *); | |
| int mvwdelch(WINDOW *, int, int); | |
| int mvwgetch(WINDOW *, int, int); | |
| int mvwgetnstr(WINDOW *, int, int, char *, int); | |
| int mvwin(WINDOW *, int, int); | |
| chtype mvwinch(WINDOW *, int, int); | |
| int mvwinnstr(WINDOW *, int, int, char *, int); | |
| int mvwinsch(WINDOW *, int, int, chtype); | |
| int mvwinsnstr(WINDOW *, int, int, const char *, int); | |
| int mvwinsstr(WINDOW *, int, int, const char *); | |
| int napms(int); | |
| WINDOW * newpad(int, int); | |
| WINDOW * newwin(int, int, int, int); | |
| int nl(void); | |
| int nocbreak(void); | |
| int nodelay(WINDOW *, bool); | |
| int noecho(void); | |
| int nonl(void); | |
| void noqiflush(void); | |
| int noraw(void); | |
| int notimeout(WINDOW *, bool); | |
| int overlay(const WINDOW*, WINDOW *); | |
| int overwrite(const WINDOW*, WINDOW *); | |
| int pair_content(short, short*, short*); | |
| int pechochar(WINDOW *, const chtype); | |
| int pnoutrefresh(WINDOW*, int, int, int, int, int, int); | |
| int prefresh(WINDOW *, int, int, int, int, int, int); | |
| int putwin(WINDOW *, FILE *); | |
| void qiflush(void); | |
| int raw(void); | |
| int redrawwin(WINDOW *); | |
| int resetty(void); | |
| int reset_prog_mode(void); | |
| int reset_shell_mode(void); | |
| int savetty(void); | |
| int scroll(WINDOW *); | |
| int scrollok(WINDOW *, bool); | |
| int start_color(void); | |
| WINDOW * subpad(WINDOW *, int, int, int, int); | |
| WINDOW * subwin(WINDOW *, int, int, int, int); | |
| int syncok(WINDOW *, bool); | |
| chtype termattrs(void); | |
| char * termname(void); | |
| int touchline(WINDOW *, int, int); | |
| int touchwin(WINDOW *); | |
| int typeahead(int); | |
| int ungetch(int); | |
| int untouchwin(WINDOW *); | |
| void use_env(bool); | |
| int waddch(WINDOW *, const chtype); | |
| int waddnstr(WINDOW *, const char *, int); | |
| int waddstr(WINDOW *, const char *); | |
| int wattron(WINDOW *, int); | |
| int wattroff(WINDOW *, int); | |
| int wattrset(WINDOW *, int); | |
| int wbkgd(WINDOW *, chtype); | |
| void wbkgdset(WINDOW *, chtype); | |
| int wborder(WINDOW *, chtype, chtype, chtype, chtype, | |
| chtype, chtype, chtype, chtype); | |
| int wchgat(WINDOW *, int, attr_t, short, const void *); | |
| int wclear(WINDOW *); | |
| int wclrtobot(WINDOW *); | |
| int wclrtoeol(WINDOW *); | |
| void wcursyncup(WINDOW *); | |
| int wdelch(WINDOW *); | |
| int wdeleteln(WINDOW *); | |
| int wechochar(WINDOW *, const chtype); | |
| int werase(WINDOW *); | |
| int wgetch(WINDOW *); | |
| int wgetnstr(WINDOW *, char *, int); | |
| int whline(WINDOW *, chtype, int); | |
| chtype winch(WINDOW *); | |
| int winnstr(WINDOW *, char *, int); | |
| int winsch(WINDOW *, chtype); | |
| int winsdelln(WINDOW *, int); | |
| int winsertln(WINDOW *); | |
| int winsnstr(WINDOW *, const char *, int); | |
| int winsstr(WINDOW *, const char *); | |
| int wmove(WINDOW *, int, int); | |
| int wresize(WINDOW *, int, int); | |
| int wnoutrefresh(WINDOW *); | |
| int wredrawln(WINDOW *, int, int); | |
| int wrefresh(WINDOW *); | |
| int wscrl(WINDOW *, int); | |
| int wsetscrreg(WINDOW *, int, int); | |
| int wstandout(WINDOW *); | |
| int wstandend(WINDOW *); | |
| void wsyncdown(WINDOW *); | |
| void wsyncup(WINDOW *); | |
| void wtimeout(WINDOW *, int); | |
| int wtouchln(WINDOW *, int, int, int); | |
| int wvline(WINDOW *, chtype, int); | |
| int tigetflag(char *); | |
| int tigetnum(char *); | |
| char * tigetstr(char *); | |
| int putp(const char *); | |
| char * tparm(const char *, ...); | |
| int getattrs(const WINDOW *); | |
| int getcurx(const WINDOW *); | |
| int getcury(const WINDOW *); | |
| int getbegx(const WINDOW *); | |
| int getbegy(const WINDOW *); | |
| int getmaxx(const WINDOW *); | |
| int getmaxy(const WINDOW *); | |
| int getparx(const WINDOW *); | |
| int getpary(const WINDOW *); | |
| int getmouse(MEVENT *); | |
| int ungetmouse(MEVENT *); | |
| mmask_t mousemask(mmask_t, mmask_t *); | |
| bool wenclose(const WINDOW *, int, int); | |
| int mouseinterval(int); | |
| void setsyx(int y, int x); | |
| const char *unctrl(chtype); | |
| int use_default_colors(void); | |
| int has_key(int); | |
| bool is_term_resized(int, int); | |
| #define _m_STRICT_SYSV_CURSES ... | |
| #define _m_NCURSES_MOUSE_VERSION ... | |
| #define _m_NetBSD ... | |
| int _m_ispad(WINDOW *); | |
| chtype acs_map[]; | |
| // For _curses_panel: | |
| typedef ... PANEL; | |
| WINDOW *panel_window(const PANEL *); | |
| void update_panels(void); | |
| int hide_panel(PANEL *); | |
| int show_panel(PANEL *); | |
| int del_panel(PANEL *); | |
| int top_panel(PANEL *); | |
| int bottom_panel(PANEL *); | |
| PANEL *new_panel(WINDOW *); | |
| PANEL *panel_above(const PANEL *); | |
| PANEL *panel_below(const PANEL *); | |
| int set_panel_userptr(PANEL *, void *); | |
| const void *panel_userptr(const PANEL *); | |
| int move_panel(PANEL *, int, int); | |
| int replace_panel(PANEL *,WINDOW *); | |
| int panel_hidden(const PANEL *); | |
| void _m_getsyx(int *yx); | |
| """) | |
| ffi.set_source("_curses_cffi", """ | |
| #ifdef __APPLE__ | |
| /* the following define is necessary for OS X 10.6+; without it, the | |
| Apple-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python | |
| can't get at the WINDOW flags field. */ | |
| #define NCURSES_OPAQUE 0 | |
| #endif | |
| #include <ncurses.h> | |
| #include <panel.h> | |
| #include <term.h> | |
| #if defined STRICT_SYSV_CURSES | |
| #define _m_STRICT_SYSV_CURSES TRUE | |
| #else | |
| #define _m_STRICT_SYSV_CURSES FALSE | |
| #endif | |
| #if defined NCURSES_MOUSE_VERSION | |
| #define _m_NCURSES_MOUSE_VERSION TRUE | |
| #else | |
| #define _m_NCURSES_MOUSE_VERSION FALSE | |
| #endif | |
| #if defined __NetBSD__ | |
| #define _m_NetBSD TRUE | |
| #else | |
| #define _m_NetBSD FALSE | |
| #endif | |
| int _m_ispad(WINDOW *win) { | |
| // <curses.h> may not have _flags (and possibly _ISPAD), | |
| // but for now let's assume that <ncurses.h> always has it | |
| return (win->_flags & _ISPAD); | |
| } | |
| void _m_getsyx(int *yx) { | |
| getsyx(yx[0], yx[1]); | |
| } | |
| """, libraries=['ncurses', 'panel']) | |
| if __name__ == '__main__': | |
| ffi.compile() |