Нужна помощь с курсором ncurses и темы - PullRequest
0 голосов
/ 04 августа 2010

Я использую ncurses для написания текстового клиента на языке C. Основной цикл программы просто блокируется до тех пор, пока не будет обнаружено нажатие клавиши, а затем обрабатывает его и продолжает ждать следующего нажатия клавиши.

У меня естьодин поток, который я запускаю (опубликовано ниже), который блокирует (используя select) ожидание ввода с сервера, а когда он получает, добавляет его в буфер журнала чата и выводит буфер на экран.Он отлично работает.

Я знаю, что ncurses не является потокобезопасным, но я понимаю, что потоки таковы, что пока я на 100% уверен, что только один поток делает вызовы ncurses одновременно, он будет работать нормально.

Моя проблема связана с позицией курсора.

Она изменяется строкой move(height+1, curx); , и независимо от того, какие значения я ей передаю, ncurses, похоже, полностью игнорирует вызов и помещает мой курсорв другой позиции.Кажется, я не могу повлиять на это.

Для дальнейшего объяснения проблемы в моем основном потоке (цикл нажатия клавиш) я использую ту же блокировку мьютекса.Когда курсор обновляется в этих разделах кода, он работает как запланировано.Когда он обновляется из потока получения ниже, вызов курсора игнорируется.

Есть идеи?

receive thread</p> <pre><code> char buf[512]; fd_set read_fds; FD_ZERO(&read_fds); int nbytes; for (;;) { read_fds = master; select(sockfd+1, &read_fds, NULL, NULL, NULL); pthread_mutex_lock(&mutexdisplay); memset(&buf, 0, sizeof buf); nbytes = recv(sockfd, buf, 512, 0); buf[nbytes] = 0; add_chatmsg(chatlog, &numchatlog, buf); // erase window werase(chat_window); // redraw border wborder(chat_window, '|', '|', '-', '-', '+', '+', '+', '+'); // scroll completely into the future chatlogstart = numchatlog-1; // print the chat log print_chatlog(chatlog, &numchatlog, &chatlogstart, &height); move(height+1, curx); // refresh window wrefresh(chat_box); wrefresh(chat_window); pthread_mutex_unlock(&mutexdisplay); }

1 Ответ

0 голосов
/ 20 октября 2015

Возможно, уже слишком поздно для ответа на этот вопрос.

Вы не указали, в каком окне вы хотите управлять курсором.Я предполагаю, что вы хотели, чтобы курсор находился в позиции (высота + 1, curx) окна chat_box или chat_window.

Можно управлять курсором с помощью функции перемещения в вдове stdout, которая является исходным терминалом, но не включенаокна (chat_box и chat_window), которые вы создали.Функция для управления курсором в пользовательских окнах: wmove.

int move (int y, int x);

int wmove (WINDOW * win, int y, int x);

Надеюсь, это поможет другим, сталкивающимся с подобной проблемой.Пожалуйста, укажите, если это не правильное решение.

...