diff --git a/cmake/DDEShellPackageMacros.cmake b/cmake/DDEShellPackageMacros.cmake index 12741dbcc..188960060 100644 --- a/cmake/DDEShellPackageMacros.cmake +++ b/cmake/DDEShellPackageMacros.cmake @@ -80,11 +80,6 @@ function(ds_handle_package_translation) set(package_dirs ${PROJECT_BINARY_DIR}/packages/${_config_PACKAGE}/) - # FIXME: not working on Qt 6.7 - # set_source_files_properties(${TRANSLATION_FILES} - # PROPERTIES OUTPUT_LOCATION "${package_dirs}/translations" - # ) - add_custom_target(${_config_PACKAGE}_translation ALL SOURCES ${TRANSLATION_FILES} ) @@ -93,6 +88,7 @@ function(ds_handle_package_translation) TS_FILES ${TRANSLATION_FILES} SOURCES ${_config_QML_FILES} ${_config_SOURCE_FILES} QM_FILES_OUTPUT_VARIABLE TRANSLATED_FILES + QM_OUTPUT_DIRECTORY "${package_dirs}/translations" LUPDATE_OPTIONS -no-obsolete -no-ui-lines -locations none IMMEDIATE_CALL ) diff --git a/panels/dock/pluginmanagerextension.cpp b/panels/dock/pluginmanagerextension.cpp index 67d0df73e..c6237c968 100644 --- a/panels/dock/pluginmanagerextension.cpp +++ b/panels/dock/pluginmanagerextension.cpp @@ -90,7 +90,7 @@ struct WlQtTextInputMethodHelper : public QtWaylandServer::qt_text_input_method_ }; PluginScaleManager::PluginScaleManager(QWaylandCompositor *compositor) - : QWaylandCompositorExtensionTemplate(compositor) + : QWaylandCompositorExtension(compositor) , m_compositor(compositor) { } @@ -119,7 +119,7 @@ uint32_t PluginScaleManager::pluginScale() void PluginScaleManager::initialize() { - QWaylandCompositorExtensionTemplate::initialize(); + QWaylandCompositorExtension::initialize(); QWaylandCompositor *compositor = static_cast(extensionContainer()); Q_ASSERT(compositor); @@ -166,7 +166,8 @@ PluginSurface::PluginSurface(PluginManager *manager, int sizePolicy, QWaylandSurface *surface, const QWaylandResource &resource) - : m_manager(manager) + : QWaylandShellSurface(nullptr) + , m_manager(manager) , m_surface(surface) , m_itemKey(itemKey) , m_pluginId(pluginId) @@ -370,7 +371,8 @@ PluginPopup::PluginPopup(PluginManager *manager, int popupType, QWaylandSurface *surface, const QWaylandResource &resource) - : m_manager(manager) + : QWaylandShellSurface(nullptr) + , m_manager(manager) , m_surface(surface) , m_itemKey(itemKey) , m_pluginId(pluginId) @@ -496,7 +498,7 @@ void PluginPopup::plugin_popup_set_cursor(Resource *resource, int32_t cursor_sha } PluginManager::PluginManager(QWaylandCompositor *compositor) - : QWaylandCompositorExtensionTemplate(compositor) + : QWaylandCompositorExtension(compositor) { auto theme = DGuiApplicationHelper::instance()->applicationTheme(); QObject::connect(theme, &DPlatformTheme::fontNameChanged, this, &PluginManager::onFontChanged); @@ -509,7 +511,7 @@ PluginManager::PluginManager(QWaylandCompositor *compositor) void PluginManager::initialize() { - QWaylandCompositorExtensionTemplate::initialize(); + QWaylandCompositorExtension::initialize(); QWaylandCompositor *compositor = static_cast(extensionContainer()); // ###(zccrs): 在dde-shell中不要使用QWaylandCompositor的event handler,它会对key event进行 diff --git a/panels/dock/pluginmanagerextension_p.h b/panels/dock/pluginmanagerextension_p.h index 8c90c1e9a..57629ebdf 100644 --- a/panels/dock/pluginmanagerextension_p.h +++ b/panels/dock/pluginmanagerextension_p.h @@ -8,10 +8,11 @@ #include #include #include +#include #include #include #include -#include +#include #include #include @@ -23,7 +24,7 @@ class PluginSurface; class PluginPopup; class PluginScale; -class PluginScaleManager : public QWaylandCompositorExtensionTemplate, public QtWaylandServer::wp_fractional_scale_manager_v1 +class PluginScaleManager : public QWaylandCompositorExtension, public QtWaylandServer::wp_fractional_scale_manager_v1 { Q_OBJECT QML_ELEMENT @@ -31,6 +32,10 @@ class PluginScaleManager : public QWaylandCompositorExtensionTemplate, pub Q_OBJECT public: PluginScale(PluginScaleManager *manager, QWaylandSurface *surface, const QWaylandResource &resource); + const struct wl_interface *extensionInterface() const override + { + return QtWaylandServer::wp_fractional_scale_v1::interface(); + } void wp_fractional_scale_v1_destroy(Resource *resource) override; }; -class PluginManager : public QWaylandCompositorExtensionTemplate, public QtWaylandServer::plugin_manager_v1 +class PluginManager : public QWaylandCompositorExtension, public QtWaylandServer::plugin_manager_v1 { Q_OBJECT QML_ELEMENT @@ -65,6 +74,10 @@ class PluginManager : public QWaylandCompositorExtensionTemplate, public: PluginManager(QWaylandCompositor *compositor = nullptr); + const struct wl_interface *extensionInterface() const override + { + return QtWaylandServer::plugin_manager_v1::interface(); + } void initialize() override; Q_INVOKABLE void updateDockOverflowState(int state); @@ -156,7 +169,7 @@ private Q_SLOTS: QMap m_pendingXEmbedCallbacks; }; -class PluginSurface : public QWaylandShellSurfaceTemplate, public QtWaylandServer::plugin +class PluginSurface : public QWaylandShellSurface, public QtWaylandServer::plugin { Q_OBJECT Q_PROPERTY(QString pluginId READ pluginId CONSTANT) @@ -183,6 +196,10 @@ class PluginSurface : public QWaylandShellSurfaceTemplate, public const QString &itemKey, const QString &displayName, int pluginFlags, int pluginType, int sizePolicy, QWaylandSurface *surface, const QWaylandResource &resource); + const struct wl_interface *extensionInterface() const override + { + return QtWaylandServer::plugin::interface(); + } QWaylandQuickShellIntegration * createIntegration(QWaylandQuickShellSurfaceItem *item) override; @@ -263,7 +280,7 @@ class PluginSurface : public QWaylandShellSurfaceTemplate, public QPointer m_anchorWindow; }; -class PluginPopup : public QWaylandShellSurfaceTemplate, public QtWaylandServer::plugin_popup +class PluginPopup : public QWaylandShellSurface, public QtWaylandServer::plugin_popup { Q_OBJECT Q_PROPERTY(int32_t x READ x WRITE setX NOTIFY xChanged) @@ -279,6 +296,10 @@ class PluginPopup : public QWaylandShellSurfaceTemplate, public QtW public: PluginPopup(PluginManager* shell, const QString &pluginId, const QString &itemKey, int x, int y, int popupType, QWaylandSurface *surface, const QWaylandResource &resource); + const struct wl_interface *extensionInterface() const override + { + return QtWaylandServer::plugin_popup::interface(); + } QWaylandQuickShellIntegration *createIntegration(QWaylandQuickShellSurfaceItem *item) override; QWaylandSurface *surface() const; diff --git a/panels/dock/tray/SurfacePopup.qml b/panels/dock/tray/SurfacePopup.qml index 393859bb8..e9c4dce4c 100644 --- a/panels/dock/tray/SurfacePopup.qml +++ b/panels/dock/tray/SurfacePopup.qml @@ -128,10 +128,10 @@ Item { toolTip.shellSurface = popupSurface toolTip.toolTipX = Qt.binding(function () { - return Panel.popupWindow.xOffset + toolTip.shellSurface.x - toolTip.width / 2 + return toolTip.shellSurface ? Panel.popupWindow.xOffset + toolTip.shellSurface.x - toolTip.width / 2 : 0 }) toolTip.toolTipY = Qt.binding(function () { - return Panel.popupWindow.yOffset + toolTip.shellSurface.y - toolTip.height - toolTipVOffset + return toolTip.shellSurface ? Panel.popupWindow.yOffset + toolTip.shellSurface.y - toolTip.height - toolTipVOffset : 0 }) toolTip.open() } else if (popupSurface.popupType === Dock.TrayPopupTypeMenu) { diff --git a/panels/dock/xdgactivationmanager.cpp b/panels/dock/xdgactivationmanager.cpp index 8044b73e5..97e3b99af 100644 --- a/panels/dock/xdgactivationmanager.cpp +++ b/panels/dock/xdgactivationmanager.cpp @@ -19,14 +19,14 @@ Q_LOGGING_CATEGORY(xdgActivationMgr, "dde.shell.xdgactivation.manager") // --------------------------------------------------------------------------- XdgActivationManager::XdgActivationManager(QWaylandCompositor *compositor) - : QWaylandCompositorExtensionTemplate(compositor) + : QWaylandCompositorExtension(compositor) , m_compositor(compositor) { } void XdgActivationManager::initialize() { - QWaylandCompositorExtensionTemplate::initialize(); + QWaylandCompositorExtension::initialize(); QWaylandCompositor *compositor = static_cast(extensionContainer()); Q_ASSERT(compositor); m_compositor = compositor; diff --git a/panels/dock/xdgactivationmanager_p.h b/panels/dock/xdgactivationmanager_p.h index 36803ef79..b965bfd88 100644 --- a/panels/dock/xdgactivationmanager_p.h +++ b/panels/dock/xdgactivationmanager_p.h @@ -20,12 +20,16 @@ class XdgActivation; } class XdgActivationTokenV1; -class XdgActivationManager : public QWaylandCompositorExtensionTemplate, public QtWaylandServer::xdg_activation_v1 +class XdgActivationManager : public QWaylandCompositorExtension, public QtWaylandServer::xdg_activation_v1 { Q_OBJECT QML_ELEMENT public: XdgActivationManager(QWaylandCompositor *compositor = nullptr); + const struct wl_interface *extensionInterface() const override + { + return QtWaylandServer::xdg_activation_v1::interface(); + } void initialize() override; void setPendingToken(XdgActivationTokenV1 *token); diff --git a/shell/appletloader.cpp b/shell/appletloader.cpp index 1617a8001..f9198b096 100644 --- a/shell/appletloader.cpp +++ b/shell/appletloader.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include DS_BEGIN_NAMESPACE @@ -336,16 +337,23 @@ void DAppletLoaderPrivate::loadTranslation(const DPluginMetaData &pluginData) if (!m_configManager->isAppletEnabled(pluginId)) return; - auto translator = new QTranslator(qApp); const QString pluginTranslationDir(baseDir + "/translations/"); - if (translator->load(QLocale::system(), pluginId, QLatin1String("_"), pluginTranslationDir)) { - m_pluginTranslators[pluginId] = translator; - qApp->installTranslator(translator); - qInfo(dsLoaderLog) << "Loaded translation:" << translator->filePath(); + // Not every plugin ships translations; a missing directory is expected, + // only warn when the directory exists but no matching qm can be loaded. + if (!QDir(pluginTranslationDir).exists()) { + qCDebug(dsLoaderLog) << "Skip translation loading, directory does not exist:" << pluginTranslationDir + << "plugin id:" << pluginId; } else { - qCWarning(dsLoaderLog) << "Failed to load translation:" << pluginTranslationDir << "plugin id:" << pluginId - << "locale:" << QLocale::system().uiLanguages(); - translator->deleteLater(); + auto translator = new QTranslator(qApp); + if (translator->load(QLocale::system(), pluginId, QLatin1String("_"), pluginTranslationDir)) { + m_pluginTranslators[pluginId] = translator; + qApp->installTranslator(translator); + qInfo(dsLoaderLog) << "Loaded translation:" << translator->filePath(); + } else { + qCWarning(dsLoaderLog) << "Failed to load translation:" << pluginTranslationDir << "plugin id:" << pluginId + << "locale:" << QLocale::system().uiLanguages(); + translator->deleteLater(); + } } const auto children = DPluginLoader::instance()->childrenPlugin(pluginId); diff --git a/shell/shell.cpp b/shell/shell.cpp index 9bb09d1fe..c53a2153b 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2024-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -124,8 +124,13 @@ bool Shell::dconfigMigrate(const QString &newConf, const QString &oldConf) auto oldLastIndex = oldConf.lastIndexOf('/'); auto oldFirstIndex = oldConf.indexOf('/'); - std::unique_ptr newDconfig(Dtk::Core::DConfig::create(newConf.left(newFirstIndex), newConf.mid(newLastIndex + 1), newConf.mid(newFirstIndex + 1, newLastIndex - newFirstIndex - 1))); - std::unique_ptr oldDconfig(Dtk::Core::DConfig::create(oldConf.left(oldFirstIndex), oldConf.mid(oldLastIndex + 1), oldConf.mid(oldFirstIndex + 1, oldLastIndex - newFirstIndex - 1))); + const QString newAppId = newConf.left(newFirstIndex); + const QString newName = newConf.mid(newLastIndex + 1); + const QString oldAppId = oldConf.left(oldFirstIndex); + const QString oldName = oldConf.mid(oldLastIndex + 1); + + std::unique_ptr newDconfig(Dtk::Core::DConfig::create(newAppId, newName, newConf.mid(newFirstIndex + 1, newLastIndex - newFirstIndex - 1))); + std::unique_ptr oldDconfig(Dtk::Core::DConfig::create(oldAppId, oldName, oldConf.mid(oldFirstIndex + 1, oldLastIndex - oldFirstIndex - 1))); if (!newDconfig->isValid() || !oldDconfig->isValid()) { return false;