15 #elif defined(MACINTOSH)
16 #include <OpenTransport.h>
17 #include <OpenTptInternet.h>
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <netinet/in.h>
24 #include <arpa/inet.h>
30 #define MAX_HOSTNAME 256
33 #define RINGBUF_SIZE 1024*1024
34 #define FRESH_QUEUE_SIZE 4096
38 #define WAIT 100*1000 /* ¥Ö¥é¥¦¥ºÂ¦¤Î¥¦¥¨¥¤¥È(usñ°Ì) */
40 #define DEFAULT_DELAY 50
41 #define RECVBUF_SIZE 1024
43 static long epoch_time; /* ¥Ð¥Ã¥Õ¥¡³«»Ï»þ¹ï */
44 static int browse_delay; /* ɽ¼¨¤¹¤ë¤Þ¤Ç¤Î»þ´Ö(100msñ°Ì)(¤³¤Î´Ö¤Ë¥é¥°¤òµÛ¼ý¤¹¤ë) */
46 static int sd; /* ¥½¥±¥Ã¥È¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿ */
47 static long time_diff; /* ¥×¥ì¥¤Â¦¤È¤Î»þ´Ö¤Î¤º¤ì(¤³¤ì¤ò¸«¤Ê¤¬¤é¥Ç¥£¥ì¥¤¤òÄ´À°¤·¤Æ¤¤¤¯) */
48 static int server_port;
49 static char server_name[MAX_HOSTNAME];
53 static int movie_mode;
57 #define close closesocket
61 static InetSvcRef inet_services = nil;
62 static EndpointRef ep = kOTInvalidEndpointRef;
65 /* ÉÁ²è¤¹¤ë»þ¹ï¤ò³Ð¤¨¤Æ¤ª¤¯¥¥å¡¼¹½Â¤ÂÎ */
68 int time[FRESH_QUEUE_SIZE];
74 /* ¥ê¥ó¥°¥Ð¥Ã¥Õ¥¡¹½Â¤ÂÎ */
84 int recv(int s, char *buffer, size_t buflen, int flags)
87 int n = OTRcv(ep, (void *) buffer, buflen, &junkFlags);
97 static errr (*old_xtra_hook)(int n, int v);
98 static errr (*old_curs_hook)(int x, int y);
99 static errr (*old_bigcurs_hook)(int x, int y);
100 static errr (*old_wipe_hook)(int x, int y, int n);
101 static errr (*old_text_hook)(int x, int y, int n, byte a, cptr s);
103 static void disable_chuukei_server(void)
105 term *t = angband_term[0];
107 chuukei_server = FALSE;
109 t->xtra_hook = old_xtra_hook;
110 t->curs_hook = old_curs_hook;
111 t->bigcurs_hook = old_bigcurs_hook;
112 t->wipe_hook = old_wipe_hook;
113 t->text_hook = old_text_hook;
116 /* ANSI C¤Ë¤è¤ì¤ÐstaticÊÑ¿ô¤Ï0¤Ç½é´ü²½¤µ¤ì¤ë¤¬°ì±þ½é´ü²½¤¹¤ë */
117 static errr init_buffer(void)
119 fresh_queue.next = fresh_queue.tail = 0;
120 ring.wptr = ring.rptr = ring.inlen = 0;
121 fresh_queue.time[0] = 0;
122 ring.buf = malloc(RINGBUF_SIZE);
123 if (ring.buf == NULL) return (-1);
128 /* ¸½ºß¤Î»þ´Ö¤ò100msñ°Ì¤Ç¼èÆÀ¤¹¤ë */
129 static long get_current_time(void)
132 return timeGetTime() / 100;
133 #elif defined(MACINTOSH)
137 gettimeofday(&tv, NULL);
139 return (tv.tv_sec * 10 + tv.tv_usec / 100000);
144 /* ¥ê¥ó¥°¥Ð¥Ã¥Õ¥¡¹½Â¤ÂÎ¤Ë buf ¤ÎÆâÍƤò²Ã¤¨¤ë */
145 static errr insert_ringbuf(char *buf)
148 len = strlen(buf) + 1; /* +1¤Ï½ªÃ¼Ê¸»úʬ */
152 fd_write(movie_fd, buf, len);
154 if (!chuukei_server) return 0;
160 /* ¥Ð¥Ã¥Õ¥¡¤ò¥ª¡¼¥Ð¡¼ */
161 if (ring.inlen + len >= RINGBUF_SIZE)
164 if (chuukei_server) disable_chuukei_server();
165 else chuukei_client = FALSE;
167 prt("Á÷¼õ¿®¥Ð¥Ã¥Õ¥¡¤¬°î¤ì¤Þ¤·¤¿¡£¥µ¡¼¥Ð¤È¤ÎÀܳ¤òÀÚÃǤ·¤Þ¤¹¡£", 0, 0);
175 /* ¥Ð¥Ã¥Õ¥¡¤Î½ªÃ¼¤Þ¤Ç¤Ë¼ý¤Þ¤ë */
176 if (ring.wptr + len < RINGBUF_SIZE)
178 memcpy(ring.buf + ring.wptr, buf, len);
181 /* ¥Ð¥Ã¥Õ¥¡¤Î½ªÃ¼¤Þ¤Ç¤Ë¼ý¤Þ¤é¤Ê¤¤(¥Ô¥Ã¥¿¥ê¼ý¤Þ¤ë¾ì¹ç¤â´Þ¤à) */
184 int head = RINGBUF_SIZE - ring.wptr; /* Á°È¾ */
185 int tail = len - head; /* ¸åȾ */
187 memcpy(ring.buf + ring.wptr, buf, head);
188 memcpy(ring.buf, buf + head, tail);
199 void flush_ringbuf(void)
205 if (!chuukei_server) return;
207 if (ring.inlen == 0) return;
222 /* ¥½¥±¥Ã¥È¤Ë¥Ç¡¼¥¿¤ò½ñ¤¹þ¤á¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë */
223 select(sd+1, (fd_set *)NULL, &tmp_fdset, (fd_set *)NULL, &tv);
225 /* ½ñ¤¹þ¤á¤Ê¤±¤ì¤ÐÌá¤ë */
226 if (FD_ISSET(sd, &tmp_fdset) == 0) break;
228 result = send(sd, ring.buf + ring.rptr, ((ring.wptr > ring.rptr ) ? ring.wptr : RINGBUF_SIZE) - ring.rptr, 0);
232 /* ¥µ¡¼¥Ð¤È¤ÎÀܳÃÇ¡© */
233 if (chuukei_server) disable_chuukei_server();
235 prt("¥µ¡¼¥Ð¤È¤ÎÀܳ¤¬ÀÚÃǤµ¤ì¤Þ¤·¤¿¡£", 0, 0);
243 ring.inlen -= result;
245 if (ring.rptr == RINGBUF_SIZE) ring.rptr = 0;
246 if (ring.inlen == 0) break;
249 if (!chuukei_server) return;
251 if (ring.inlen == 0) return;
257 /* ¥½¥±¥Ã¥È¤Ë¥Ç¡¼¥¿¤ò½ñ¤¹þ¤á¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë */
258 result = OTSnd(ep, ring.buf + ring.rptr, ((ring.wptr > ring.rptr ) ? ring.wptr : RINGBUF_SIZE) - ring.rptr, 0);
262 /* ¥µ¡¼¥Ð¤È¤ÎÀܳÃÇ¡© */
263 if (chuukei_server) disable_chuukei_server();
265 prt("¥µ¡¼¥Ð¤È¤ÎÀܳ¤¬ÀÚÃǤµ¤ì¤Þ¤·¤¿¡£", 0, 0);
273 ring.inlen -= result;
275 if (ring.rptr == RINGBUF_SIZE) ring.rptr = 0;
276 if (ring.inlen == 0) break;
282 static int read_chuukei_prf(cptr prf_name)
287 path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA, prf_name);
288 fp = my_fopen(buf, "r");
290 if (!fp) return (-1);
295 browse_delay = DEFAULT_DELAY;
297 while (0 == my_fgets(fp, buf, sizeof(buf)))
300 if (!strncmp(buf, "server:", 7))
302 strncpy(server_name, buf + 7, MAX_HOSTNAME - 1);
303 server_name[MAX_HOSTNAME - 1] = '\0';
307 if (!strncmp(buf, "port:", 5))
309 server_port = atoi(buf + 5);
313 if (!strncmp(buf, "delay:", 6))
315 browse_delay = atoi(buf + 6);
321 /* prf¥Õ¥¡¥¤¥ë¤¬´°Á´¤Ç¤Ê¤¤ */
322 if (server_port == -1 || server_name[0] == 0) return (-1);
327 int connect_chuukei_server(char *prf_name)
333 WORD wVersionRequested = (WORD) (( 1) | ( 1 << 8));
336 struct sockaddr_in ask;
339 if (read_chuukei_prf(prf_name) < 0)
341 printf("Wrong prf file\n");
345 if (init_buffer() < 0)
347 printf("Malloc error\n");
352 if (WSAStartup(wVersionRequested, &wsaData))
354 msg_print("Report: WSAStartup failed.");
359 printf("server = %s\nport = %d\n", server_name, server_port);
361 if ((hp = gethostbyname(server_name)) != NULL)
363 memset(&ask, 0, sizeof(ask));
364 memcpy(&ask.sin_addr, hp->h_addr_list[0], hp->h_length);
368 if ((ask.sin_addr.s_addr=inet_addr(server_name)) == 0)
370 printf("Bad hostname\n");
375 ask.sin_family = AF_INET;
376 ask.sin_port = htons((unsigned short)server_port);
379 if ((sd=socket(PF_INET,SOCK_STREAM, 0)) < 0)
381 if ((sd=socket(PF_INET,SOCK_STREAM, 0)) == INVALID_SOCKET)
384 printf("Can't create socket\n");
388 if (connect(sd, (struct sockaddr *)&ask, sizeof(ask)) < 0)
391 printf("Can't connect %s port %d\n", server_name, server_port);
396 #else /* MACINTOSH */
398 InetHostInfo response;
402 Boolean bind = false;
405 if (read_chuukei_prf(prf_name) < 0){
406 printf("Wrong prf file\n");
412 printf("server = %s\nport = %d\n", server_name, server_port);
415 #if TARGET_API_MAC_CARBON
416 err = InitOpenTransportInContext(kInitOTForApplicationMask, NULL);
418 err = InitOpenTransport();
421 memset(&response, 0, sizeof(response));
424 #if TARGET_API_MAC_CARBON
425 inet_services = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, &err, NULL);
427 inet_services = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err);
431 err = OTInetStringToAddress(inet_services, (char *)server_name, &response);
434 host_addr = response.addrs[0];
436 printf("Bad hostname\n");
439 #if TARGET_API_MAC_CARBON
440 ep = (void *)OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err, NULL);
442 ep = (void *)OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
446 err = OTBind(ep, nil, nil);
447 bind = (err == noErr);
450 OTInitInetAddress(&inAddr, server_port, host_addr);
452 sndCall.addr.len = sizeof(InetAddress);
453 sndCall.addr.buf = (unsigned char*) &inAddr;
454 sndCall.opt.buf = nil; /* no connection options */
456 sndCall.udata.buf = nil; /* no connection data */
457 sndCall.udata.len = 0;
458 sndCall.sequence = 0; /* ignored by OTConnect */
460 err = OTConnect(ep, &sndCall, NULL);
463 printf("Can't connect %s port %d\n", server_name, server_port);
467 err = OTSetSynchronous(ep);
469 err = OTSetBlocking(ep);
478 if (ep != kOTInvalidEndpointRef) {
482 if (inet_services != nil) {
483 OTCloseProvider(inet_services);
496 /* str¤¬Æ±¤¸Ê¸»ú¤Î·«¤êÊÖ¤·¤«¤É¤¦¤«Ä´¤Ù¤ë */
497 static bool string_is_repeat(char *str, int len)
502 if (len < 2) return (FALSE);
504 if (iskanji(c)) return (FALSE);
507 for (i = 1; i < len; i++)
510 if(c != str[i] || iskanji(str[i])) return (FALSE);
512 if(c != str[i]) return (FALSE);
519 static errr send_text_to_chuukei_server(int x, int y, int len, byte col, cptr str)
524 strncpy(buf2, str, len);
529 sprintf(buf, "s%c%c%c%c", x+1, y+1, col, buf2[0]);
531 else if(string_is_repeat(buf2, len))
534 for (i = len; i > 0; i -= 127)
536 sprintf(buf, "n%c%c%c%c%c", x+1, y+1, MIN(i, 127), col, buf2[0]);
544 sprintf(buf, "t%c%c%c%c%s", x+1, y+1, len, col, buf2);
549 return (*old_text_hook)(x, y, len, col, str);
552 static errr send_wipe_to_chuukei_server(int x, int y, int len)
556 sprintf(buf, "w%c%c%c", x+1, y+1, len);
560 return (*old_wipe_hook)(x, y, len);
563 static errr send_xtra_to_chuukei_server(int n, int v)
567 if (n == TERM_XTRA_CLEAR || n == TERM_XTRA_FRESH || n == TERM_XTRA_SHAPE)
569 sprintf(buf, "x%c", n+1);
573 if (n == TERM_XTRA_FRESH)
575 sprintf(buf, "d%ld", get_current_time() - epoch_time);
580 /* Verify the hook */
581 if (!old_xtra_hook) return -1;
583 return (*old_xtra_hook)(n, v);
586 static errr send_curs_to_chuukei_server(int x, int y)
590 sprintf(buf, "c%c%c", x+1, y+1);
594 return (*old_curs_hook)(x, y);
597 static errr send_bigcurs_to_chuukei_server(int x, int y)
601 sprintf(buf, "C%c%c", x+1, y+1);
605 return (*old_bigcurs_hook)(x, y);
610 * Prepare z-term hooks to call send_*_to_chuukei_server()'s
612 void prepare_chuukei_hooks(void)
614 term *t0 = angband_term[0];
616 /* Save original z-term hooks */
617 old_xtra_hook = t0->xtra_hook;
618 old_curs_hook = t0->curs_hook;
619 old_bigcurs_hook = t0->bigcurs_hook;
620 old_wipe_hook = t0->wipe_hook;
621 old_text_hook = t0->text_hook;
623 /* Prepare z-term hooks */
624 t0->xtra_hook = send_xtra_to_chuukei_server;
625 t0->curs_hook = send_curs_to_chuukei_server;
626 t0->bigcurs_hook = send_bigcurs_to_chuukei_server;
627 t0->wipe_hook = send_wipe_to_chuukei_server;
628 t0->text_hook = send_text_to_chuukei_server;
633 * Prepare z-term hooks to call send_*_to_chuukei_server()'s
635 void prepare_movie_hooks(void)
644 if (!chuukei_server) disable_chuukei_server();
646 disable_chuukei_server();
650 msg_print("Ï¿²è¤ò½ªÎ»¤·¤Þ¤·¤¿¡£");
652 msg_print("Stopped recording.");
657 sprintf(tmp, "%s.amv", player_base);
659 if (get_string("¥à¡¼¥Ó¡¼µÏ¿¥Õ¥¡¥¤¥ë: ", tmp, 80))
661 if (get_string("Movie file name: ", tmp, 80))
666 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
668 fd = fd_open(buf, O_RDONLY);
680 (void)sprintf(out_val, "¸½Â¸¤¹¤ë¥Õ¥¡¥¤¥ë¤Ë¾å½ñ¤¤·¤Þ¤¹¤«? (%s)", buf);
682 (void)sprintf(out_val, "Replace existing file %s? ", buf);
686 if (!get_check(out_val)) return;
688 movie_fd = fd_open(buf, O_WRONLY | O_TRUNC);
692 movie_fd = fd_make(buf, 0644);
698 msg_print("¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó¡ª");
700 msg_print("Can not open file.");
707 if (!chuukei_server) prepare_chuukei_hooks();
709 prepare_chuukei_hooks();
717 static int handle_timestamp_data(int timestamp)
719 long current_time = get_current_time();
721 /* ÉÁ²è¥¥å¡¼¤Ï¶õ¤«¤É¤¦¤«¡© */
722 if (fresh_queue.tail == fresh_queue.next)
724 /* ¥Ð¥Ã¥Õ¥¡¥ê¥ó¥°¤·»Ï¤á¤Î»þ´Ö¤òÊݸ¤·¤Æ¤ª¤¯ */
725 epoch_time = current_time;
726 epoch_time += browse_delay;
727 epoch_time -= timestamp;
728 time_diff = current_time - timestamp;
731 /* ÉÁ²è¥¥å¡¼¤ËÊݸ¤·¡¢Êݸ°ÌÃÖ¤ò¿Ê¤á¤ë */
732 fresh_queue.time[fresh_queue.tail] = timestamp;
735 /* ¥¥å¡¼¤ÎºÇ¸åÈø¤ËÅþ㤷¤¿¤éÀèƬ¤ËÌ᤹ */
736 fresh_queue.tail %= FRESH_QUEUE_SIZE;
738 if (fresh_queue.tail == fresh_queue.next)
741 prt("ÉÁ²è¥¿¥¤¥ß¥ó¥°¥¥å¡¼¤¬°î¤ì¤Þ¤·¤¿¡£¥µ¡¼¥Ð¤È¤ÎÀܳ¤òÀÚÃǤ·¤Þ¤¹¡£", 0, 0);
748 /* ¥×¥ì¥¤Â¦¤È¤Î¥Ç¥£¥ì¥¤¤òÄ´À° */
749 if (time_diff != current_time - timestamp)
751 long old_time_diff = time_diff;
752 time_diff = current_time - timestamp;
753 epoch_time -= (old_time_diff - time_diff);
761 static int handle_movie_timestamp_data(int timestamp)
763 static int initialized = FALSE;
765 /* ÉÁ²è¥¥å¡¼¤Ï¶õ¤«¤É¤¦¤«¡© */
768 /* ¥Ð¥Ã¥Õ¥¡¥ê¥ó¥°¤·»Ï¤á¤Î»þ´Ö¤òÊݸ¤·¤Æ¤ª¤¯ */
769 epoch_time = get_current_time();
770 epoch_time += browse_delay;
771 epoch_time -= timestamp;
772 //time_diff = current_time - timestamp;
776 /* ÉÁ²è¥¥å¡¼¤ËÊݸ¤·¡¢Êݸ°ÌÃÖ¤ò¿Ê¤á¤ë */
777 fresh_queue.time[fresh_queue.tail] = timestamp;
780 /* ¥¥å¡¼¤ÎºÇ¸åÈø¤ËÅþ㤷¤¿¤éÀèƬ¤ËÌ᤹ */
781 fresh_queue.tail %= FRESH_QUEUE_SIZE;
788 static int read_sock(void)
790 static char recv_buf[RECVBUF_SIZE];
791 static int remain_bytes = 0;
795 /* Á°²ó»Ä¤Ã¤¿¥Ç¡¼¥¿¤Î¸å¤Ë¤Ä¤Å¤±¤ÆÇÛ¿®¥µ¡¼¥Ð¤«¤é¥Ç¡¼¥¿¼õ¿® */
796 recv_bytes = recv(sd, recv_buf + remain_bytes, RECVBUF_SIZE - remain_bytes, 0);
801 /* Á°²ó»Ä¤Ã¤¿¥Ç¡¼¥¿Î̤˺£²óÆɤó¤À¥Ç¡¼¥¿Î̤òÄɲà */
802 remain_bytes += recv_bytes;
804 for (i = 0; i < remain_bytes; i ++)
806 /* ¥Ç¡¼¥¿¤Î¤¯¤®¤ê('\0')¤òõ¤¹ */
807 if (recv_buf[i] == '\0')
809 /* 'd'¤Ç»Ï¤Þ¤ë¥Ç¡¼¥¿(¥¿¥¤¥à¥¹¥¿¥ó¥×)¤Î¾ì¹ç¤Ï
810 ÉÁ²è¥¥å¡¼¤ËÊݸ¤¹¤ë½èÍý¤ò¸Æ¤Ö */
811 if ((recv_buf[0] == 'd') &&
812 (handle_timestamp_data(atoi(recv_buf + 1)) < 0))
815 /* ¼õ¿®¥Ç¡¼¥¿¤òÊݸ */
816 if (insert_ringbuf(recv_buf) < 0)
819 /* ¼¡¤Î¥Ç¡¼¥¿°Ü¹Ô¤òrecv_buf¤ÎÀèƬ¤Ë°ÜÆ° */
820 memmove(recv_buf, recv_buf + i + 1, remain_bytes - i - 1);
822 remain_bytes -= (i+1);
831 static int read_movie_file(void)
833 static char recv_buf[RECVBUF_SIZE];
834 static int remain_bytes = 0;
838 recv_bytes = read(movie_fd, recv_buf + remain_bytes, RECVBUF_SIZE - remain_bytes);
843 /* Á°²ó»Ä¤Ã¤¿¥Ç¡¼¥¿Î̤˺£²óÆɤó¤À¥Ç¡¼¥¿Î̤òÄɲà */
844 remain_bytes += recv_bytes;
846 for (i = 0; i < remain_bytes; i ++)
848 /* ¥Ç¡¼¥¿¤Î¤¯¤®¤ê('\0')¤òõ¤¹ */
849 if (recv_buf[i] == '\0')
851 /* 'd'¤Ç»Ï¤Þ¤ë¥Ç¡¼¥¿(¥¿¥¤¥à¥¹¥¿¥ó¥×)¤Î¾ì¹ç¤Ï
852 ÉÁ²è¥¥å¡¼¤ËÊݸ¤¹¤ë½èÍý¤ò¸Æ¤Ö */
853 if ((recv_buf[0] == 'd') &&
854 (handle_movie_timestamp_data(atoi(recv_buf + 1)) < 0))
857 /* ¼õ¿®¥Ç¡¼¥¿¤òÊݸ */
858 if (insert_ringbuf(recv_buf) < 0)
861 /* ¼¡¤Î¥Ç¡¼¥¿°Ü¹Ô¤òrecv_buf¤ÎÀèƬ¤Ë°ÜÆ° */
862 memmove(recv_buf, recv_buf + i + 1, remain_bytes - i - 1);
864 remain_bytes -= (i+1);
874 /* WinÈǤÎÃæÅÀ¤ÈÊɤÎƦÉå¤ò¥Ô¥ê¥ª¥É¤È¥·¥ã¡¼¥×¤Ë¤¹¤ë¡£*/
875 static void win2unix(int col, char *buf)
878 if ( col == 9 ) kabe = '%';
890 if (*buf == 127) *buf = kabe;
891 else if(*buf == 31) *buf = '.';
897 static bool get_nextbuf(char *buf)
903 *ptr = ring.buf[ring.rptr ++];
905 if (ring.rptr == RINGBUF_SIZE) ring.rptr = 0;
906 if (*ptr++ == '\0') break;
909 if (buf[0] == 'd') return (FALSE);
914 /* ¥×¥ì¥¤¥Û¥¹¥È¤Î¥Þ¥Ã¥×¤¬Â礤¤¤È¤¥¯¥é¥¤¥¢¥ó¥È¤Î¥Þ¥Ã¥×¤â¥ê¥µ¥¤¥º¤¹¤ë */
915 static void update_term_size(int x, int y, int len)
919 Term_get_size(&ox, &oy);
923 /* ²£Êý¸þ¤Î¥Á¥§¥Ã¥¯ */
924 if (x + len > ox) nx = x + len;
925 /* ½ÄÊý¸þ¤Î¥Á¥§¥Ã¥¯ */
926 if (y + 1 > oy) ny = y + 1;
928 if (nx != ox || ny != oy) Term_resize(nx, ny);
931 static bool flush_ringbuf_client(void)
936 if (fresh_queue.next == fresh_queue.tail) return (FALSE);
938 /* ¤Þ¤À½ñ¤¯¤Ù¤»þ¤Ç¤Ê¤¤ */
939 if (fresh_queue.time[fresh_queue.next] > get_current_time() - epoch_time) return (FALSE);
941 /* »þ´Ö¾ðÊó(¶èÀÚ¤ê)¤¬ÆÀ¤é¤ì¤ë¤Þ¤Ç½ñ¤¯ */
942 while (get_nextbuf(buf))
947 unsigned char tmp1, tmp2, tmp3, tmp4;
950 sscanf(buf, "%c%c%c%c%c", &id, &tmp1, &tmp2, &tmp3, &tmp4);
951 x = tmp1-1; y = tmp2-1; len = tmp3; col = tmp4;
968 update_term_size(x, y, len);
969 (void)((*angband_term[0]->text_hook)(x, y, len, (byte)col, mesg));
970 strncpy(&Term->scr->c[y][x], mesg, len);
971 for (i = x; i < x+len; i++)
973 Term->scr->a[y][i] = col;
977 case 'n': /* ·«¤êÊÖ¤· */
978 for (i = 1; i < len; i++)
983 update_term_size(x, y, len);
984 (void)((*angband_term[0]->text_hook)(x, y, len, (byte)col, mesg));
985 strncpy(&Term->scr->c[y][x], mesg, len);
986 for (i = x; i < x+len; i++)
988 Term->scr->a[y][i] = col;
992 case 's': /* °ìʸ»ú */
993 update_term_size(x, y, 1);
994 (void)((*angband_term[0]->text_hook)(x, y, 1, (byte)col, mesg));
995 strncpy(&Term->scr->c[y][x], mesg, 1);
996 Term->scr->a[y][x] = col;
1000 update_term_size(x, y, len);
1001 (void)((*angband_term[0]->wipe_hook)(x, y, len));
1005 if (x == TERM_XTRA_CLEAR) Term_clear();
1006 (void)((*angband_term[0]->xtra_hook)(x, 0));
1010 update_term_size(x, y, 1);
1011 (void)((*angband_term[0]->curs_hook)(x, y));
1014 update_term_size(x, y, 1);
1015 (void)((*angband_term[0]->bigcurs_hook)(x, y));
1021 if (fresh_queue.next == FRESH_QUEUE_SIZE) fresh_queue.next = 0;
1026 void browse_chuukei()
1040 Term_xtra(TERM_XTRA_REACT, 0);
1045 struct timeval tmp_tv;
1047 if (flush_ringbuf_client()) continue;
1052 /* ¥½¥±¥Ã¥È¤Ë¥Ç¡¼¥¿¤¬Íè¤Æ¤¤¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë */
1053 select(sd+1, &tmp_fdset, (fd_set *)NULL, (fd_set *)NULL, &tmp_tv);
1054 if (FD_ISSET(sd, &tmp_fdset) == 0)
1056 Term_xtra(TERM_XTRA_FLUSH, 0);
1060 if (read_sock() < 0)
1062 chuukei_client = FALSE;
1065 /* Àܳ¤¬Àڤ줿¾õÂ֤ǽñ¤¯¤Ù¤¥Ç¡¼¥¿¤¬¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤¿¤é½ªÎ» */
1066 if (!chuukei_client && fresh_queue.next == fresh_queue.tail ) break;
1071 Term_xtra(TERM_XTRA_REACT, 0);
1075 UInt32 unreadData = 0;
1078 if (flush_ringbuf_client()) continue;
1080 /* ¥½¥±¥Ã¥È¤Ë¥Ç¡¼¥¿¤¬Íè¤Æ¤¤¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë */
1082 OTCountDataBytes(ep, &unreadData);
1083 if(unreadData <= 0 ){
1084 Term_xtra(TERM_XTRA_FLUSH, 0);
1087 if (read_sock() < 0)
1089 chuukei_client = FALSE;
1092 /* Àܳ¤¬Àڤ줿¾õÂ֤ǽñ¤¯¤Ù¤¥Ç¡¼¥¿¤¬¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤¿¤é½ªÎ» */
1093 if (!chuukei_client && fresh_queue.next == fresh_queue.tail ) break;
1095 #endif /*MACINTOSH*/
1097 #endif /* CHUUKEI */
1099 void prepare_browse_movie_aux(cptr filename)
1101 movie_fd = fd_open(filename, O_RDONLY);
1103 browsing_movie = TRUE;
1108 void prepare_browse_movie(cptr filename)
1111 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, filename);
1113 prepare_browse_movie_aux(buf);
1116 void browse_movie(void)
1120 Term_xtra(TERM_XTRA_REACT, 0);
1122 while (read_movie_file() == 0)
1124 while (fresh_queue.next != fresh_queue.tail)
1126 if (!flush_ringbuf_client())
1128 Term_xtra(TERM_XTRA_FLUSH, 0);
1130 /* ¥½¥±¥Ã¥È¤Ë¥Ç¡¼¥¿¤¬Íè¤Æ¤¤¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë */