perf(task-manager):优化窗口更新信号处理机制

This commit is contained in:
iaom 2023-10-20 18:11:57 +08:00
parent d9e8959455
commit 900c9adf4a
6 changed files with 123 additions and 22 deletions

View File

@ -32,32 +32,32 @@
<context> <context>
<name>TaskManager::UkuiTaskManager</name> <name>TaskManager::UkuiTaskManager</name>
<message> <message>
<location filename="ukui-task-manager.cpp" line="511"/> <location filename="ukui-task-manager.cpp" line="586"/>
<source>Close</source> <source>Close</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="ukui-task-manager.cpp" line="515"/> <location filename="ukui-task-manager.cpp" line="590"/>
<source>Restore</source> <source>Restore</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="ukui-task-manager.cpp" line="522"/> <location filename="ukui-task-manager.cpp" line="597"/>
<source>Maximize</source> <source>Maximize</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="ukui-task-manager.cpp" line="529"/> <location filename="ukui-task-manager.cpp" line="604"/>
<source>Minimize</source> <source>Minimize</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="ukui-task-manager.cpp" line="536"/> <location filename="ukui-task-manager.cpp" line="611"/>
<source>Keep above</source> <source>Keep above</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="ukui-task-manager.cpp" line="542"/> <location filename="ukui-task-manager.cpp" line="617"/>
<source>Unset keep above</source> <source>Unset keep above</source>
<translation></translation> <translation></translation>
</message> </message>

View File

