OK, I think I got it. It seems to me that the problem is Fl_Progress not implementing handle(), specifically the fact that it doesn't handle FL_ENTER.
In Fl_Group.cxx, line 198 is "if (send(o,FL_ENTER)) return 1;". This line calls send(), which in turn calls o->handle(event). But because Fl_Progress doesn't implement handle(), the base Fl_Widget::handle() is called, which returns 0, so send() returns 0, which then causes the flow of execution to reach line 202 ("Fl::belowmouse(this);"), which sets the "belowmouse" widget to the containing Fl_Window, which then causes line 194 ("if (o->contains(Fl::belowmouse())) {") to fail and keep failing, repeating the cycle endlessly. Long story short, the "belowmouse" widget is never set to the Fl_Progress.
To fix this, we need to handle() FL_ENTER in the Fl_Progress class.
In Fl_Progress.H:
public:
virtual int handle(int);
In Fl_Progress.cxx:
int Fl_Progress::handle(int e)
{
if(e == FL_ENTER || e == FL_LEAVE) return 1;
return 0;
}
I haven't looked at the possibility of this breaking something (have to go to bed), but it seems very unlikely.