| /* |
| * Ncurses bindings example. |
| * |
| * VALGRIND NOTE: when you use ncurses, there seems to be no way to get a |
| * clean valgrind run. Even if ncurses state is properly shut down, there |
| * will still be some residual leaks. |
| * |
| * Debian: install libncurses5-dev |
| */ |
| |
| #include <curses.h> |
| #include "duktape.h" |
| |
| static int ncurses_initscr(duk_context *ctx) { |
| WINDOW *win; |
| |
| win = initscr(); |
| duk_push_pointer(ctx, (void *) win); |
| return 1; |
| } |
| |
| static int ncurses_endwin(duk_context *ctx) { |
| int rc; |
| |
| rc = endwin(); |
| duk_push_int(ctx, rc); |
| return 1; |
| } |
| |
| static int ncurses_delscreen(duk_context *ctx) { |
| /* XXX: no screen management now */ |
| (void) ctx; |
| return 0; |
| } |
| |
| static int ncurses_getmaxyx(duk_context *ctx) { |
| int row, col; |
| |
| getmaxyx(stdscr, row, col); |
| |
| duk_push_array(ctx); |
| duk_push_int(ctx, row); |
| duk_put_prop_index(ctx, -2, 0); |
| duk_push_int(ctx, col); |
| duk_put_prop_index(ctx, -2, 1); |
| return 1; |
| } |
| |
| static int ncurses_printw(duk_context *ctx) { |
| int rc; |
| const char *str; |
| |
| str = duk_to_string(ctx, 0); |
| rc = printw("%s", str); |
| duk_push_int(ctx, rc); |
| return 1; |
| } |
| |
| static int ncurses_mvprintw(duk_context *ctx) { |
| int y = duk_to_int(ctx, 0); |
| int x = duk_to_int(ctx, 1); |
| const char *str = duk_to_string(ctx, 2); |
| int rc; |
| |
| rc = mvprintw(y, x, "%s", str); |
| duk_push_int(ctx, rc); |
| return 1; |
| } |
| |
| static int ncurses_refresh(duk_context *ctx) { |
| int rc; |
| |
| rc = refresh(); |
| duk_push_int(ctx, rc); |
| return 1; |
| } |
| |
| static int ncurses_getch(duk_context *ctx) { |
| int rc; |
| |
| rc = getch(); |
| duk_push_int(ctx, rc); |
| return 1; |
| } |
| |
| static duk_function_list_entry ncurses_funcs[] = { |
| { "initscr", ncurses_initscr, 0 }, |
| { "endwin", ncurses_endwin, 0 }, |
| { "delscreen", ncurses_delscreen, 0 }, |
| { "getmaxyx", ncurses_getmaxyx, 0 }, |
| { "printw", ncurses_printw, 1 }, |
| { "mvprintw", ncurses_mvprintw, 3 }, |
| { "refresh", ncurses_refresh, 0 }, |
| { "getch", ncurses_getch, 0 }, |
| { NULL, NULL, 0 } |
| }; |
| |
| void ncurses_register(duk_context *ctx) { |
| /* Set global 'Ncurses'. */ |
| duk_push_global_object(ctx); |
| duk_push_object(ctx); |
| duk_put_function_list(ctx, -1, ncurses_funcs); |
| duk_put_prop_string(ctx, -2, "Ncurses"); |
| duk_pop(ctx); |
| } |