оконные функции ncurses работают не так, как ожидалось

#c #terminal #scheme #ncurses

Вопрос:

Я работаю над личным экспериментом, используя схему s7 и ncurses. У меня нет большого опыта работы с ncurses, и я не могу с помощью имеющихся у меня учебных пособий понять, что происходит не так. При использовании newwin через интерфейс FFI такие функции, как wprintw или wborder не работают в созданном мной окне, но на всем доступном экране терминала.

Для начала пример C работает так, как ожидалось. Появится небольшое окно с текстом в левом верхнем углу.

 initscr();
cbreak();
WINDOW * w = newwin(5, 15, 2, 2);
box(w, 0, 0);
wprintw(w, "ok");
wrefresh(w);
 

рабочий пример

Я определяю функции для вызова из s7. Это сопоставление этих функций 1 к 1, поэтому код должен быть идентичным. Программа функционирует, но окно работает не так, как ожидалось. Размер окна неправильный, или он не нацелен на указатель окна, который я ему даю.

 (nc_initscr)
(nc_cbreak)
(define w (nc_newwin 5 15 2 2))
(nc_box w 0 0)
(nc_wprintw w "ok")
(nc_wrefresh w)
 
 // Example C hook
s7_pointer _newwin(s7_scheme * sc, s7_pointer * args) {
  int height = first(args);
  int width = second(args);
  int y = third(args);
  int x = fourth(args);
  WINDOW * win = newwin(height, width, y, x);
  return s7_make_c_pointer(sc, win);
}

s7_define_function(sc, "nc_newwin", _newwin, 4, "");
 

введите описание изображения здесь

Есть ли что-то в вызове этих функций, что я упускаю из виду?

Ответ №1:

Похоже (define w (nc_newwin 5 15 2 2)) , что он не передает указатель на окно, как ожидалось, или другие крючки игнорируют это. В любом случае, они используют stdscr , а не возвращаемое значение newwin .

Комментарии:

1. Я проверил адреса указателей окна, которое я передаю, и stdscr . w не равно нулю, и у них разные адреса. Я также попытался объявить окно, созданное в результате этого вызова, глобальной переменной, а затем использовать эту переменную для будущих вызовов wprintw . Тот же результат.

2. box однако использует stdscr .

3. Я не знаю, почему. w не равно stdscr , и функции крючка получают правильный адрес. Поведение при использовании wborder такое же .

4. Я больше не могу редактировать свой комментарий, но, чтобы быть уверенным, я прогнал его через GDB и проверил: (gdb) print stdscr ->$1 = (WINDOW *) 0x555555843290 , (gdb) print win -> $2 = (WINDOW *) 0x55555586cdf0

5. Обратитесь к источнику .

Ответ №2:

Это была ошибка с моей стороны. Я неправильно читал целочисленные аргументы схемы. Недопустимые значения по умолчанию имели тот же размер, stdscr что и .