системный вызов.

граммирую на C, используя библиотеки ncurses (это первый раз), и у меня две проблемы. Я на Ubuntu с терминалом по умолчанию (терминал GNOME).

1) Мне нужно изменить размер терминала. Я использовал resizeter () и resize_term (), но они терпят неудачу.

2) Я использую функцию scrollok (), и проблема в том, что я теряю прокручиваемые строки (когда я возвращаюсь с помощью wscrl (), появляются пустые строки).

#include <ncurses.h>

int main() {

WINDOW *win, *win2;

int i;
char c;

initscr();
cbreak();
noecho();

win=newwin(8,20,1,1);
box(win,0,0);
win2=newwin(6,18,2,2);
scrollok(win2,1);
wrefresh(win);
wrefresh(win);

for(i=0;i<15;i++){
    c=wgetch(win2);
    if(c=='u'){
        wscrl(win2,-1);
        wrefresh(win2);
    }
    else{
        wprintw(win2,"%c\n",c);
        wrefresh(win2);
    }
}

delwin(win);
delwin(win2);
endwin();

return 0;
}
 R..19 янв. 2011 г., 19:18
Я думаю, что вы имеете в виду изменить размер терминала, а не изменить размер оболочки. Большинство терминалов не позволяют escape-последовательностям изменять их размер, потому что это будет крайне раздражать пользователя.
 ninjalj20 янв. 2011 г., 02:33
@R .. Бах, по крайней мере изменение размеров терминальных эмуляторов не будет таким же раздражающим, как изменение размерафизическое терминалы.

Ответы на вопрос(3)

потому что документ curses не является частью POSIX. Открытая группа поддерживает документацию для обоих:

X / Open CURSES, выпуск 4, версия 2 (Обзор)X / Open Curses, выпуск 4, версия 2 (документация)Базовые спецификации открытых групп, выпуск 7, стандарт IEEE 1003.1, выпуск 2013 г. (он же "POSIX")signal.h (Обратите внимание, чтоSIGWINCH отсутствует)

Как отмечено на странице руководства дляresizetermВы не должны вызывать эту функцию из обработчика сигнала, потому что она вызывает «небезопасные» функции. Тема «небезопасных» функций обсуждается в нескольких местах; что в GCCдокументация сделал бы для начала.

Что касается документации, @larsmans, похоже, цитируетscroll(3), но не цитируя сопоставимые ссылки для ncurses и "POSIX". Для чего это стоит:

Ncurses (кажется, затрагивает пункты, подразумеваемые, чтобы быть уникальными для NetBSD)X / Open (обязательно более общий, поскольку предназначен для охвата различных реализаций)

Вернуться к вопросу ОП:

пример программы не показывает использование OPresizeterm ни изresize_term, Это не указано, но предположительно OP изменил размер окна терминала и программа не ответила. Страница руководства дляresizeterm достаточно ясно, что ncurses не вызывает изменение размера терминала. Заэто (на некоторых терминалах) можно использовать-s вариантresize (утилита дляxterm). В случае успеха это изменяет размер терминала, который в свою очередь отправляетSIGWINCH, ncurses имеет предопределенный обработчик сигнала для этого, но наприменение уровень, обработкаKEY_RESIZE это рекомендуемый способ. Есть несколько программ вNcurses-примеры которые делают это.перемещение линийвверх в окно обязательно сдвигаетсявне окна. Это означает, что линии сдвинутыв окно взамещать те, которые оставили. «Окно» - это просто представление данных в ограниченном размере. Для представлений с различным размером разработчику рекомендуется использовать «прокладки» (см.страница справочника). В примечаниях на странице руководства по прокрутке упоминаются некоторые проблемы с цветом пробелов (строки замены). Это зависит от приложения, оставить ли замены пустыми или заполнить их данными приложения. Curses не делает этого автоматически (даже для колодок).

но вы можете изменить размер терминала, которыйизменить размер системный вызов.

#include <ncurses.h&,gt;
#include <stdlib.h>

int main(int argc, char *argv[]){
    WINDOW *ventana1;
    system("resize -s 30 80");
    initscr();
    start_color();
    ventana1 = newwin(15, 50, 0, 0);
    init_pair(1,COLOR_YELLOW,COLOR_BLUE);
    init_pair(2,COLOR_BLUE, COLOR_YELLOW);
    wbkgd(ventana1,COLOR_PAIR(1));
    wprintw(ventana1, "POLLO");
    wrefresh(ventana1);
    wgetch(ventana1);
    wgetch(ventana1);
    system("resize -s 20 60");
    wbkgd(ventana1,COLOR_PAIR(2));
    wprintw(ventana1, "POLLO");
    wrefresh(ventana1);
    wgetch(ventana1);
    wgetch(ventana1);
    system("resize -s 35 85");
    system("clear");
    wbkgd(ventana1,COLOR_PAIR(1));
    wprintw(ventana1, "POLLO");
    wrefresh(ventana1);
    wgetch(ventana1);
    wgetch(ventana1);
    delwin(ventana1);
    endwin();
    system("resize -s 25 75");
}

и функции изменяют размер части окна терминала, окрашенной проклятиями. Идея в том, что вы ловитеSIGWINCH сигнал и звонокresizeterm в обработчике, когда пользователь изменяет размер окнаизвне приложения (используя мышь, вероятно).

Это предполагаемое поведение, хотя оно плохо документировано в ncurses и в стандарте Unix / POSIX.Документы проклятия NetBSD сформулируйте это явно:

Еслиn положительно тогдаstdscr прокручивается вверх.n линии теряются с вершиныstdscr а такжеn пустые строки вставляются внизу. Еслиn отрицателен тогдаstdscr прокручивается вниз.n пустые строки вставляются в верхней частиstdscr а такжеn линии теряются снизу.

Поэтому вам придется вручную сохранять ввод и перепечатывать его при прокрутке.

 ubuntiano19 янв. 2011 г., 22:57
@R .. & larsmans: да, я имел в виду терминал (bash - это оболочка) ... Я исправил. @larsmans: 2) Я отредактировал начальный пост, добавив простой код.
 Thomas Dickey28 сент. 2015 г., 10:47
Есть несколько проблем с этим ответом (см. Мои комментарии).
 ubuntiano20 янв. 2011 г., 01:20
Благодарю. Я уже знал это, и я надеялся, что было другое решение ... так что я вручную сохраню ввод. Что касается первой проблемы, я изменю размер окна ncurses в соответствии с размером окна терминала или буду использовать escape-последовательности для изменения размера окна терминала.
 Fred Foo19 янв. 2011 г., 23:48
@ubuntiano: спасибо. Расширенный мой ответ.

Ваш ответ на вопрос