diff --git a/orientation_sensor.cpp b/orientation_sensor.cpp index c78a3794f..ebb649ff8 100644 --- a/orientation_sensor.cpp +++ b/orientation_sensor.cpp @@ -1,153 +1,172 @@ /******************************************************************** KWin - the KDE window manager This file is part of the KDE project. Copyright (C) 2017 Martin Flöser This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #include "orientation_sensor.h" #include #include #include #include #include #include namespace KWin { OrientationSensor::OrientationSensor(QObject *parent) : QObject(parent) , m_sensor(new QOrientationSensor(this)) { connect(m_sensor, &QOrientationSensor::readingChanged, this, [this] { auto toOrientation = [] (auto reading) { switch (reading->orientation()) { case QOrientationReading::Undefined: return OrientationSensor::Orientation::Undefined; case QOrientationReading::TopUp: return OrientationSensor::Orientation::TopUp; case QOrientationReading::TopDown: return OrientationSensor::Orientation::TopDown; case QOrientationReading::LeftUp: return OrientationSensor::Orientation::LeftUp; case QOrientationReading::RightUp: return OrientationSensor::Orientation::RightUp; case QOrientationReading::FaceUp: return OrientationSensor::Orientation::FaceUp; case QOrientationReading::FaceDown: return OrientationSensor::Orientation::FaceDown; default: Q_UNREACHABLE(); } }; const auto orientation = toOrientation(m_sensor->reading()); if (m_orientation != orientation) { m_orientation = orientation; emit orientationChanged(); } } ); - connect(m_sensor, &QOrientationSensor::activeChanged, this, - [this] { - if (!m_sni) { - return; - } - if (m_sensor->isActive()) { - m_sni->setToolTipTitle(i18n("Automatic screen rotation is enabled")); - } else { - m_sni->setToolTipTitle(i18n("Automatic screen rotation is disabled")); - } + connect(m_sensor, &QOrientationSensor::activeChanged, this, &OrientationSensor::refresh); +} + +void OrientationSensor::refresh() +{ + if (!m_sni) { + return; + } + if (m_sensor->isActive()) { + m_sni->setTitle(i18n("Allow Rotation")); + m_sni->setToolTipTitle(i18n("Automatic screen rotation is enabled")); + } else { + QString text; + switch(m_orientation) { + case FaceUp: + case FaceDown: + case Undefined: + text = i18n("Undefined"); + break; + case TopUp: + case TopDown: + text = i18n("Vertical"); + break; + case LeftUp: + case RightUp: + text = i18n("Horizontal"); + break; } - ); + m_sni->setTitle(text); + m_sni->setToolTipTitle(i18n("Automatic screen rotation is disabled")); + } } OrientationSensor::~OrientationSensor() = default; void OrientationSensor::setEnabled(bool enabled) { if (m_enabled == enabled) { return; } m_enabled = enabled; if (m_enabled) { loadConfig(); setupStatusNotifier(); m_adaptor = new OrientationSensorAdaptor(this); } else { delete m_sni; m_sni = nullptr; delete m_adaptor; m_adaptor = nullptr; } startStopSensor(); } void OrientationSensor::loadConfig() { if (!m_config) { return; } m_userEnabled = m_config->group("OrientationSensor").readEntry("Enabled", true); } void OrientationSensor::setupStatusNotifier() { if (m_sni) { return; } m_sni = new KStatusNotifierItem(QStringLiteral("kwin-automatic-rotation"), this); m_sni->setStandardActionsEnabled(false); m_sni->setCategory(KStatusNotifierItem::Hardware); m_sni->setStatus(KStatusNotifierItem::Passive); - m_sni->setTitle(i18n("Automatic Screen Rotation")); // TODO: proper icon with state m_sni->setIconByName(QStringLiteral("preferences-desktop-display")); // we start disabled, it gets updated when the sensor becomes active - m_sni->setToolTipTitle(i18n("Automatic screen rotation is disabled")); + + refresh(); connect(m_sni, &KStatusNotifierItem::activateRequested, this, [this] { m_userEnabled = !m_userEnabled; startStopSensor(); emit userEnabledChanged(m_userEnabled); } ); } void OrientationSensor::startStopSensor() { if (m_enabled && m_userEnabled) { m_sensor->start(); } else { m_sensor->stop(); } } void OrientationSensor::setUserEnabled(bool enabled) { if (m_userEnabled == enabled) { return; } m_userEnabled = enabled; if (m_config) { m_config->group("OrientationSensor").writeEntry("Enabled", m_userEnabled); } emit userEnabledChanged(m_userEnabled); } } diff --git a/orientation_sensor.h b/orientation_sensor.h index 29b2ef703..2edba3212 100644 --- a/orientation_sensor.h +++ b/orientation_sensor.h @@ -1,91 +1,94 @@ /******************************************************************** KWin - the KDE window manager This file is part of the KDE project. Copyright (C) 2017 Martin Flöser This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #pragma once #include #include #include class QOrientationSensor; class OrientationSensorAdaptor; class KStatusNotifierItem; namespace KWin { class KWIN_EXPORT OrientationSensor : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.OrientationSensor") Q_PROPERTY(bool userEnabled READ isUserEnabled WRITE setUserEnabled NOTIFY userEnabledChanged) public: explicit OrientationSensor(QObject *parent = nullptr); ~OrientationSensor(); void setEnabled(bool enabled); /** * Just like QOrientationReading::Orientation, * copied to not leak the QSensors API into internal API. **/ enum class Orientation { Undefined, TopUp, TopDown, LeftUp, RightUp, FaceUp, FaceDown }; + Q_ENUM(Orientation) Orientation orientation() const { return m_orientation; } void setConfig(KSharedConfig::Ptr config) { m_config = config; } bool isUserEnabled() const { return m_userEnabled; } void setUserEnabled(bool enabled); Q_SIGNALS: void orientationChanged(); void userEnabledChanged(bool); private: void setupStatusNotifier(); void startStopSensor(); void loadConfig(); + void refresh(); + QOrientationSensor *m_sensor; bool m_enabled = false; bool m_userEnabled = true; Orientation m_orientation = Orientation::Undefined; KStatusNotifierItem *m_sni = nullptr; KSharedConfig::Ptr m_config; OrientationSensorAdaptor *m_adaptor = nullptr; }; }