diff --git a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml index 1f73c2d..f15d40c 100644 --- a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml +++ b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml @@ -76,11 +76,12 @@ /> - + diff --git a/src/constant.h b/src/constant.h index 41a26a6..5aeb666 100644 --- a/src/constant.h +++ b/src/constant.h @@ -57,7 +57,7 @@ constexpr auto AppExecOption = u8"appExec"; constexpr auto STORAGE_VERSION = 0; constexpr auto ApplicationPropertiesGroup = u8"Application Properties"; constexpr auto LastLaunchedTime = u8"LastLaunchedTime"; -constexpr auto ScaleFactor = u8"ScaleFactor"; +constexpr auto Environ = u8"Environ"; constexpr auto LaunchedTimes = u8"LaunchedTimes"; constexpr auto InstalledTime = u8"InstalledTime"; diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 1e3d4c4..d38ed06 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -32,51 +32,16 @@ #include #include -double getScaleFactor() noexcept -{ - auto sessionBus = QDBusConnection::sessionBus(); - QDBusMessage reply1 = sessionBus.call(QDBusMessage::createMethodCall( - "org.deepin.dde.XSettings1", "/org/deepin/dde/XSettings1", "org.deepin.dde.XSettings1", "GetScaleFactor")); - - if (reply1.type() != QDBusMessage::ReplyMessage) { - qWarning() << "call GetScaleFactor Failed:" << reply1.errorMessage(); - return 1.0; - } - - QDBusReply ret1(reply1); - double scale = ret1.isValid() ? ret1.value() : 1.0; - scale = scale > 0 ? scale : 1; - return scale; -} - void ApplicationService::appendExtraEnvironments(QVariantMap &runtimeOptions) const noexcept { QString oldEnv; - // scale factor - static QStringList scaleEnvs{"DEEPIN_WINE_SCALE=%1;", "QT_SCALE_FACTOR=%1;"}; - auto factor = scaleFactor(); if (auto it = runtimeOptions.find("env"); it != runtimeOptions.cend()) { oldEnv = it->value(); } - for (const auto &env : scaleEnvs) { - oldEnv.append(env.arg(factor)); - } - - // FIX #7528 GTK app only scale the UI, not scaling of text. - // GDK_SCALE Must be set to an integer, see https://docs.gtk.org/gtk3/x11.html - // 1.25 ==> 1 , 1.75 ==>2 - int scale = qRound(factor); - oldEnv.append(QString("GDK_SCALE=%1;").arg(scale)); - if (scale > 0) { // avoid division by 0 - oldEnv.append(QString("GDK_DPI_SCALE=%1;").arg(qreal(1.0 / scale))); - } - - // GIO - oldEnv.append(QString{"GIO_LAUNCHED_DESKTOP_FILE=%1;"}.arg(m_desktopSource.sourcePath())); - - // set for dxcb platform plugin, which should use scale factor directly instead of processing double times. - oldEnv.append(QString{"D_DXCB_FORCE_OVERRIDE_HIDPI=1"}); + const QString &env = environ(); + if (!env.isEmpty()) + oldEnv.prepend(env); runtimeOptions.insert("env", oldEnv); } @@ -85,7 +50,6 @@ ApplicationService::ApplicationService(DesktopFile source, ApplicationManager1Service *parent, std::weak_ptr storage) : QObject(parent) - , m_scaleFactor(getScaleFactor()) , m_storage(std::move(storage)) , m_desktopSource(std::move(source)) { @@ -139,30 +103,9 @@ ApplicationService::ApplicationService(DesktopFile source, m_launchedTimes = value.toLongLong(); } - value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor); + value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, ::Environ); if (!value.isNull()) { - bool ok{false}; - auto tmp = value.toDouble(&ok); - if (ok) { - m_scaleFactor = tmp; - m_customScale = true; - } - } - - if (!QDBusConnection::sessionBus().connect("org.deepin.dde.XSettings1", - "/org/deepin/dde/XSettings1", - "org.deepin.dde.XSettings1", - "SetScaleFactorDone", - this, - SLOT(onGlobalScaleFactorChanged()))) { - qWarning() << "connect to org.deepin.dde.XSettings1 failed, scaleFactor is invalid."; - } -} - -void ApplicationService::onGlobalScaleFactorChanged() noexcept -{ - if (!m_customScale) { - m_scaleFactor = getScaleFactor(); + m_environ = value.toString(); } } @@ -606,13 +549,17 @@ qint64 ApplicationService::launchedTimes() const noexcept return m_launchedTimes; } -double ApplicationService::scaleFactor() const noexcept +QString ApplicationService::environ() const noexcept { - return m_scaleFactor; + return m_environ; } -void ApplicationService::setScaleFactor(double value) noexcept +void ApplicationService::setEnviron(const QString &value) noexcept { + if (environ().trimmed() == value.trimmed()) { + return; + } + auto storagePtr = m_storage.lock(); if (!storagePtr) { qCritical() << "broken storage."; @@ -621,28 +568,19 @@ void ApplicationService::setScaleFactor(double value) noexcept } auto appId = id(); - if (value == 0) { - m_customScale = false; - m_scaleFactor = getScaleFactor(); - if (!storagePtr->deleteApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor)) { - qCritical() << "failed to delete app's property:" << appId; - } - return; - } - - if (m_customScale) { - if (!storagePtr->updateApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor, value)) { - sendErrorReply(QDBusError::Failed, "update scaleFactor failed."); + if (!m_environ.isEmpty()) { + if (!storagePtr->updateApplicationValue(appId, ApplicationPropertiesGroup, Environ, value)) { + sendErrorReply(QDBusError::Failed, "update environ failed."); return; } } else { - if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, ScaleFactor, value)) { - sendErrorReply(QDBusError::Failed, "set scaleFactor failed."); + if (!storagePtr->createApplicationValue(appId, ApplicationPropertiesGroup, Environ, value)) { + sendErrorReply(QDBusError::Failed, "set environ failed."); } } - m_scaleFactor = value; - emit scaleFactorChanged(); + m_environ = value; + emit environChanged(); } bool ApplicationService::autostartCheck(const QString &filePath) const noexcept @@ -907,7 +845,7 @@ void ApplicationService::resetEntry(DesktopEntry *newEntry) noexcept emit categoriesChanged(); emit MimeTypesChanged(); emit terminalChanged(); - emit scaleFactorChanged(); + emit environChanged(); emit launchedTimesChanged(); } diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h index 807daf8..eae1c6e 100644 --- a/src/dbus/applicationservice.h +++ b/src/dbus/applicationservice.h @@ -67,9 +67,9 @@ public: Q_PROPERTY(qint64 LaunchedTimes READ launchedTimes NOTIFY launchedTimesChanged) [[nodiscard]] qint64 launchedTimes() const noexcept; - Q_PROPERTY(double ScaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged) - [[nodiscard]] double scaleFactor() const noexcept; - void setScaleFactor(double value) noexcept; + Q_PROPERTY(QString Environ READ environ WRITE setEnviron NOTIFY environChanged) + [[nodiscard]] QString environ() const noexcept; + void setEnviron(const QString &value) noexcept; Q_PROPERTY(bool Terminal READ terminal NOTIFY terminalChanged) [[nodiscard]] bool terminal() const noexcept; @@ -134,9 +134,6 @@ public: [[nodiscard]] LaunchTask unescapeExec(const QString &str, const QStringList &fields) noexcept; [[nodiscard]] static std::optional unescapeExecArgs(const QString &str) noexcept; -private Q_SLOTS: - void onGlobalScaleFactorChanged() noexcept; - public Q_SLOTS: // NOTE: 'realExec' only for internal implementation QDBusObjectPath @@ -164,7 +161,7 @@ Q_SIGNALS: void categoriesChanged(); void MimeTypesChanged(); void terminalChanged(); - void scaleFactorChanged(); + void environChanged(); void launchedTimesChanged(); private: @@ -174,11 +171,10 @@ private: std::weak_ptr storage); static QSharedPointer createApplicationService( DesktopFile source, ApplicationManager1Service *parent, std::weak_ptr storage) noexcept; - bool m_customScale{false}; qint64 m_lastLaunch{0}; qint64 m_installedTime{0}; qint64 m_launchedTimes{0}; - double m_scaleFactor; + QString m_environ; std::weak_ptr m_storage; AutostartSource m_autostartSource; QDBusObjectPath m_applicationPath;