+ {
+ struct beeptime *newbeep;
+ long ticks;
+
+ ticks = GetTickCount();
+debug(("beep received at %ld, last was %ld, nbeeps=%d\n", ticks, lastbeep, nbeeps));
+
+ if (!beep_overloaded) {
+ newbeep = smalloc(sizeof(struct beeptime));
+ newbeep->ticks = ticks;
+ newbeep->next = NULL;
+ if (!beephead)
+ beephead = newbeep;
+ else
+ beeptail->next = newbeep;
+ beeptail = newbeep;
+ nbeeps++;
+ }
+
+ /*
+ * Throw out any beeps that happened more than
+ * t seconds ago.
+ */
+ while (beephead &&
+ beephead->ticks < ticks - cfg.bellovl_t*1000) {
+ struct beeptime *tmp = beephead;
+ beephead = tmp->next;
+debug(("throwing out beep received at %ld\n", tmp->ticks));
+ sfree(tmp);
+ if (!beephead)
+ beeptail = NULL;
+ nbeeps--;
+ }
+
+ if (cfg.bellovl && beep_overloaded &&
+ ticks-lastbeep >= cfg.bellovl_s * 1000) {
+ /*
+ * If we're currently overloaded and the
+ * last beep was more than s seconds ago,
+ * leave overload mode.
+ */
+debug(("silence reigns, leaving overload mode\n"));
+ beep_overloaded = FALSE;
+ } else if (cfg.bellovl && !beep_overloaded &&
+ nbeeps >= cfg.bellovl_n) {
+ /*
+ * Now, if we have n or more beeps
+ * remaining in the queue, go into overload
+ * mode.
+ */
+debug(("%d beeps between times %ld and %ld, overload!\n",
+ nbeeps, beephead->ticks, ticks));
+ beep_overloaded = TRUE;
+ }
+ lastbeep = ticks;
+
+ /*
+ * Perform an actual beep if we're not overloaded.
+ */
+ if ((!cfg.bellovl || !beep_overloaded) && cfg.beep != 0) {
+debug(("not overloaded; performing a beep\n"));
+ if (cfg.beep != 2)
+ beep(cfg.beep);
+ else if(cfg.beep == 2) {
+ in_vbell = TRUE;
+ vbell_timeout = ticks + VBELL_TIMEOUT;
+ term_update();
+ }
+ }
+ disptop = scrtop;
+ }