[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kscreen/sebas/osd] kded: clean up and improve osd code
From: Sebastian_Kügler <sebas () kde ! org>
Date: 2016-12-02 11:10:28
Message-ID: E1cCljY-0006KE-0o () code ! kde ! org
[Download RAW message or body]
Git commit 869252cd03818670d3150c118f8edfe40550d2c8 by Sebastian Kügler.
Committed on 16/10/2016 at 22:12.
Pushed by sebas into branch 'sebas/osd'.
clean up and improve osd code
M +29 -86 kded/osd.cpp
M +7 -19 kded/osd.h
M +10 -14 kded/osdmanager.cpp
M +4 -4 kded/osdmanager.h
https://commits.kde.org/kscreen/869252cd03818670d3150c118f8edfe40550d2c8
diff --git a/kded/osd.cpp b/kded/osd.cpp
index 6e3e3bc..7ad0fa8 100644
--- a/kded/osd.cpp
+++ b/kded/osd.cpp
@@ -22,14 +22,13 @@
#include <KScreen/Mode>
-#include <QDBusConnection>
#include <QLoggingCategory>
#include <QTimer>
-#include <QWindow>
+// #include <QWindow>
#include <QStandardPaths>
#include <QDebug>
-#include <QUrl>
-#include <QQuickItem>
+// #include <QUrl>
+// #include <QQuickItem>
#include <KDeclarative/QmlObject>
namespace KScreen {
@@ -37,25 +36,35 @@ namespace KScreen {
Osd::Osd(QObject *parent)
: QObject(parent)
, m_osdPath(QStandardPaths::locate(QStandardPaths::QStandardPaths::GenericDataLocation, \
QStringLiteral("kded_kscreen/qml/Osd.qml"))) + , m_osdObject(new \
KDeclarative::QmlObject(this)) {
- init();
-}
+ if (m_osdPath.isEmpty()) {
+ qWarning() << "Failed to find OSD QML file" << m_osdPath;
+ }
-Osd::~Osd()
-{
+ m_osdObject->setSource(QUrl::fromLocalFile(m_osdPath));
+
+ if (m_osdObject->status() != QQmlComponent::Ready) {
+ qWarning() << "Failed to load OSD QML file" << m_osdPath;
+ return;
+ }
+
+ m_timeout = m_osdObject->rootObject()->property("timeout").toInt();
+
+ if (!m_osdTimer) {
+ m_osdTimer = new QTimer(this);
+ m_osdTimer->setSingleShot(true);
+ connect(m_osdTimer, &QTimer::timeout, this, &Osd::hideOsd);
+ }
}
-bool Osd::setRootProperty(const char* name, const QVariant& value)
+Osd::~Osd()
{
- return m_osdObject->rootObject()->setProperty(name, value);
}
void Osd::showOutputIdentifier(const KScreen::OutputPtr output)
{
- m_output = output;
- if (!init()) {
- return;
- }
+ m_outputGeometry = output->geometry();
auto *rootObject = m_osdObject->rootObject();
auto mode = output->currentMode();
@@ -69,12 +78,13 @@ void Osd::showOutputIdentifier(const KScreen::OutputPtr output)
rootObject->setProperty("modeName", Utils::sizeToString(realSize));
rootObject->setProperty("outputName", Utils::outputName(output));
rootObject->setProperty("icon", \
QStringLiteral("preferences-desktop-display-randr")); + //QTimer::singleShot(200, \
this, &Osd::showOsd); showOsd();
}
void Osd::updatePosition()
{
- if (m_output == nullptr) {
+ if (!m_outputGeometry.isValid()) {
return;
}
@@ -82,82 +92,15 @@ void Osd::updatePosition()
const int dialogWidth = rootObject->property("width").toInt();
const int dialogHeight = rootObject->property("height").toInt();
- const int relx = m_output->pos().x();
- const int rely = m_output->pos().y();
- const int pos_x = relx + (m_output->geometry().width() - dialogWidth) / 2;
- const int pos_y = rely + (m_output->geometry().height() - dialogHeight) / 2;
+ const int relx = m_outputGeometry.x();
+ const int rely = m_outputGeometry.y();
+ const int pos_x = relx + (m_outputGeometry.width() - dialogWidth) / 2;
+ const int pos_y = rely + (m_outputGeometry.height() - dialogHeight) / 2;
rootObject->setProperty("x", pos_x);
rootObject->setProperty("y", pos_y);
}
-
-bool Osd::init()
-{
- if (m_osdObject && m_osdObject->rootObject()) {
- return true;
- }
-
- if (m_osdPath.isEmpty()) {
- return false;
- }
-
- if (!m_osdObject) {
- m_osdObject = new KDeclarative::QmlObject(this);
- }
-
- m_osdObject->setSource(QUrl::fromLocalFile(m_osdPath));
-
- if (m_osdObject->status() != QQmlComponent::Ready) {
- qWarning() << "Failed to load OSD QML file" << m_osdPath;
- return false;
- }
-
- m_timeout = m_osdObject->rootObject()->property("timeout").toInt();
-
- if (!m_osdTimer) {
- m_osdTimer = new QTimer(this);
- m_osdTimer->setSingleShot(true);
- connect(m_osdTimer, &QTimer::timeout, this, &Osd::hideOsd);
- }
-
- return true;
-}
-
-void Osd::showProgress(const QString &icon, const int percent, const QString \
&additionalText)
-{
- if (!init()) {
- return;
- }
-
- auto *rootObject = m_osdObject->rootObject();
-
- int value = qBound(0, percent, 100);
- rootObject->setProperty("osdValue", value);
- rootObject->setProperty("osdAdditionalText", additionalText);
- rootObject->setProperty("showingProgress", true);
- rootObject->setProperty("icon", icon);
-
- emit osdProgress(icon, value, additionalText);
- showOsd();
-}
-
-void Osd::showText(const QString &icon, const QString &text)
-{
- if (!init()) {
- return;
- }
-
- auto *rootObject = m_osdObject->rootObject();
-
- rootObject->setProperty("showingProgress", false);
- rootObject->setProperty("osdValue", text);
- rootObject->setProperty("icon", icon);
-
- emit osdText(icon, text);
- showOsd();
-}
-
void Osd::showOsd()
{
m_osdTimer->stop();
diff --git a/kded/osd.h b/kded/osd.h
index 449d251..b00f0be 100644
--- a/kded/osd.h
+++ b/kded/osd.h
@@ -17,60 +17,48 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#ifndef OSD_H
-#define OSD_H
+#ifndef KSCREEN_OSD_H
+#define KSCREEN_OSD_H
#include <QObject>
+#include <QRect>
#include <QString>
#include <KScreen/Output>
-class QmlObject;
namespace KDeclarative {
class QmlObject;
}
-namespace Plasma {
-}
class QTimer;
namespace KScreen {
class Osd : public QObject {
+
Q_OBJECT
public:
Osd(QObject *parent = nullptr);
~Osd() override;
- bool setRootProperty(const char *name, const QVariant &value);
void showOutputIdentifier(const KScreen::OutputPtr output);
-public Q_SLOTS:
- void showText(const QString &icon, const QString &text);
-
-Q_SIGNALS:
- void osdProgress(const QString &icon, const int percent, const QString \
&additionalText);
- void osdText(const QString &icon, const QString &text);
-
private Q_SLOTS:
void hideOsd();
private:
- bool init();
-
- void showProgress(const QString &icon, const int percent, const QString \
&additionalText = QString()); void showOsd();
-
void updatePosition();
+
QString m_osdPath;
+ QRect m_outputGeometry;
KDeclarative::QmlObject *m_osdObject = nullptr;
QTimer *m_osdTimer = nullptr;
int m_timeout = 0;
- KScreen::OutputPtr m_output;
};
} // ns
-#endif // OSD_H
+#endif // KSCREEN_OSD_H
diff --git a/kded/osdmanager.cpp b/kded/osdmanager.cpp
index c7adc52..70fee23 100644
--- a/kded/osdmanager.cpp
+++ b/kded/osdmanager.cpp
@@ -33,7 +33,16 @@ OsdManager* OsdManager::m_instance = 0;
OsdManager::OsdManager(QObject *parent)
: QObject(parent)
+ , m_cleanupTimer(new QTimer(this))
{
+ // free up memory when the osd hasn't been used for more than 1 minute
+ m_cleanupTimer->setInterval(60000);
+ m_cleanupTimer->setSingleShot(true);
+ connect(m_cleanupTimer, &QTimer::timeout, this, [this]() {
+ qDeleteAll(m_osds.begin(), m_osds.end());
+ m_osds.clear();
+ });
+ QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/kde/kscreen/osdService"), \
this, QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals); }
OsdManager::~OsdManager()
@@ -64,23 +73,9 @@ void OsdManager::slotIdentifyOutputs(KScreen::ConfigOperation *op)
const KScreen::ConfigPtr config = \
qobject_cast<KScreen::GetConfigOperation*>(op)->config();
Q_FOREACH (const KScreen::OutputPtr &output, config->outputs()) {
- connect(output.data(), &KScreen::Output::isConnectedChanged,
- this, [this](){
- KScreen::Output *output = \
qobject_cast<KScreen::Output*>(sender());
- qDebug() << "outputConnectedChanged():" << output->name();
- if (!output->isConnected() || !output->isEnabled() || \
!output->currentMode()) {
- KScreen::Osd* osd = nullptr;
- if (m_osds.keys().contains(output->name())) {
- osd->deleteLater();
- m_osds.remove(output->name());
- }
- }
- }, Qt::UniqueConnection);
-
if (!output->isConnected() || !output->isEnabled() || \
!output->currentMode()) { continue;
}
-
KScreen::Osd* osd = nullptr;
if (m_osds.keys().contains(output->name())) {
osd = m_osds.value(output->name());
@@ -90,6 +85,7 @@ void OsdManager::slotIdentifyOutputs(KScreen::ConfigOperation *op)
}
osd->showOutputIdentifier(output);
}
+ m_cleanupTimer->start();
}
diff --git a/kded/osdmanager.h b/kded/osdmanager.h
index 70d2400..38f8351 100644
--- a/kded/osdmanager.h
+++ b/kded/osdmanager.h
@@ -22,6 +22,7 @@
#include <QObject>
#include <QString>
#include <QMap>
+#include <QTimer>
class QmlObject;
@@ -34,22 +35,21 @@ class Output;
class OsdManager : public QObject {
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.kscreen.osdService")
+
public:
- OsdManager(QObject *parent = nullptr);
~OsdManager() override;
-
static OsdManager* self();
-
public Q_SLOTS:
void showOutputIdentifiers();
private:
+ OsdManager(QObject *parent = nullptr);
void slotIdentifyOutputs(KScreen::ConfigOperation *op);
QMap<QString, KScreen::Osd*> m_osds;
static OsdManager* m_instance;
- bool m_showing;
+ QTimer* m_cleanupTimer;
};
} // ns
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic