You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

105 lines
2.1 KiB

/*
* 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);
}