Currently from David Edmundson comment on https://phabricator.kde.org/D27384
- KCModule::showEvent()
this queues up a load and queues up a KCModule::changed(false)
- during load ConfigModule::setNeedsSave(true) is called we set d->_needsSave to true
- we emit ConfigModule::changed(true) which we proxy through to KCModule::changed(true)
- we then process the queued KCModule::setChanged(false) from the earlier KCModule::showEvent
- so we disable the button
- any subsequent changes in the KCM will call ConfigModule::setNeedsSave(true)