forked from openkylin/ukui-panel
perf(task-manager):优化窗口更新信号处理机制
This commit is contained in:
parent
d9e8959455
commit
900c9adf4a
|
@ -32,32 +32,32 @@
|
|||
<context>
|
||||
<name>TaskManager::UkuiTaskManager</name>
|
||||
<message>
|
||||
<location filename="ukui-task-manager.cpp" line="511"/>
|
||||
<location filename="ukui-task-manager.cpp" line="586"/>
|
||||
<source>Close</source>
|
||||
<translation>关闭</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="ukui-task-manager.cpp" line="515"/>
|
||||
<location filename="ukui-task-manager.cpp" line="590"/>
|
||||
<source>Restore</source>
|
||||
<translation>还原</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="ukui-task-manager.cpp" line="522"/>
|
||||
<location filename="ukui-task-manager.cpp" line="597"/>
|
||||
<source>Maximize</source>
|
||||
<translation>最大化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="ukui-task-manager.cpp" line="529"/>
|
||||
<location filename="ukui-task-manager.cpp" line="604"/>
|
||||
<source>Minimize</source>
|
||||
<translation>最小化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="ukui-task-manager.cpp" line="536"/>
|
||||
<location filename="ukui-task-manager.cpp" line="611"/>
|
||||
<source>Keep above</source>
|
||||
<translation>置顶</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="ukui-task-manager.cpp" line="542"/>
|
||||
<location filename="ukui-task-manager.cpp" line="617"/>
|
||||
<source>Unset keep above</source>
|
||||
<translation>取消置顶</translation>
|
||||
</message>
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
d->m_winIDsOnCurrentDesktop.clear();
|
||||
|
|
|
@ -47,6 +47,11 @@ public:
|
|||
void addWinID(const QString &winID);
|
||||
void removeWinID(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;
|
||||
void setGroup(const QString &group);
|
||||
bool hasLauncher() const;
|
||||
|
|
|
@ -56,9 +56,13 @@ public:
|
|||
explicit Private(UkuiTaskManager *q = nullptr);
|
||||
~Private();
|
||||
|
||||
void onWindowAdded(const QString &windowId);
|
||||
void onWindowRemoved(const QString &windowId);
|
||||
void onWindowChanged(const QString& windowId);
|
||||
void windowAdded(const QString &windowId);
|
||||
void windowRemoved(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 save() const;
|
||||
void loadWindows();
|
||||
|
@ -118,7 +122,7 @@ void UkuiTaskManager::Private::loadSettings()
|
|||
m_settings->endGroup();
|
||||
}
|
||||
|
||||
void UkuiTaskManager::Private::onWindowAdded(const QString &windowId)
|
||||
void UkuiTaskManager::Private::windowAdded(const QString &windowId)
|
||||
{
|
||||
//过滤不需要显示的窗口
|
||||
if(WindowManager::skipTaskBar(windowId)) {
|
||||
|
@ -142,7 +146,7 @@ void UkuiTaskManager::Private::onWindowAdded(const QString &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) {
|
||||
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);
|
||||
QString windowGroup = WindowManager::windowGroup(windowId);
|
||||
|
@ -173,8 +213,6 @@ void UkuiTaskManager::Private::onWindowChanged(const QString &windowId)
|
|||
delete m_items.takeAt(index);
|
||||
q->endRemoveRows();
|
||||
}
|
||||
} else {
|
||||
item->windowChanged(windowId);
|
||||
}
|
||||
handled = true;
|
||||
break;
|
||||
|
@ -194,7 +232,7 @@ void UkuiTaskManager::Private::onWindowChanged(const QString &windowId)
|
|||
void UkuiTaskManager::Private::loadWindows()
|
||||
{
|
||||
for (const QString &winID: WindowManager::windows()) {
|
||||
onWindowAdded(winID);
|
||||
windowAdded(winID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -280,25 +318,28 @@ UkuiTaskManager::UkuiTaskManager(QObject *parent) : QAbstractListModel(parent),
|
|||
//加载当前打开的窗口
|
||||
d->loadWindows();
|
||||
connect(WindowManager::self(), &WindowManager::windowAdded, this, [&](const QString &winId) {
|
||||
d->onWindowAdded(winId);
|
||||
d->windowAdded(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) {
|
||||
d->onWindowChanged(winId);
|
||||
d->titleChanged(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) {
|
||||
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) {
|
||||
d->onWindowChanged(winId);
|
||||
d->demandsAttentionChanged(winId);
|
||||
});
|
||||
connect(WindowManager::self(), &WindowManager::skipTaskbarChanged, this, [&](const QString &winId) {
|
||||
d->onWindowChanged(winId);
|
||||
d->skipTaskbarChanged(winId);
|
||||
});
|
||||
auto conn = QDBusConnection::sessionBus();
|
||||
d->m_watcher = new QDBusServiceWatcher(QStringLiteral("org.freedesktop.Notifications"),
|
||||
|
|
|
@ -64,6 +64,7 @@ WindowManager::WindowManager(QObject *parent) : QObject(parent)
|
|||
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::iconChanged, this, &WindowManager::iconChanged);
|
||||
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::skipTaskbarChanged, this, &WindowManager::skipTaskbarChanged);
|
||||
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::onAllDesktopsChanged, this, &WindowManager::onAllDesktopsChanged);
|
||||
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::windowDesktopChanged, this, &WindowManager::windowDesktopChanged);
|
||||
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::demandsAttentionChanged, this, &WindowManager::demandsAttentionChanged);
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ Q_SIGNALS:
|
|||
void iconChanged(QString wid);
|
||||
void skipTaskbarChanged(QString wid);
|
||||
void onAllDesktopsChanged(QString wid);
|
||||
void windowDesktopChanged(QString wid);
|
||||
void demandsAttentionChanged(QString wid);
|
||||
private:
|
||||
WindowManager(QObject *parent = nullptr);
|
||||
|
|
Loading…
Reference in New Issue