vlc | branch: master | Erwan Tulou <[email protected]> | Thu Nov 28 21:01:19 2019 +0100| [1a2932b4b0c9ce100d0dffdf895f4f245a57ff49] | committer: Erwan Tulou
Qt(menu): fix skins2 issues with checkbox menus The bug: - launch a video with vlc(skins2). - Press 'o' to toggle autoscale. - click outside vlc to lose the focus. - click again on vlc and press again on 'o'. At this point, the Qt thread no longer responds because of a deadlock The cause is an undue connect (on toggled signal) that sets again the variable while it was already being set in a callback (via hotkey). The patch does the following: - removes the undue connect (on toggled signal) - ensure the essential connect (on triggered signal) is always called - add a proper initialisation that was missing - assert instead of if (the degraded mode is never used) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1a2932b4b0c9ce100d0dffdf895f4f245a57ff49 --- modules/gui/qt/components/custom_menus.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/modules/gui/qt/components/custom_menus.cpp b/modules/gui/qt/components/custom_menus.cpp index e11ba4f231..099ff06572 100644 --- a/modules/gui/qt/components/custom_menus.cpp +++ b/modules/gui/qt/components/custom_menus.cpp @@ -297,18 +297,14 @@ BooleanPropertyAction::BooleanPropertyAction(QString title, QObject *model, QStr QMetaProperty property = meta->property(propertyId); assert(property.type() == QVariant::Bool); const QMetaObject* selfMeta = this->metaObject(); - if (property.hasNotifySignal()) - { - QMetaMethod checkedSlot = selfMeta->method(selfMeta->indexOfSlot( "setChecked(bool)" )); - connect( model, property.notifySignal(), this, checkedSlot ); - connect( this, &BooleanPropertyAction::toggled, this, &BooleanPropertyAction::setModelChecked ); - setCheckable(true); - } - else - { - connect( this, &BooleanPropertyAction::triggered, this, &BooleanPropertyAction::setModelChecked ); - setCheckable(true); - } + + assert(property.hasNotifySignal()); + QMetaMethod checkedSlot = selfMeta->method(selfMeta->indexOfSlot( "setChecked(bool)" )); + connect( model, property.notifySignal(), this, checkedSlot ); + connect( this, &BooleanPropertyAction::triggered, this, &BooleanPropertyAction::setModelChecked ); + + setCheckable(true); + setChecked(property.read(model).toBool()); } void BooleanPropertyAction::setModelChecked(bool checked) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
