mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
fix: 修复反复插拔显示器导致的崩溃现象
QScreen指针变为野指针导致,因为QDesktopWidget的screenCountChanged信号发出来的较慢,导致使用了已经销毁的QScreen指针,换成QGuiApplication的screenAdded和screenRemoved信号,从代码流程上来说,一但屏幕有变化,这两个信号就会理科发送,明显更安全 Log: 修复反复插拔显示器导致的崩溃现象 Change-Id: Ia97bad2dbf3ab45fe2cbb5b5b616bb09e887a012
This commit is contained in:
parent
5da0c3d4a3
commit
a38b9b5b1a
@ -35,7 +35,11 @@ DisplayManager::DisplayManager(QObject *parent)
|
|||||||
, m_onlyInPrimary(Utils::SettingValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", "onlyShowPrimary", false).toBool())
|
, m_onlyInPrimary(Utils::SettingValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", "onlyShowPrimary", false).toBool())
|
||||||
{
|
{
|
||||||
connect(qApp, &QApplication::primaryScreenChanged, this, &DisplayManager::primaryScreenChanged);
|
connect(qApp, &QApplication::primaryScreenChanged, this, &DisplayManager::primaryScreenChanged);
|
||||||
connect(QApplication::desktop(), &QDesktopWidget::screenCountChanged, this, &DisplayManager::screenCountChanged);
|
connect(qApp, &QGuiApplication::screenAdded, this, &DisplayManager::screenCountChanged);
|
||||||
|
connect(qApp, &QGuiApplication::screenRemoved, this, &DisplayManager::screenCountChanged);
|
||||||
|
//Note: 如果只关联QDesktopWidget::screenCountChanged信号,反复插拔显示器,概率性崩溃,是因为m_screens里面的指针部分还没来得及remove就被销毁了,导致野指针
|
||||||
|
// screenCountChanged信号不是立刻发送的,源码里面可以看到所在函数是队列连接的形式,即通过qApp->screens()拿到的的数据已经变了,这个信号仍然未发送
|
||||||
|
// connect(QApplication::desktop(), &QDesktopWidget::screenCountChanged, this, &DisplayManager::screenCountChanged);
|
||||||
connect(m_delayTimer, &QTimer::timeout, this, [ = ] {
|
connect(m_delayTimer, &QTimer::timeout, this, [ = ] {
|
||||||
updateScreenDockInfo();
|
updateScreenDockInfo();
|
||||||
|
|
||||||
@ -251,6 +255,7 @@ void DisplayManager::updateScreenDockInfo()
|
|||||||
*/
|
*/
|
||||||
void DisplayManager::screenCountChanged()
|
void DisplayManager::screenCountChanged()
|
||||||
{
|
{
|
||||||
|
qDebug() << __FUNCTION__;
|
||||||
// 找到过期的screen指针
|
// 找到过期的screen指针
|
||||||
QList<QScreen *> to_remove_list;
|
QList<QScreen *> to_remove_list;
|
||||||
for (auto s : m_screens) {
|
for (auto s : m_screens) {
|
||||||
@ -287,6 +292,8 @@ void DisplayManager::screenCountChanged()
|
|||||||
m_screens.append(s);
|
m_screens.append(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug() << "屏幕数量" << m_screens.count();
|
||||||
|
|
||||||
// 屏幕数量发生变化,应该刷新一下任务栏的显示
|
// 屏幕数量发生变化,应该刷新一下任务栏的显示
|
||||||
m_delayTimer->start();
|
m_delayTimer->start();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user