optimize delayed application data updating

--the previous code was updating the delayed application
data for each instance of lastactivewindow separately.
The new code is implementing this at the central
WM::WindowsTracker and just informs last active windows
to update their values
pull/9/head
Michail Vourlakos 5 years ago
parent 189fb00426
commit c1a6cfc325

@ -54,19 +54,9 @@ LastActiveWindow::LastActiveWindow(TrackedGeneralInfo *trackedInfo)
}
});
connect(m_windowsTracker, &Windows::applicationDataChanged, this, &LastActiveWindow::applicationDataChanged);
connect(m_windowsTracker, &Windows::windowChanged, this, &LastActiveWindow::windowChanged);
connect(m_windowsTracker, &Windows::windowRemoved, this, &LastActiveWindow::windowRemoved);
//! delayed application data
m_updateApplicationDataTimer.setInterval(1500);
m_updateApplicationDataTimer.setSingleShot(true);
connect(&m_updateApplicationDataTimer, &QTimer::timeout, this, [&]() {
if (m_delayedApplicationDataWid>=0 && m_delayedApplicationDataWid == m_winId && !m_initializedApplicationData.contains(m_winId)) {
setAppName(m_windowsTracker->appNameFor(m_winId, true));
m_delayedApplicationDataWid = -1;
m_initializedApplicationData.append(m_winId);
}
});
}
LastActiveWindow::~LastActiveWindow()
@ -326,14 +316,6 @@ void LastActiveWindow::setInformation(const WindowInfoWrap &info)
if (firstActiveness) {
updateColorScheme();
//delayed application data
m_updateApplicationDataTimer.stop();
if (!m_initializedApplicationData.contains(info.wid())) {
m_delayedApplicationDataWid = info.wid();
m_updateApplicationDataTimer.start();
}
}
if (info.appName().isEmpty()) {
@ -350,6 +332,13 @@ void LastActiveWindow::setInformation(const WindowInfoWrap &info)
}
//! PRIVATE SLOTS
void LastActiveWindow::applicationDataChanged(const WindowId &wid)
{
setAppName(m_windowsTracker->appNameFor(wid));
setIcon(m_windowsTracker->iconFor(wid));
}
void LastActiveWindow::windowChanged(const WindowId &wid)
{
if (!m_trackedInfo->enabled()) {
@ -399,10 +388,6 @@ void LastActiveWindow::windowChanged(const WindowId &wid)
void LastActiveWindow::windowRemoved(const WindowId &wid)
{
if (m_initializedApplicationData.contains(wid)) {
m_initializedApplicationData.removeAll(wid);
}
if (m_history.contains(wid)) {
bool firstItemRemoved{false};

@ -27,7 +27,6 @@
// Qt
#include <QObject>
#include <QRect>
#include <QTimer>
namespace Latte {
class View;
@ -105,6 +104,8 @@ public slots:
void requestMove(Latte::View *fromView, int localX, int localY);
private slots:
void applicationDataChanged(const WindowId &wid);
void windowChanged(const WindowId &wid);
void windowRemoved(const WindowId &wid);
@ -175,13 +176,6 @@ private:
QList<WindowId> m_history;
//! Some applications delay their application name/icon identification
//! such as Libreoffice that updates its StartupWMClass after
//! its startup
QTimer m_updateApplicationDataTimer;
QList<WindowId> m_initializedApplicationData;
WindowId m_delayedApplicationDataWid{-1};
TrackedGeneralInfo *m_trackedInfo{nullptr};
AbstractWindowInterface *m_wm{nullptr};
Tracker::Windows *m_windowsTracker{nullptr};

@ -47,6 +47,11 @@ Windows::Windows(AbstractWindowInterface *parent)
connect(&m_extraViewHintsTimer, &QTimer::timeout, this, &Windows::updateExtraViewHints);
//! delayed application data
m_updateApplicationDataTimer.setInterval(1500);
m_updateApplicationDataTimer.setSingleShot(true);
connect(&m_updateApplicationDataTimer, &QTimer::timeout, this, &Windows::updateApplicationData);
init();
}
@ -82,6 +87,11 @@ void Windows::init()
connect(m_wm, &AbstractWindowInterface::windowRemoved, this, [&](WindowId wid) {
m_windows.remove(wid);
//! application data
m_initializedApplicationData.removeAll(wid);
m_delayedApplicationData.removeAll(wid);
updateAllHints();
emit windowRemoved(wid);
@ -583,22 +593,56 @@ QIcon Windows::iconFor(const WindowId &wid)
return m_windows[wid].icon();
}
QString Windows::appNameFor(const WindowId &wid, bool forceUpdate)
QString Windows::appNameFor(const WindowId &wid)
{
if (!m_windows.contains(wid)) {
return QString();
}
if (m_windows[wid].appName().isEmpty() || forceUpdate) {
if(!m_initializedApplicationData.contains(wid) && !m_delayedApplicationData.contains(wid)) {
m_delayedApplicationData.append(wid);
m_updateApplicationDataTimer.start();
}
if (m_windows[wid].appName().isEmpty()) {
AppData data = m_wm->appDataFor(wid);
m_windows[wid].setAppName(data.name);
return data.name;
}
return m_windows[wid].appName();
}
void Windows::updateApplicationData()
{
if (m_delayedApplicationData.count() > 0) {
for(int i=0; i<m_delayedApplicationData.count(); ++i) {
auto wid = m_delayedApplicationData[i];
if (m_windows.contains(wid)) {
AppData data = m_wm->appDataFor(wid);
QIcon icon = data.icon;
if (icon.isNull()) {
icon = m_wm->iconFor(wid);
}
m_windows[wid].setIcon(icon);
m_windows[wid].setAppName(data.name);
m_initializedApplicationData.append(wid);
emit applicationDataChanged(wid);
}
}
}
m_delayedApplicationData.clear();
}
WindowInfoWrap Windows::infoFor(const WindowId &wid) const
{
if (!m_windows.contains(wid)) {

@ -85,7 +85,7 @@ public:
//! Windows management
bool isValidFor(const WindowId &wid) const;
QIcon iconFor(const WindowId &wid);
QString appNameFor(const WindowId &wid, bool forceUpdate = false);
QString appNameFor(const WindowId &wid);
WindowInfoWrap infoFor(const WindowId &wid) const;
void setPlasmaDesktop(WindowId wid);
@ -119,11 +119,14 @@ signals:
void windowChanged(const WindowId &wid);
void windowRemoved(const WindowId &wid);
void applicationDataChanged(const WindowId &wid);
private slots:
void updateAvailableScreenGeometries();
void addRelevantLayout(Latte::View *view);
void updateApplicationData();
void updateRelevantLayouts();
void updateExtraViewHints();
@ -173,6 +176,13 @@ private:
QHash<Latte::Layout::GenericLayout *, TrackedLayoutInfo *> m_layouts;
QMap<WindowId, WindowInfoWrap> m_windows;
//! Some applications delay their application name/icon identification
//! such as Libreoffice that updates its StartupWMClass after
//! its startup
QTimer m_updateApplicationDataTimer;
QList<WindowId> m_delayedApplicationData;
QList<WindowId> m_initializedApplicationData;
};
}

Loading…
Cancel
Save