Fix possible crash in ElasticScroll destructor.

This commit is contained in:
John Preston 2024-03-24 10:19:05 +04:00
parent 0999c7f70e
commit fa8de8b199
2 changed files with 13 additions and 2 deletions

View file

@ -381,6 +381,14 @@ ElasticScroll::ElasticScroll(
}, _bar->lifetime());
}
ElasticScroll::~ElasticScroll() {
// Destroy the _bar cleanly (keeping _bar == nullptr) to avoid a crash:
//
// _bar destructor may send LeaveEvent to ElasticScroll,
// which will try to toggle(false) the _bar in leaveEventHook.
base::take(_bar);
}
void ElasticScroll::setHandleTouch(bool handle) {
if (_touchDisabled != handle) {
return;
@ -1071,14 +1079,16 @@ void ElasticScroll::keyPressEvent(QKeyEvent *e) {
}
void ElasticScroll::enterEventHook(QEnterEvent *e) {
if (!_disabled) {
if (_bar && !_disabled) {
_bar->toggle(true);
}
}
void ElasticScroll::leaveEventHook(QEvent *e) {
if (_bar) {
_bar->toggle(false);
}
}
void ElasticScroll::scrollTo(ScrollToRequest request) {
scrollToY(request.ymin, request.ymax);

View file

@ -113,6 +113,7 @@ public:
QWidget *parent,
const style::ScrollArea &st = st::defaultScrollArea,
Qt::Orientation orientation = Qt::Vertical);
~ElasticScroll();
void setHandleTouch(bool handle);
bool viewportEvent(QEvent *e);