Fix rare early timeouts in Fl_Clock (STR 3516).

This is the main patch for Fl_Clock discussed in STR 3516. Although
the root cause under Linux (in Fl::add_timeout()) has been fixed
in a previous commit (35a3e7cc1) early timeouts may still occur,
e.g. under Windows in a Virtualbox environment.

This commit reverts bab61a93d and replaces it with the patch proposed
by Manolo and further discussed in STR 3516.
This commit is contained in:
Albrecht Schlosser 2019-12-26 18:13:03 +01:00
parent 35a3e7cc16
commit 3701950a90
2 changed files with 10 additions and 3 deletions

View File

@ -18,6 +18,8 @@ Changes in FLTK 1.4.0 Released: ??? ?? 2019
New Features and Extensions
- (add new items here)
- Fix Fl::add_timeout() under Linux (STR 3516).
- Fix early timeouts in Fl_Clock seen in some environments (STR 3516).
- Fl_Printer::begin_job() uses by default the Gnome print dialog on the X11
platform when the GTK library is available at run-time. That can be turned off
with Fl::option(OPTION_PRINTER_USES_GTK, false).

View File

@ -212,11 +212,16 @@ static void tick(void *v) {
time_t sec;
int usec;
Fl::system_driver()->gettime(&sec, &usec);
double delta = (1000000 - usec)/1000000.; // time till next second
// if current time is just before full second, show that full second
// and wait one more second (STR 3516)
if (delta < 0.1) {
delta += 1.0;
sec++;
}
((Fl_Clock*)v)->value((ulong)sec);
// schedule timer event slightly later than the next second (+25 ms)
// to prevent multiple timer events if triggered too early (STR 3516)
Fl::add_timeout((1025000 - usec)/1000000., tick, v);
Fl::add_timeout(delta, tick, v);
}
int Fl_Clock::handle(int event) {