autoconfig
cgi
cross_compile
flex
gdb_pretty_print
linking
.gitignore
1st_day_of_month.cpp
JJbY.cpp
Makefile
Tp6G.cpp
alternatice_bracket.c
ascii_injection.py
ascii_nn_input_helper.py
bind_test.sh
blumba.html
bootrap.html
brython_hw.html
c.php
c_old_argument_notation.c
cnn.c
comp.c
conditional_const.c
const.c
cpp_regex_error.cpp
current_year.cpp
dda2.cpp
dog.jpg
dog2.jpg
dpt.py
dropdown.html
else_while.c
example.m4
extension_cut.Makefile
fddl.js
fizzbuzz.f90
for_ctags.cpp
format.py
free_null.c
gcc_include_next.c
gdb_graph.c
getopt_test.c
gnu_decimals.c
gnu_history.c
gnu_regex.c
gnu_regex2.c
graph.py
group.py
guards.hs
header.h
index_in_initializer_list_compiler_extension.c
initials_test.html
int_memory.ctype.py
int_memory.py.py
knr.c
levenshtein_dist_-_usage.cpp
map_initialization.cpp
menu.vim
ncurses_labels.c
ncurses_mv_win.cpp
ncurses_plus_readline.cpp
ncurses_resize2.cpp
ncurses_resize_hello_world.cpp
ncurses_resize_test.c
ncurses_scroll.c
nf.c
null_printf.c
null_printf.cpp
otest.py
portable_namespace.c
portable_namespace.h
pta.c
python.html
scoping_showcase.c
screen_size_(without_curses).c
sdl_render_to_texture.cpp
sentinel_pack.c
setjmp_test.cpp
spring.html
strdup.c
table_abusing.html
tcc_int.c
test.c
test.html
test.info
test.texi
test.vim
tkinter_filepicker_test.py
torus.py
typedef.c
unctrl.c
undefined_reference.c
71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
// @COMPILECMD g++ $@ $(pkg-config --libs ncurses readline)
|
|
#include <ncurses.h>
|
|
#include <readline/readline.h>
|
|
|
|
#define WINDOW_WIDTH 32
|
|
#define WINDOW_HEIGHT 3
|
|
|
|
int scr_h, scr_w;
|
|
WINDOW* myWindow;
|
|
|
|
int input_available = false; // C style bool to track when to stop reading
|
|
char input; // our input; since we read char-by-char this is all the buffering we need
|
|
|
|
inline void init(){
|
|
// Ncurses (nothing special)
|
|
initscr();
|
|
noecho();
|
|
curs_set(0);
|
|
|
|
getmaxyx(stdscr, scr_h, scr_w);
|
|
myWindow = newwin(WINDOW_HEIGHT, WINDOW_WIDTH,
|
|
( scr_h / 2 ) - 1, ( scr_w - WINDOW_WIDTH) / 2);
|
|
refresh();
|
|
|
|
box(myWindow, 0, 0);
|
|
// Readline
|
|
// make readline shut up
|
|
rl_bind_key('\t', rl_insert); // make tab insert itself
|
|
rl_catch_signals = 0; // do not install signal handlers
|
|
rl_catch_sigwinch = 0; // do not care about window change signals
|
|
rl_prep_term_function = NULL; // do not initialize the ternimal
|
|
rl_deprep_term_function = NULL; // do not clean up
|
|
rl_change_environment = 0; // ?!
|
|
// bind callbacks, for seemless integration
|
|
rl_getc_function = +[](FILE* ignore){ // define how Readline is handed chars
|
|
input_available = false; // since we read 1 char at the time we know that there will be no more available
|
|
return (int)input;
|
|
};
|
|
rl_input_available_hook = +[]{ // let Readline know that it shall call it rl_getc_function
|
|
return input_available;
|
|
};
|
|
rl_redisplay_function = +[]{ // instruct Readline what to do after rl_line_buffer has changed
|
|
// echo rl_line_buffer (without using the terminals built in echo)
|
|
wmove(myWindow, 1, 1);
|
|
wclrtoeol(myWindow);
|
|
box(myWindow, 0, 0); // wclrtoeol(), screws with the box
|
|
waddstr(myWindow, rl_line_buffer);
|
|
wrefresh(myWindow);
|
|
return;
|
|
};
|
|
rl_callback_handler_install("", +[](char *line){ // instruct Readline what to do once rl_line_buffer is submitted (enter hit)
|
|
// print the submitted line to the top of the screen
|
|
wmove(stdscr, 0, 0);
|
|
wclrtoeol(stdscr);
|
|
waddstr(stdscr, line);
|
|
wrefresh(stdscr);
|
|
return;
|
|
});
|
|
}
|
|
|
|
signed main(){
|
|
init();
|
|
wrefresh(myWindow);
|
|
|
|
while(1){
|
|
input = wgetch(myWindow);
|
|
input_available = true;
|
|
rl_callback_read_char();
|
|
}
|
|
}
|