Request screen size if most recently connected client disconnects
[abduco.git] / client.c
blobb60d32616dc4ef73352ed498e644678bdb76be61
1 static Client client;
3 static void client_sigwinch_handler(int sig) {
4 client.need_resize = true;
7 static bool client_send_packet(Packet *pkt) {
8 print_packet("client-send:", pkt);
9 if (send_packet(server.socket, pkt))
10 return true;
11 debug("FAILED\n");
12 server.running = false;
13 return false;
16 static bool client_recv_packet(Packet *pkt) {
17 if (recv_packet(server.socket, pkt)) {
18 print_packet("client-recv:", pkt);
19 return true;
21 debug("client-recv: FAILED\n");
22 server.running = false;
23 return false;
26 static void client_show_cursor() {
27 printf("\e[?25h");
28 fflush(stdout);
31 static void client_restore_terminal() {
32 if (has_term)
33 tcsetattr(0, TCSADRAIN, &orig_term);
34 client_show_cursor();
37 static int client_mainloop() {
38 client.need_resize = true;
39 while (server.running) {
40 fd_set fds;
41 FD_ZERO(&fds);
42 FD_SET(STDIN_FILENO, &fds);
43 FD_SET(server.socket, &fds);
45 if (client.need_resize) {
46 struct winsize ws;
47 if (ioctl(0, TIOCGWINSZ, &ws) != -1) {
48 Packet pkt = {
49 .type = MSG_RESIZE,
50 .u = { .ws = ws },
51 .len = sizeof(ws),
53 if (client_send_packet(&pkt))
54 client.need_resize = false;
58 if (select(server.socket + 1, &fds, NULL, NULL, NULL) == -1) {
59 if (errno == EINTR)
60 continue;
61 die("client-mainloop");
64 if (FD_ISSET(server.socket, &fds)) {
65 Packet pkt;
66 if (client_recv_packet(&pkt)) {
67 switch (pkt.type) {
68 case MSG_CONTENT:
69 write_all(STDOUT_FILENO, pkt.u.msg, pkt.len);
70 break;
71 case MSG_RESIZE:
72 client.need_resize = true;
73 break;
74 case MSG_EXIT:
75 return pkt.u.i;
80 if (FD_ISSET(STDIN_FILENO, &fds)) {
81 Packet pkt = { .type = MSG_CONTENT };
82 ssize_t len = read(STDIN_FILENO, pkt.u.msg, sizeof(pkt.u.msg));
83 if (len == -1 && errno != EAGAIN && errno != EINTR)
84 die("client-stdin");
85 if (len > 0) {
86 debug("client-stdin: %c\n", pkt.u.msg[0]);
87 pkt.len = len;
88 if (pkt.u.msg[0] == KEY_REDRAW) {
89 client.need_resize = true;
90 } else if (pkt.u.msg[0] == KEY_DETACH) {
91 pkt.type = MSG_DETACH;
92 pkt.len = 0;
93 client_send_packet(&pkt);
94 return -1;
95 } else {
96 client_send_packet(&pkt);
102 return -EIO;