@ -319,6 +319,59 @@ void TaskManagerItem::windowChanged(const QString &winID)
} }
} }
void TaskManagerItem::iconChanged(const QString &windowId)
{
Q_UNUSED(windowId)
if(!hasLauncher()) {
d->m_icon = WindowManager::windowIcon(winIDs().at(0));
if(d->m_icon.isNull()) {
d->m_icon = d->m_xdf.icon();
}
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::Icon});
}
}
void TaskManagerItem::titleChanged(const QString &windowId)
{
Q_UNUSED(windowId)
if(!hasLauncher()) {
if (d->m_name.isEmpty()) {
d->m_name = WindowManager::windowTitle(winIDs().at(0));
}
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::Name});
}
}
void TaskManagerItem::desktopChanged(const QString &windowId)
{
if(currentDesktopWinIDs().contains(windowId)) {
if(!WindowManager::isOnAllDesktops(windowId) && !WindowManager::isOnCurrentDesktop(windowId)) {
d->m_winIDsOnCurrentDesktop.removeAll(windowId);
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::CurrentDesktopWinIDList});
}
} else {
if(WindowManager::isOnAllDesktops(windowId) || WindowManager::isOnCurrentDesktop(windowId)) {
d->m_winIDsOnCurrentDesktop.append(windowId);
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::CurrentDesktopWinIDList});
}
}
}
void TaskManagerItem::demandsAttentionChanged(const QString &windowId)
{
if(WindowManager::isDemandsAttention(windowId)) {
if(!d->m_demandsAttentionWinIDs.contains(windowId)) {
d->m_demandsAttentionWinIDs.append(windowId);
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::DemandsAttentionWinIDList});
}
} else {
if(d->m_demandsAttentionWinIDs.contains(windowId)) {
d->m_demandsAttentionWinIDs.removeAll(windowId);
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::DemandsAttentionWinIDList});
}
}
}
void TaskManagerItem::refreshWinIdsOnCurrentDesktop() void TaskManagerItem::refreshWinIdsOnCurrentDesktop()
{ {
d->m_winIDsOnCurrentDesktop.clear(); d->m_winIDsOnCurrentDesktop.clear();

View File

@ -47,6 +47,11 @@ public:
void addWinID(const QString &winID); void addWinID(const QString &winID);
void removeWinID(const QString &winID); void removeWinID(const QString &winID);
void windowChanged(const QString &winID); void windowChanged(const QString &winID);
void iconChanged(const QString& windowId);
void titleChanged(const QString& windowId);
void desktopChanged(const QString& windowId);
void demandsAttentionChanged(const QString& windowId);
const QString &group() const; const QString &group() const;
void setGroup(const QString &group); void setGroup(const QString &group);
bool hasLauncher() const; bool hasLauncher() const;

View File

@ -56,9 +56,13 @@ public:
explicit Private(UkuiTaskManager *q = nullptr); explicit Private(UkuiTaskManager *q = nullptr);
~Private(); ~Private();
void onWindowAdded(const QString &windowId); void windowAdded(const QString &windowId);
void onWindowRemoved(const QString &windowId); void windowRemoved(const QString &windowId);
void onWindowChanged(const QString& windowId); void iconChanged(const QString& windowId);
void titleChanged(const QString& windowId);
void desktopChanged(const QString& windowId);
void demandsAttentionChanged(const QString& windowId);
void skipTaskbarChanged(const QString& windowId);
void loadSettings(); void loadSettings();
void save() const; void save() const;
void loadWindows(); void loadWindows();
@ -118,7 +122,7 @@ void UkuiTaskManager::Private::loadSettings()
m_settings->endGroup(); m_settings->endGroup();
} }
void UkuiTaskManager::Private::onWindowAdded(const QString &windowId) void UkuiTaskManager::Private::windowAdded(const QString &windowId)
{ {
//过滤不需要显示的窗口 //过滤不需要显示的窗口
if(WindowManager::skipTaskBar(windowId)) { if(WindowManager::skipTaskBar(windowId)) {
@ -142,7 +146,7 @@ void UkuiTaskManager::Private::onWindowAdded(const QString &windowId)
newItem(windowId); newItem(windowId);
} }
void UkuiTaskManager::Private::onWindowRemoved(const QString &windowId) void UkuiTaskManager::Private::windowRemoved(const QString &windowId)
{ {
for (int index = 0; index < m_items.size(); ++index) { for (int index = 0; index < m_items.size(); ++index) {
auto item = m_items.at(index); auto item = m_items.at(index);
@ -158,7 +162,43 @@ void UkuiTaskManager::Private::onWindowRemoved(const QString &windowId)
} }
} }
void UkuiTaskManager::Private::onWindowChanged(const QString &windowId) void UkuiTaskManager::Private::iconChanged(const QString &windowId)
{
for(const auto item : m_items) {
if(item->winIDs().contains(windowId)) {
item->iconChanged(windowId);
}
}
}
void UkuiTaskManager::Private::titleChanged(const QString &windowId)
{
for(const auto item : m_items) {
if(item->winIDs().contains(windowId)) {
item->titleChanged(windowId);
}
}
}
void UkuiTaskManager::Private::desktopChanged(const QString &windowId)
{
for(const auto item : m_items) {
if(item->winIDs().contains(windowId)) {
item->desktopChanged(windowId);
}
}
}
void UkuiTaskManager::Private::demandsAttentionChanged(const QString &windowId)
{
for(const auto item : m_items) {
if(item->winIDs().contains(windowId)) {
item->demandsAttentionChanged(windowId);
}
}
}
void UkuiTaskManager::Private::skipTaskbarChanged(const QString &windowId)
{ {
bool skipTaskBar = WindowManager::skipTaskBar(windowId); bool skipTaskBar = WindowManager::skipTaskBar(windowId);
QString windowGroup = WindowManager::windowGroup(windowId); QString windowGroup = WindowManager::windowGroup(windowId);
@ -173,8 +213,6 @@ void UkuiTaskManager::Private::onWindowChanged(const QString &windowId)
delete m_items.takeAt(index); delete m_items.takeAt(index);
q->endRemoveRows(); q->endRemoveRows();
} }
} else {
item->windowChanged(windowId);
} }
handled = true; handled = true;
break; break;
@ -194,7 +232,7 @@ void UkuiTaskManager::Private::onWindowChanged(const QString &windowId)
void UkuiTaskManager::Private::loadWindows() void UkuiTaskManager::Private::loadWindows()
{ {
for (const QString &winID: WindowManager::windows()) { for (const QString &winID: WindowManager::windows()) {
onWindowAdded(winID); windowAdded(winID);
} }
} }
@ -280,25 +318,28 @@ UkuiTaskManager::UkuiTaskManager(QObject *parent) : QAbstractListModel(parent),
//加载当前打开的窗口 //加载当前打开的窗口
d->loadWindows(); d->loadWindows();
connect(WindowManager::self(), &WindowManager::windowAdded, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::windowAdded, this, [&](const QString &winId) {
d->onWindowAdded(winId); d->windowAdded(winId);
}); });
connect(WindowManager::self(), &WindowManager::windowRemoved, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::windowRemoved, this, [&](const QString &winId) {
d->onWindowRemoved(winId); d->windowRemoved(winId);
}); });
connect(WindowManager::self(), &WindowManager::titleChanged, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::titleChanged, this, [&](const QString &winId) {
d->onWindowChanged(winId); d->titleChanged(winId);
}); });
connect(WindowManager::self(), &WindowManager::iconChanged, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::iconChanged, this, [&](const QString &winId) {
d->onWindowChanged(winId); d->iconChanged(winId);
}); });
connect(WindowManager::self(), &WindowManager::onAllDesktopsChanged, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::onAllDesktopsChanged, this, [&](const QString &winId) {
d->onWindowChanged(winId); d->desktopChanged(winId);
});
connect(WindowManager::self(), &WindowManager::windowDesktopChanged, this, [&](const QString &winId) {
d->desktopChanged(winId);
}); });
connect(WindowManager::self(), &WindowManager::demandsAttentionChanged, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::demandsAttentionChanged, this, [&](const QString &winId) {
d->onWindowChanged(winId); d->demandsAttentionChanged(winId);
}); });
connect(WindowManager::self(), &WindowManager::skipTaskbarChanged, this, [&](const QString &winId) { connect(WindowManager::self(), &WindowManager::skipTaskbarChanged, this, [&](const QString &winId) {
d->onWindowChanged(winId); d->skipTaskbarChanged(winId);
}); });
auto conn = QDBusConnection::sessionBus(); auto conn = QDBusConnection::sessionBus();
d->m_watcher = new QDBusServiceWatcher(QStringLiteral("org.freedesktop.Notifications"), d->m_watcher = new QDBusServiceWatcher(QStringLiteral("org.freedesktop.Notifications"),

View File

@ -64,6 +64,7 @@ WindowManager::WindowManager(QObject *parent) : QObject(parent)
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::iconChanged, this, &WindowManager::iconChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::iconChanged, this, &WindowManager::iconChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::skipTaskbarChanged, this, &WindowManager::skipTaskbarChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::skipTaskbarChanged, this, &WindowManager::skipTaskbarChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::onAllDesktopsChanged, this, &WindowManager::onAllDesktopsChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::onAllDesktopsChanged, this, &WindowManager::onAllDesktopsChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::windowDesktopChanged, this, &WindowManager::windowDesktopChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::demandsAttentionChanged, this, &WindowManager::demandsAttentionChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::demandsAttentionChanged, this, &WindowManager::demandsAttentionChanged);
} }

View File

@ -64,6 +64,7 @@ Q_SIGNALS:
void iconChanged(QString wid); void iconChanged(QString wid);
void skipTaskbarChanged(QString wid); void skipTaskbarChanged(QString wid);
void onAllDesktopsChanged(QString wid); void onAllDesktopsChanged(QString wid);
void windowDesktopChanged(QString wid);
void demandsAttentionChanged(QString wid); void demandsAttentionChanged(QString wid);
private: private:
WindowManager(QObject *parent = nullptr); WindowManager(QObject *parent = nullptr);