Skip to content

Commit 23b7cd2

Browse files
committed
refactor: move XSettings operations to dedicated thread
Previously SettingManager was moved to a separate QThread in Helper, but QThread lifecycle management was error-prone. This commit moves thread creation and management into SettingManager itself, using QMetaObject::invokeMethod for all XSettings/XResource operations to ensure thread safety. Log: Tasks: Influence: XSettings operations now run on a dedicated thread managed by SettingManager, avoiding potential crashes from improper QThread destruction.
1 parent b55f2bd commit 23b7cd2

4 files changed

Lines changed: 443 additions & 58 deletions

File tree

src/seat/helper.cpp

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,6 @@ Session::~Session()
187187
qCDebug(treelandCore) << "Deleting session for uid:" << uid << socket;
188188
Q_EMIT aboutToBeDestroyed();
189189

190-
if (settingManagerThread) {
191-
settingManagerThread->quit();
192-
settingManagerThread->wait(QDeadlineTimer(25000));
193-
}
194-
195190
if (settingManager) {
196191
delete settingManager;
197192
settingManager = nullptr;
@@ -2325,29 +2320,17 @@ std::shared_ptr<Session> Helper::ensureSession(int id, QString username)
23252320
qCWarning(treelandInput) << "Failed to intern atom:" << _DEEPIN_NO_TITLEBAR;
23262321
}
23272322
session->settingManager = new SettingManager(session->xwayland->xcbConnection());
2328-
// TODO: proper destruction of QThread. relying on the QObject tree is crashy.
2329-
// We are moving session management out of Helper anyways, will fix later.
2330-
session->settingManagerThread = new QThread(session->xwayland);
2331-
2332-
session->settingManager->moveToThread(session->settingManagerThread);
2333-
connect(session->settingManagerThread, &QThread::started, this, [this, session]{
2334-
const qreal scale = m_rootSurfaceContainer->window()->effectiveDevicePixelRatio();
2335-
QMetaObject::invokeMethod(session->settingManager, [session, scale]() {
2336-
session->settingManager->setGlobalScale(scale);
2337-
session->settingManager->apply();
2338-
}, Qt::QueuedConnection);
2339-
2340-
QObject::connect(Helper::instance()->window(),
2341-
&WOutputRenderWindow::effectiveDevicePixelRatioChanged,
2342-
session->settingManager,
2343-
[session](qreal dpr) {
2344-
session->settingManager->setGlobalScale(dpr);
2345-
session->settingManager->apply();
2346-
}, Qt::QueuedConnection);
2347-
});
2348-
2349-
connect(session->settingManagerThread, &QThread::finished, session->settingManagerThread, &QThread::deleteLater);
2350-
session->settingManagerThread->start();
2323+
const qreal scale = m_rootSurfaceContainer->window()->effectiveDevicePixelRatio();
2324+
session->settingManager->setGlobalScale(scale);
2325+
session->settingManager->apply();
2326+
2327+
QObject::connect(Helper::instance()->window(),
2328+
&WOutputRenderWindow::effectiveDevicePixelRatioChanged,
2329+
session->settingManager,
2330+
[session](qreal dpr) {
2331+
session->settingManager->setGlobalScale(dpr);
2332+
session->settingManager->apply();
2333+
}, Qt::QueuedConnection);
23512334
}
23522335
});
23532336
return xwayland;

src/seat/helper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ struct Session : QObject {
134134
WXWayland *xwayland = nullptr;
135135
quint32 noTitlebarAtom = XCB_ATOM_NONE;
136136
SettingManager *settingManager = nullptr;
137-
QThread *settingManagerThread = nullptr;
138137

139138
~Session();
140139

0 commit comments

Comments
 (0)