私は簡単なチャットを開発しています。チャット クライアントは 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;
}