mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
feet(plugins): lazy loading of plugins which depends dbus daemon
Change-Id: I34b2d2d34d8751b4eb54eb49448bbae882e5fd66
This commit is contained in:
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
@ -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();
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -1,3 +1,4 @@
|
||||
{
|
||||
"api": "1.0"
|
||||
"api": "1.0",
|
||||
"depends-daemon-dbus-service": "com.deepin.daemon.Network"
|
||||
}
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
@ -1,3 +1,4 @@
|
||||
{
|
||||
"api": "1.0"
|
||||
"api": "1.0",
|
||||
"depends-daemon-dbus-service": "com.deepin.daemon.Power"
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -1,3 +1,4 @@
|
||||
{
|
||||
"api": "1.0"
|
||||
"api": "1.0",
|
||||
"depends-daemon-dbus-service": "com.deepin.daemon.Audio"
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -52,7 +52,6 @@ private slots:
|
||||
void volumeSliderValueChanged();
|
||||
void sinkInputsChanged();
|
||||
void toggleMute();
|
||||
void delayLoad();
|
||||
void onPlaySoundEffect();
|
||||
|
||||
private:
|
||||
|
@ -1,3 +1,4 @@
|
||||
{
|
||||
"api": "1.0"
|
||||
"api": "1.0",
|
||||
"depends-daemon-dbus-service": "com.deepin.dde.TrayManager"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user