void tickon(void) { #ifdef HAVE_SETITIMER struct itimerval val; val.it_interval.tv_sec = 0; val.it_interval.tv_usec = 0; if (auto_scroll) { int tim = auto_trig_time - mnow(); if (tim < 0) tim = 1; tim *= 1000; val.it_value.tv_sec = 0; val.it_value.tv_usec = tim; } else { val.it_value.tv_sec = 1; val.it_value.tv_usec = 0; } ticked = 0; joe_set_signal(SIGALRM, dotick); setitimer(ITIMER_REAL,&val,NULL); #else ticked = 0; joe_set_signal(SIGALRM, dotick); alarm(1); #endif }
void tickon(void) { struct itimerval val; struct timeval now; gettimeofday(&now, NULL); val.it_interval.tv_sec = 0; val.it_interval.tv_usec = 0; if (auto_scroll) { time_t now = mnow(); time_t tim = (now > auto_trig_time) ? 1 : auto_trig_time - now; tim *= 1000; val.it_value.tv_sec = 0; val.it_value.tv_usec = tim; } else { val.it_value.tv_sec = 60 - (now.tv_sec % 60); val.it_value.tv_usec = 1000000 - now.tv_usec; } ticked = 0; joe_set_signal(SIGALRM, dotick); setitimer(ITIMER_REAL,&val,NULL); }
int ttgetc(void) { int stat; long new_time; int flg; tickon(); loop: flg = 0; /* Status line clock */ new_time = time(NULL); if (new_time != last_time) { last_time = new_time; dostaupd = 1; ticked = 1; } /* Autoscroller */ if (auto_scroll && mnow() >= auto_trig_time) { do_auto_scroll(); ticked = 1; flg = 1; } ttflsh(); while (winched) { winched = 0; edupd(1); ttflsh(); } if (ticked) { edupd(flg); ttflsh(); tickon(); } if (ackkbd != -1) { if (!have) { /* Wait for input */ stat = read(mpxfd, &pack, sizeof(struct packet) - 1024); if (pack.size && stat > 0) { joe_read(mpxfd, pack.data, pack.size); } else if (stat < 1) { if (winched || ticked) goto loop; else ttsig(0); } acceptch = pack.ch; } have = 0; if (pack.who) { /* Got bknd input */ if (acceptch != NO_MORE_DATA) { if (pack.who->func) { pack.who->func(pack.who->object, pack.data, pack.size); edupd(1); } } else mpxdied(pack.who); goto loop; } else { if (acceptch != NO_MORE_DATA) { tickoff(); return acceptch; } else { tickoff(); ttsig(0); return 0; } } } if (have) { have = 0; } else { if (read(fileno(termin), &havec, 1) < 1) { if (winched || ticked) goto loop; else ttsig(0); } } tickoff(); return havec; }