光标在错误的窗口中等待

时间:2013-04-11 14:27:24

标签: c sockets cursor client ncurses

我正在开发一个简单的聊天。聊天客户端基于ncurses,有两个窗口:

  • 用户输入消息的“输入”窗口。
  • “输出”窗口,用户可在其中查看其他用户的消息。

我的客户端有两个线程,一个用于从用户获取消息,另一个用于显示来自服务器的消息。

当用户键入消息时,它们会在输入窗口中按预期显示。

Cursor in input window

问题是,一旦发送了一条消息,光标就会在输出窗口等待,直到按下一个键。

Cursor in output window

这很烦人(当客户失去焦点时也会发生这种情况)。如何强制光标位于某个窗口?

相关代码在这里:

WINDOW* in;
WINDOW* out;
...
void chatter(int sockfd)
{
    ...
    pthread_create(&sendt, NULL, sender, &sockfd);

    while (1)
    {
        bytes = recv(sockfd, msg, sizeof msg - 1, 0);

        if (bytes != 0)
        {
            if (bytes == -1)
            {
                wprintw(out, "Error receiving message: %s\n", strerror(errno));
            }
            else
            {
                msg[bytes] = '\0';
                wprintw(out, "%s", msg);
            }

            wrefresh(out);
        }
        else
        {
            break;
        }
    }

    pthread_cancel(sendt);
    pthread_detach(sendt);
    ...
}

void* sender(void* pfd)
{
    char msg[MAX_MSG] = "";
    int sockfd = *(int *)pfd;

    while (1)
    {
        mvwgetnstr(in, 0, 0, msg, sizeof msg - 2);
        strcat(msg, "\n");

        if (send(sockfd, msg, strlen(msg) + 1, 0) == -1)
        {
            wprintw(out, "Error sending message: %s\n", strerror(errno));
        }

        werase(in);
    }

    return NULL;
}

0 个答案:

没有答案