feet(plugins): lazy loading of plugins which depends dbus daemon

Change-Id: I34b2d2d34d8751b4eb54eb49448bbae882e5fd66
This commit is contained in:
listenerri 2018-07-31 23:03:37 +08:00
parent 081522f02c
commit 95b5c72f13
Notes: gerrit 2018-08-03 14:05:54 +08:00
Verified+1: <jenkins@deepin.com>
Code-Review+2: hualet <mr.asianwang@gmail.com>
Submitted-by: listenerri <listenerri@gmail.com>
Submitted-at: Fri, 03 Aug 2018 14:05:53 +0800
Reviewed-on: https://cr.deepin.io/37292
Project: dde/dde-dock
Branch: refs/heads/master
13 changed files with 89 additions and 62 deletions

View File

@ -31,6 +31,7 @@
DockPluginsController::DockPluginsController(DockItemController *itemControllerInter)
: QObject(itemControllerInter),
m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()),
m_itemControllerInter(itemControllerInter)
{
qApp->installEventFilter(this);
@ -156,6 +157,26 @@ void DockPluginsController::loadPlugin(const QString &pluginFile)
}
m_pluginList.insert(interface, QMap<QString, PluginsItem *>());
QString dbusService = meta.value("depends-daemon-dbus-service").toString();
if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) {
qDebug() << dbusService << "daemon has not started, waiting for signal";
connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this,
[=](const QString &name, const QString &oldOwner, const QString &newOwner) {
if (name == dbusService && !newOwner.isEmpty()) {
qDebug() << dbusService << "daemon started, init plugin and disconnect";
initPlugin(interface);
disconnect(m_dbusDaemonInterface);
}
}
);
return;
}
initPlugin(interface);
}
void DockPluginsController::initPlugin(PluginsItemInterface *interface) {
qDebug() << "init plugin: " << interface->pluginName();
interface->init(this);
qDebug() << "init plugin finished: " << interface->pluginName();

View File

@ -56,12 +56,14 @@ private slots:
void displayModeChanged();
void positionChanged();
void loadPlugin(const QString &pluginFile);
void initPlugin(PluginsItemInterface *interface);
private:
bool eventFilter(QObject *o, QEvent *e);
PluginsItem *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const;
private:
QDBusConnectionInterface *m_dbusDaemonInterface;
QMap<PluginsItemInterface *, QMap<QString, PluginsItem *>> m_pluginList;
DockItemController *m_itemControllerInter;
};

View File

@ -1,3 +1,4 @@
{
"api": "1.0"
"api": "1.0",
"depends-daemon-dbus-service": "com.deepin.daemon.Network"
}

View File

@ -34,7 +34,8 @@ NetworkPlugin::NetworkPlugin(QObject *parent)
m_networkModel(nullptr),
m_networkWorker(nullptr),
m_settings("deepin", "dde-dock-network")
m_settings("deepin", "dde-dock-network"),
m_pluginLoaded(false)
{
}
@ -52,15 +53,9 @@ void NetworkPlugin::init(PluginProxyInterface *proxyInter)
{
m_proxyInter = proxyInter;
m_networkModel = new NetworkModel;
m_networkWorker = new NetworkWorker(m_networkModel);
connect(m_networkModel, &NetworkModel::deviceListChanged, this, &NetworkPlugin::onDeviceListChanged);
m_networkModel->moveToThread(qApp->thread());
m_networkWorker->moveToThread(qApp->thread());
onDeviceListChanged(m_networkModel->devices());
if (!pluginIsDisable()) {
loadPlugin();
}
}
void NetworkPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked)
@ -243,6 +238,25 @@ DeviceItem *NetworkPlugin::itemByPath(const QString &path)
return nullptr;
}
void NetworkPlugin::loadPlugin()
{
if (m_pluginLoaded) {
qDebug() << "network plugin has been loaded! return";
return;
}
m_pluginLoaded = true;
m_networkModel = new NetworkModel;
m_networkWorker = new NetworkWorker(m_networkModel);
connect(m_networkModel, &NetworkModel::deviceListChanged, this, &NetworkPlugin::onDeviceListChanged);
m_networkModel->moveToThread(qApp->thread());
m_networkWorker->moveToThread(qApp->thread());
onDeviceListChanged(m_networkModel->devices());
}
void NetworkPlugin::contextMenuRequested()
{

View File

@ -61,6 +61,7 @@ private slots:
private:
DeviceItem *itemByPath(const QString &path);
void loadPlugin();
private:
dde::network::NetworkModel *m_networkModel;
@ -68,6 +69,8 @@ private:
QMap<QString, DeviceItem *> m_itemsMap;
QSettings m_settings;
bool m_pluginLoaded;
};
#endif // NETWORKPLUGIN_H

View File

