2015-04-18 173 views
0

我试图在窗口底部输入文字,并打印在上面。我做到了。但是,当我调整窗口大小时,光标将附加到窗口的底部,当我键入文本时,符号不会在屏幕上回显。如何解决它?的Ncurses和调整窗口

对不起,我的英文。

我的代码:

#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(); 
} 

回答

0

有几个问题:

  • 的ncurses已经处理了SIGWINCH,如resizeterm手册页指出。
  • 如果您没有为SIGWINCH添加自己的处理程序,则可以(如果您第一次调用keypad(stdscr,TRUE))检查KEY_RESIZE
  • 信号处理程序中使用的函数不安全;该计划可能会因多种原因而失败。

KEY_RESIZEncurses - resizing glitch讨论的,对于实例。