Browse Source

Fix possibly uncleared damage flag of Fl_Pack (#1172).

Damage flag `FL_DAMAGE_ALL` is set during Fl_Pack::draw if child
is repositioned. If the child is outside the clipping area, if will not redraw
and the flag will remain set even after Fl_Pack::draw which is not allowed.
pull/1178/head
Matthias Melcher 6 months ago
parent
commit
3293a68c1d
  1. 8
      src/Fl_Pack.cxx

8
src/Fl_Pack.cxx

@ -110,12 +110,18 @@ void Fl_Pack::draw() {
} }
if (X != o->x() || Y != o->y() || W != o->w() || H != o->h()) { if (X != o->x() || Y != o->y() || W != o->w() || H != o->h()) {
o->resize(X,Y,W,H); o->resize(X,Y,W,H);
// Clear all damage flags, but *set* FL_DAMAGE_ALL, even if the widget
// may be clipped by the parent and needs no redraw.
o->clear_damage(FL_DAMAGE_ALL); o->clear_damage(FL_DAMAGE_ALL);
} }
if (d&FL_DAMAGE_ALL) { if (d&FL_DAMAGE_ALL) {
draw_child(*o); draw_child(*o);
draw_outside_label(*o); draw_outside_label(*o);
} else update_child(*o); } else {
update_child(*o);
}
// Make sure that all damage flags are cleared.
o->clear_damage();
// child's draw() can change it's size, so use new size: // child's draw() can change it's size, so use new size:
current_position += (horizontal() ? o->w() : o->h()); current_position += (horizontal() ? o->w() : o->h());
if (current_position > maximum_position) if (current_position > maximum_position)

Loading…
Cancel
Save