@ -9,12 +9,15 @@ file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp")
find_package(PkgConfig REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Svg REQUIRED)
find_package(Qt5DBus REQUIRED)
find_package(DtkWidget REQUIRED)
add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN")
add_library(${PLUGIN_NAME} SHARED ${SRCS} resources.qrc)
set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../)
target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS} ../../interfaces)
target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS}
${Qt5DBus_INCLUDE_DIRS}
../../interfaces)
target_link_libraries(${PLUGIN_NAME} PRIVATE
${DtkWidget_LIBRARIES}
${Qt5Widgets_LIBRARIES}

View File

@ -1,3 +1,4 @@
{
"api": "1.0"
"api": "1.0",
"depends-daemon-dbus-service": "com.deepin.daemon.Power"
}

View File

@ -30,19 +30,12 @@
ShutdownPlugin::ShutdownPlugin(QObject *parent)
: QObject(parent),
m_pluginLoaded(false),
m_settings("deepin", "dde-dock-power"),
m_shutdownWidget(new PluginWidget),
m_powerStatusWidget(new PowerStatusWidget),
m_tipsLabel(new TipsWidget),
m_powerInter(new DBusPower(this))
m_tipsLabel(new TipsWidget)
{
m_tipsLabel->setVisible(false);
m_tipsLabel->setObjectName("power");
connect(m_powerInter, &DBusPower::BatteryPercentageChanged, this, &ShutdownPlugin::updateBatteryVisible);
connect(m_shutdownWidget, &PluginWidget::requestContextMenu, this, &ShutdownPlugin::requestContextMenu);
connect(m_powerStatusWidget, &PowerStatusWidget::requestContextMenu, this, &ShutdownPlugin::requestContextMenu);
}
const QString ShutdownPlugin::pluginName() const
@ -98,8 +91,9 @@ void ShutdownPlugin::init(PluginProxyInterface *proxyInter)
{
m_proxyInter = proxyInter;
if (!pluginIsDisable())
delayLoader();
if (!pluginIsDisable()) {
loadPlugin();
}
}
void ShutdownPlugin::pluginStateSwitched()
@ -252,22 +246,23 @@ void ShutdownPlugin::requestContextMenu(const QString &itemKey)
m_proxyInter->requestContextMenu(this, itemKey);
}
void ShutdownPlugin::delayLoader()
void ShutdownPlugin::loadPlugin()
{
static int retryTimes = 0;
++retryTimes;
if (m_powerInter->isValid() || retryTimes > 10)
{
qDebug() << "load power item, dbus valid:" << m_powerInter->isValid();
m_proxyInter->itemAdded(this, SHUTDOWN_KEY);
displayModeChanged(displayMode());
} else {
qDebug() << "load power failed, wait and retry" << retryTimes;
// wait and retry
QTimer::singleShot(1000, this, &ShutdownPlugin::delayLoader);
if (m_pluginLoaded) {
qDebug() << "power plugin has been loaded! return";
return;
}
m_pluginLoaded = true;
m_shutdownWidget = new PluginWidget;
m_powerStatusWidget = new PowerStatusWidget;
m_powerInter = new DBusPower(this);
connect(m_powerInter, &DBusPower::BatteryPercentageChanged, this, &ShutdownPlugin::updateBatteryVisible);
connect(m_shutdownWidget, &PluginWidget::requestContextMenu, this, &ShutdownPlugin::requestContextMenu);
connect(m_powerStatusWidget, &PowerStatusWidget::requestContextMenu, this, &ShutdownPlugin::requestContextMenu);
m_proxyInter->itemAdded(this, SHUTDOWN_KEY);
displayModeChanged(displayMode());
}

View File

@ -63,10 +63,12 @@ public:
private:
void updateBatteryVisible();
void requestContextMenu(const QString &itemKey);
void delayLoader();
void loadPlugin();
private:
bool m_pluginLoaded;
QSettings m_settings;
PluginWidget *m_shutdownWidget;
PowerStatusWidget *m_powerStatusWidget;
TipsWidget *m_tipsLabel;

View File

@ -1,3 +1,4 @@
{
"api": "1.0"
"api": "1.0",
"depends-daemon-dbus-service": "com.deepin.daemon.Audio"
}

View File

@ -115,7 +115,8 @@ SoundApplet::SoundApplet(QWidget *parent)
connect(m_audioInter, &DBusAudio::DefaultSinkChanged, this, static_cast<void (SoundApplet::*)()>(&SoundApplet::defaultSinkChanged));
connect(this, static_cast<void (SoundApplet::*)(DBusSink*) const>(&SoundApplet::defaultSinkChanged), this, &SoundApplet::onVolumeChanged);
QTimer::singleShot(1, this, &SoundApplet::delayLoad);
QMetaObject::invokeMethod(this, "defaultSinkChanged", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "sinkInputsChanged", Qt::QueuedConnection);
}
int SoundApplet::volumeValue() const
@ -202,23 +203,6 @@ void SoundApplet::toggleMute()
m_defSinkInter->SetMuteQueued(!m_defSinkInter->mute());
}
void SoundApplet::delayLoad()
{
static int retry_times = 0;
++retry_times;
const bool valid = m_audioInter->isValid();
qDebug() << "load sound dbus, valid = " << valid << ", retry = " << retry_times;
if (valid || retry_times > 10)
{
QMetaObject::invokeMethod(this, "defaultSinkChanged", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "sinkInputsChanged", Qt::QueuedConnection);
} else {
QTimer::singleShot(1000, this, &SoundApplet::delayLoad);
}
}
void SoundApplet::onPlaySoundEffect()
{
// set the mute property to false to play sound effects.

View File

@ -52,7 +52,6 @@ private slots:
void volumeSliderValueChanged();
void sinkInputsChanged();
void toggleMute();
void delayLoad();
void onPlaySoundEffect();
private:

View File

@ -1,3 +1,4 @@
{
"api": "1.0"
"api": "1.0",
"depends-daemon-dbus-service": "com.deepin.dde.TrayManager"
}