2015-04-18 130 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討論的,對於實例。