2017-02-13 4 views
2

Я делаю программу с ncurses, которая разбивает экран на два окна. Верхний экран может принимать ввод, и, нажимая '#', он переместит весь текст вниз в нижнее окно и протрите верхнее окно. В моем коде я пытаюсь использовать copywin() для замены нижнего окна, но он не будет вставлять формулировку во второе окно. Это то, что у меня есть ...Замена окна

#include <ncurses.h> 

int main(int argc, char *argv[]) 
{ 
// Declare variables for windows and sizes 
WINDOW *top_win, *bottom_win; 
int maxx, maxy, halfy, flag = 0, ch; 

// Start curses 
initscr(); 
noecho(); 
refresh(); 

// get the max x's and y's 
getmaxyx(stdscr, maxy, maxx); 
halfy = maxy >> 1; 

// Start color 
start_color(); 
init_pair(1, COLOR_BLACK, COLOR_WHITE); 
init_pair(2, COLOR_WHITE, COLOR_CYAN); 
init_pair(3, COLOR_RED, COLOR_WHITE); 

// Make windows 
top_win = newwin(halfy, maxx, 0, 0); 
wbkgd(top_win, COLOR_PAIR(1)); 
wrefresh(top_win); 

bottom_win = newwin(halfy, maxx, halfy, 0); 
wbkgd(bottom_win, COLOR_PAIR(2)); 
wrefresh(bottom_win); 

// Allow functions keys 
keypad(top_win, TRUE); 
keypad(bottom_win, TRUE); 

// while loop to get input 
while((ch = getch()) != '`') 
    { 
     if(ch == '@') 
      { 
       if(flag == 1) 
        { 
         flag = 0; 
        } 
       else 
        { 
         flag = 1; 
        } 
      } 
     else if(ch == '#') 
      { 
       //waddstr(bottom_win, "testing"); 
       copywin(top_win, bottom_win, 0, 0, halfy, 0, halfy, maxx, TRUE); 
       //overwrite(top_win, bottom_win); 
       //werase(top_win); 
      } 
     else if(flag != 1) 
      { 
       waddch(top_win, ch | COLOR_PAIR(1)); 
      } 
     else if(flag == 1) 
      { 
       waddch(top_win, ch | COLOR_PAIR(3)); 
      } 
     wrefresh(top_win); 
     wrefresh(bottom_win); 
    } 

// end curses 
delwin(top_win); 
delwin(bottom_win); 
endwin(); 
return 0; 
} 

Я знаю, что может напечатать к окну, используя символ «#» из-за мое закомментированным, тестирование заявления. Я также просто попытался использовать overwrite(), но это тоже не сработало. Я просто перепутаю аргументы, или это что-то еще? Есть идеи? Заранее спасибо!

ответ

1

У меня нет хорошего объяснения, почему это работает, но до тех пор, как xoff и yoff находятся в коде ниже, по крайней мере 1, данные из верхнего окна копируется в нижнем окне OK (и очищается от в верхнем окне). Цвет не копируется. Если любое смещение равно 0, данные не копируются. Строка testing добавляется в верхнем левом углу нижнего окна - ее можно опустить, а скопированный материал все еще в порядке.

#include <ncurses.h> 

int main(void) 
{ 
    // Declare variables for windows and sizes 
    WINDOW *top_win, *bottom_win; 
    int maxx, maxy, halfy, flag = 0, ch; 

    // Start curses 
    initscr(); 
    noecho(); 
    refresh(); 

    // get the max x's and y's 
    getmaxyx(stdscr, maxy, maxx); 
    halfy = maxy >> 1; 

    // Start color 
    start_color(); 
    init_pair(1, COLOR_BLACK, COLOR_WHITE); 
    init_pair(2, COLOR_WHITE, COLOR_CYAN); 
    init_pair(3, COLOR_RED, COLOR_WHITE); 

    // Make windows 
    top_win = newwin(halfy, maxx, 0, 0); 
    wbkgd(top_win, COLOR_PAIR(1)); 
    wrefresh(top_win); 

    bottom_win = newwin(halfy, maxx, halfy, 0); 
    wbkgd(bottom_win, COLOR_PAIR(2)); 
    wrefresh(bottom_win); 

    // Allow functions keys 
    // keypad(top_win, TRUE); 
    // keypad(bottom_win, TRUE); 

    // while loop to get input 
    int xoff = 1; 
    int yoff = 1; 
    while ((ch = getch()) != '`') 
    { 
     if (ch == '@') 
     { 
      if (flag == 1) 
      { 
       flag = 0; 
      } 
      else 
      { 
       flag = 1; 
      } 
     } 
     else if (ch == '#') 
     { 
      waddstr(bottom_win, "testing"); 
      // copywin(top_win, bottom_win, 0, 0, halfy, 0, halfy, maxx, TRUE); 
      copywin(top_win, bottom_win, 0, 0, yoff, xoff, halfy-yoff, maxx-xoff, TRUE); 
      // overwrite(top_win, bottom_win); 
      werase(top_win); 
     } 
     else if (flag != 1) 
     { 
      waddch(top_win, ch | COLOR_PAIR(1)); 
     } 
     else if (flag == 1) 
     { 
      waddch(top_win, ch | COLOR_PAIR(3)); 
     } 
     wrefresh(top_win); 
     wrefresh(bottom_win); 
    } 

    // end curses 
    delwin(top_win); 
    delwin(bottom_win); 
    endwin(); 
    return 0; 
} 

Тестирование на Mac работает MacOS Sierra 10.12.3 с GCC 6.3.0, используя локальную -lncurses библиотеку.

+0

Это действительно странно .. Я думаю, потому что это проблема с копированием всего и границ. Он работает и благодарит вас за это! Мне придется больше копаться в аргументах copywin(). –

+0

Да, я подозреваю, что это связано с границами, но строка 'testing' появляется там, где вы ожидаете появления скопированного материала. Как я уже сказал, у меня нет хорошего объяснения того, что происходит. Я начал с смещений (10, 10) и получил материал. Это приводит к процессу минимизации (смещения 2, 1, 0 пробовали после 10). Если вы придумаете хорошее объяснение, сообщите мне (комментарий здесь, например). –

3

copywin проверяет данные строки/столбцы и decides that your destination rectangle doesn't lie completely within the destination window. Вот быстрое решение для вашей программы:

--- foo.c.orig 2017-02-13 16:13:12.000000000 -0500 
+++ foo.c  2017-02-13 16:30:18.037987489 -0500 
@@ -51,7 +51,7 @@ 
     else if(ch == '#') 
      { 
       //waddstr(bottom_win, "testing"); 
-    copywin(top_win, bottom_win, 0, 0, halfy, 0, halfy, maxx, TRUE); 
+    copywin(top_win, bottom_win, 0, 0, 0, 0, halfy - 1, maxx - 1, TRUE); 
       //overwrite(top_win, bottom_win); 
       //werase(top_win); 
      } 
@@ -73,4 +73,3 @@ 
endwin(); 
return 0; 
} 

Строки и столбцы нумеруются от нуля до последней строки/столбца (который один меньше, чем размер окна), поэтому я вычитаюсь один из dmaxrow и dmaxcol. Пятый параметр dminrow прошел мимо нижней части окна.

ncurses проверяет параметры. Что касается совместимости и переносимости, запуск одной и той же программы с помощью проклятий Solaris (изменение «ncurses.h» на «curses.h») сбрасывает ядро.

Страница руководства можно было бы улучшить, но это достаточно ясно в отношении colors:

только текст где два окна перекрытия копируется

Смежные вопросы