#define _XOPEN_SOURCE 700 /* for wcswidth and 700 is for mbsnrtowcs */
#include<wchar.h>
#include<ncurses.h> /* ncurses.h includes stdio.h */
#include<stdlib.h>
#include<string.h>
#include<readline/readline.h>
#include<locale.h>
int
mygetstr(
char
*str,
int
y,
int
x){
WINDOW *win;
int
size, col;
int
ok = 0;
int
width;
wchar_t
wstr[80];
char
*p;
getmaxyx(stdscr, size, col);
void
getaline(
char
*s){
str = s;
rl_callback_handler_remove();
ok = 1;
}
rl_callback_handler_install(
""
, getaline);
win = newwin(1, col-x, y, x);
while
(1){
rl_callback_read_char();
if
(ok)
break
;
werase(win);
strncpy
(str, rl_line_buffer, 80);
p = str;
/* how many column chars before cursor occupies? */
size = mbsnrtowcs(wstr, (
const
char
**)&p, rl_point, 80, NULL);
width = wcswidth(wstr, size);
mvwprintw(win, 0, 0,
"%s"
, str);
/* put the cursor at right column */
wmove(win, 0, width);
wrefresh(win);
}
delwin(win);
return
0;
}
int
main(){
char
mesg[] =
"Enter a string: "
;
char
str[80];
int
row, col;
setlocale
(LC_ALL,
""
);
/* make ncurses handle Chinese correctly */
initscr();
getmaxyx(stdscr, row, col);
mvprintw(row / 2, (col -
strlen
(mesg)) / 2,
"%s"
, mesg);
refresh();
mygetstr(str, row / 2, (col +
strlen
(mesg)) / 2);
mvprintw(LINES - 2, 0,
"You Entered: %s"
, str);
getch();
endwin();
return
0;
}
评论
发表评论