2

私は簡単なチャットを開発しています。チャット クライアントは ncurses に基づいており、次の 2 つのウィンドウがあります。

  • ユーザーがメッセージを入力する「入力」ウィンドウ。
  • ユーザーが他のユーザーによるメッセージを表示する「出力」ウィンドウ。

私のクライアントには 2 つのスレッドがあり、1 つはユーザーからメッセージを取得するためのもので、もう 1 つはサーバーからメッセージを表示するためのものです。

ユーザーがメッセージを入力すると、入力ウィンドウに期待どおりに表示されます。

入力ウィンドウのカーソル

問題は、メッセージが送信されると、キーが押されるまでカーソルが出力ウィンドウで待機することです。

出力ウィンドウのカーソル

これはかなり厄介です (クライアントがフォーカスを失った場合にも発生します)。カーソルを特定のウィンドウに移動させるにはどうすればよいですか?

関連するコードは次のとおりです。

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;
}
4

0 に答える 0