Ncurses 和调整大小 window
Ncurses and Resizing window
我尝试在 window 的底部输入文本并在顶部打印。我这样做了。但是当我调整 window 的大小时,光标附加到 window 的底部,当我键入文本时,符号不会在屏幕上回显。如何解决?
对不起我的英语。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <signal.h>
WINDOW* txt_win;
WINDOW* msg_win;
void sig_winch(int in) {
struct winsize size;
ioctl(fileno(stdout), TIOCGWINSZ, (char*) &size);
resizeterm(size.ws_row, size.ws_col);
// wprintw(msg_win,"%i, %i", LINES, COLS);
// wmove(msg_win, 0, 0);
// wresize(msg_win, LINES - 4, COLS);
wrefresh(msg_win);
// mvcur(LINES - 3, 0, LINES - 3, 0);
// setsyx(LINES - 3, 0);
// wmove(txt_win, LINES - 3, 0);
// wresize(txt_win, 3, COLS);
wrefresh(txt_win);
echo();
}
int main() {
int x = LINES - 1;
int y = 0;
if (!initscr())
{
fprintf(stderr, "Error initialising ncurses.\n");
exit(1);
}
signal(SIGWINCH, sig_winch);
initscr();
curs_set(1);
refresh();
char str[256];
// dy dx y x
msg_win = newwin(LINES - 4, COLS, 0, 0);
txt_win = newwin(3, COLS, LINES - 3, 0);
keypad(txt_win, 1);
int line = 0;
while (1) {
wrefresh(txt_win);
curs_set(1);
if (wgetnstr(txt_win, str, 256) == 0) {
wclear(txt_win);
curs_set(0);
waddstr(msg_win, str);
wrefresh(msg_win);
}
}
getch();
delwin(txt_win);
delwin(msg_win);
endwin();
}
有几个问题:
- ncurses 已经处理
SIGWINCH
,如 resizeterm
手册页所述。
- 如果您没有为
SIGWINCH
添加自己的处理程序,您可以(如果您首先调用 keypad(stdscr,TRUE)
)检查 KEY_RESIZE
.
- 信号处理程序中使用的函数使用不安全;该程序可能由于多种原因而失败。
例如,KEY_RESIZE
在 ncurses - resizing glitch 中讨论。
我尝试在 window 的底部输入文本并在顶部打印。我这样做了。但是当我调整 window 的大小时,光标附加到 window 的底部,当我键入文本时,符号不会在屏幕上回显。如何解决?
对不起我的英语。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <signal.h>
WINDOW* txt_win;
WINDOW* msg_win;
void sig_winch(int in) {
struct winsize size;
ioctl(fileno(stdout), TIOCGWINSZ, (char*) &size);
resizeterm(size.ws_row, size.ws_col);
// wprintw(msg_win,"%i, %i", LINES, COLS);
// wmove(msg_win, 0, 0);
// wresize(msg_win, LINES - 4, COLS);
wrefresh(msg_win);
// mvcur(LINES - 3, 0, LINES - 3, 0);
// setsyx(LINES - 3, 0);
// wmove(txt_win, LINES - 3, 0);
// wresize(txt_win, 3, COLS);
wrefresh(txt_win);
echo();
}
int main() {
int x = LINES - 1;
int y = 0;
if (!initscr())
{
fprintf(stderr, "Error initialising ncurses.\n");
exit(1);
}
signal(SIGWINCH, sig_winch);
initscr();
curs_set(1);
refresh();
char str[256];
// dy dx y x
msg_win = newwin(LINES - 4, COLS, 0, 0);
txt_win = newwin(3, COLS, LINES - 3, 0);
keypad(txt_win, 1);
int line = 0;
while (1) {
wrefresh(txt_win);
curs_set(1);
if (wgetnstr(txt_win, str, 256) == 0) {
wclear(txt_win);
curs_set(0);
waddstr(msg_win, str);
wrefresh(msg_win);
}
}
getch();
delwin(txt_win);
delwin(msg_win);
endwin();
}
有几个问题:
- ncurses 已经处理
SIGWINCH
,如resizeterm
手册页所述。 - 如果您没有为
SIGWINCH
添加自己的处理程序,您可以(如果您首先调用keypad(stdscr,TRUE)
)检查KEY_RESIZE
. - 信号处理程序中使用的函数使用不安全;该程序可能由于多种原因而失败。
KEY_RESIZE
在 ncurses - resizing glitch 中讨论。