diff --git a/panels/dock/dconfig/org.deepin.ds.dock.json b/panels/dock/dconfig/org.deepin.ds.dock.json index b4843310e..89ed0196a 100755 --- a/panels/dock/dconfig/org.deepin.ds.dock.json +++ b/panels/dock/dconfig/org.deepin.ds.dock.json @@ -91,6 +91,17 @@ "description": "Enable or disable the show desktop area on the right side of the dock", "permissions": "readwrite", "visibility": "private" + }, + "enableContextMenu": { + "value": true, + "serial": 0, + "flags": [], + "name": "Enable Dock Context Menu", + "name[zh_CN]": "启用任务栏右键菜单", + "description": "Enable or disable the context menu on the empty area of the dock.", + "description[zh_CN]": "启用或禁用任务栏空白区域的右键菜单和触摸长按菜单。", + "permissions": "readwrite", + "visibility": "private" } } } diff --git a/panels/dock/dockpanel.cpp b/panels/dock/dockpanel.cpp index 15754ac12..b9488979f 100644 --- a/panels/dock/dockpanel.cpp +++ b/panels/dock/dockpanel.cpp @@ -119,6 +119,7 @@ bool DockPanel::init() connect(SETTINGS, &DockSettings::itemAlignmentChanged, this, &DockPanel::itemAlignmentChanged); connect(SETTINGS, &DockSettings::indicatorStyleChanged, this, &DockPanel::indicatorStyleChanged); connect(SETTINGS, &DockSettings::lockedChanged, this, &DockPanel::lockedChanged); + connect(SETTINGS, &DockSettings::contextMenuEnabledChanged, this, &DockPanel::contextMenuEnabledChanged); connect(SETTINGS, &DockSettings::dockSizeChanged, this, [this, dockDaemonAdaptor](){ Q_EMIT dockDaemonAdaptor->WindowSizeEfficientChanged(dockSize()); @@ -425,6 +426,11 @@ bool DockPanel::locked() const return SETTINGS->locked(); } +bool DockPanel::contextMenuEnabled() const +{ + return SETTINGS->contextMenuEnabled(); +} + void DockPanel::setLocked(bool newLocked) { SETTINGS->setLocked(newLocked); diff --git a/panels/dock/dockpanel.h b/panels/dock/dockpanel.h index e6106f117..1b4be8429 100644 --- a/panels/dock/dockpanel.h +++ b/panels/dock/dockpanel.h @@ -35,6 +35,7 @@ class DockPanel : public DS_NAMESPACE::DPanel, public QDBusContext Q_PROPERTY(QString screenName READ screenName NOTIFY screenNameChanged FINAL) Q_PROPERTY(bool locked READ locked WRITE setLocked NOTIFY lockedChanged FINAL) Q_PROPERTY(bool isResizing READ isResizing WRITE setIsResizing NOTIFY isResizingChanged FINAL) + Q_PROPERTY(bool contextMenuEnabled READ contextMenuEnabled NOTIFY contextMenuEnabledChanged FINAL) Q_PROPERTY(qreal devicePixelRatio READ devicePixelRatio NOTIFY devicePixelRatioChanged FINAL) @@ -93,6 +94,7 @@ class DockPanel : public DS_NAMESPACE::DPanel, public QDBusContext bool locked() const; void setLocked(bool newLocked); + bool contextMenuEnabled() const; void setHideState(HideState newHideState); QScreen* dockScreen(); @@ -135,6 +137,7 @@ private Q_SLOTS: void leftEdgeClicked(const QString &minOrder); void devicePixelRatioChanged(qreal ratio); void lockedChanged(bool locked); + void contextMenuEnabledChanged(bool enabled); void contextDraggingChanged(); void isResizingChanged(bool isResizing); diff --git a/panels/dock/docksettings.cpp b/panels/dock/docksettings.cpp index ac78af46f..75de92484 100644 --- a/panels/dock/docksettings.cpp +++ b/panels/dock/docksettings.cpp @@ -27,6 +27,7 @@ const static QString keyIndicatorStyle = "Indicator_Style"; const static QString keyPluginsVisible = "Plugins_Visible"; const static QString keyShowInPrimary = "Show_In_Primary"; const static QString keyLocked = "Locked"; +const static QString keyEnableContextMenu = "enableContextMenu"; namespace dock { @@ -156,6 +157,7 @@ DockSettings::DockSettings(QObject* parent) , m_alignment(dock::CenterAlignment) , m_style(dock::Fashion) , m_locked(false) + , m_contextMenuEnabled(true) { m_writeTimer->setSingleShot(true); m_writeTimer->setInterval(1000); @@ -174,6 +176,7 @@ void DockSettings::init() m_pluginsVisible = m_dockConfig->value(keyPluginsVisible).toMap(); m_showInPrimary = m_dockConfig->value(keyShowInPrimary).toBool(); m_locked = m_dockConfig->value(keyLocked).toBool(); + m_contextMenuEnabled = m_dockConfig->value(keyEnableContextMenu, true).toBool(); // Log dock config on startup - merge shell_pos and shell_dock_mode into one log entry logDockConfig(m_dockPosition, m_alignment, QStringLiteral("on startup")); @@ -217,6 +220,11 @@ void DockSettings::init() if (locked == m_locked) return; m_locked = locked; Q_EMIT lockedChanged(m_locked); + } else if (keyEnableContextMenu == key) { + const auto enabled = m_dockConfig->value(keyEnableContextMenu, true).toBool(); + if (enabled == m_contextMenuEnabled) return; + m_contextMenuEnabled = enabled; + Q_EMIT contextMenuEnabledChanged(m_contextMenuEnabled); } }); } else { @@ -331,6 +339,11 @@ bool DockSettings::locked() const return m_locked; } +bool DockSettings::contextMenuEnabled() const +{ + return m_contextMenuEnabled; +} + void DockSettings::setLocked(bool newLocked) { if (m_locked == newLocked) { diff --git a/panels/dock/docksettings.h b/panels/dock/docksettings.h index f334b09b5..91901ed1d 100644 --- a/panels/dock/docksettings.h +++ b/panels/dock/docksettings.h @@ -28,6 +28,7 @@ class DockSettings : public QObject Q_PROPERTY(QVariantMap pluginsVisible READ pluginsVisible WRITE setPluginsVisible NOTIFY pluginsVisibleChanged FINAL) Q_PROPERTY(bool showInPrimary READ showInPrimary WRITE setShowInPrimary NOTIFY showInPrimaryChanged FINAL) Q_PROPERTY(bool locked READ locked WRITE setLocked NOTIFY lockedChanged FINAL) + Q_PROPERTY(bool contextMenuEnabled READ contextMenuEnabled NOTIFY contextMenuEnabledChanged FINAL) public: static DockSettings* instance(); @@ -40,6 +41,7 @@ class DockSettings : public QObject QVariantMap pluginsVisible(); bool showInPrimary() const; bool locked() const; + bool contextMenuEnabled() const; void setDockSize(const uint& size); void setHideMode(const HideMode& mode); @@ -76,6 +78,7 @@ class DockSettings : public QObject void showInPrimaryChanged(bool showInPrimary); void lockedChanged(bool locked); + void contextMenuEnabledChanged(bool enabled); private: QScopedPointer m_dockConfig; @@ -90,5 +93,6 @@ class DockSettings : public QObject QVariantMap m_pluginsVisible; bool m_showInPrimary; bool m_locked; + bool m_contextMenuEnabled; }; } diff --git a/panels/dock/package/main.qml b/panels/dock/package/main.qml index 86f8a02cc..a9a01f077 100644 --- a/panels/dock/package/main.qml +++ b/panels/dock/package/main.qml @@ -58,6 +58,9 @@ Window { } function requestShowDockMenu() { + if (!Panel.contextMenuEnabled) + return + // maybe has popup visible, close it. Panel.requestClosePopup() viewDeactivated() @@ -381,6 +384,18 @@ Window { } } + Connections { + target: Panel + function onContextMenuEnabledChanged() { + if (Panel.contextMenuEnabled) + return + + if (MenuHelper.activeMenu === dockMenuLoader.item) + MenuHelper.closeCurrent() + dockMenuLoader.active = false + } + } + Item { id: dockContainer width: dock.useColumnLayout ? dock.dockSize : parent.width @@ -418,8 +433,10 @@ Window { onTapped: function(eventPoint, button) { let lastActive = MenuHelper.activeMenu MenuHelper.closeCurrent() - dockMenuLoader.active = true - if (button === Qt.RightButton && lastActive !== dockMenuLoader.item) { + if (button === Qt.RightButton && Panel.contextMenuEnabled) { + dockMenuLoader.active = true + } + if (button === Qt.RightButton && Panel.contextMenuEnabled && lastActive !== dockMenuLoader.item) { requestShowDockMenu() } if (button === Qt.LeftButton) { @@ -441,7 +458,6 @@ Window { } let lastActive = MenuHelper.activeMenu MenuHelper.closeCurrent() - dockMenuLoader.active = true // try to close popup when clicked empty, because dock does not have focus. Panel.requestClosePopup() viewDeactivated() @@ -450,8 +466,10 @@ Window { dockContainer.touchLongPressed = true let lastActive = MenuHelper.activeMenu MenuHelper.closeCurrent() - dockMenuLoader.active = true - if (lastActive !== dockMenuLoader.item) { + if (Panel.contextMenuEnabled) { + dockMenuLoader.active = true + } + if (Panel.contextMenuEnabled && lastActive !== dockMenuLoader.item) { requestShowDockMenu() } } diff --git a/panels/dock/taskmanager/appitem.cpp b/panels/dock/taskmanager/appitem.cpp index ed92adf94..35b7b69e3 100644 --- a/panels/dock/taskmanager/appitem.cpp +++ b/panels/dock/taskmanager/appitem.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -27,6 +27,8 @@ AppItem::AppItem(QString id, QObject *parent) connect(this, &AbstractItem::dataChanged, this, &AppItem::checkAppItemNeedDeleteAndDelete); connect(this, &AppItem::currentActiveWindowChanged, this, &AbstractItem::iconChanged); + connect(TaskManagerSettings::instance(), &TaskManagerSettings::dockedApplicationsEnabledChanged, + this, [this] { Q_EMIT menusChanged(); }); } AppItem::~AppItem() @@ -105,10 +107,12 @@ QString AppItem::menus() const // array.append(allWindowMenu); // } - QJsonObject dockMenu; - dockMenu["id"] = DOCK_ACTION_DOCK; - dockMenu["name"] = isDocked() ? tr("Undock") : tr("Dock"); - array.append(dockMenu); + if (TaskManagerSettings::instance()->dockedApplicationsEnabled()) { + QJsonObject dockMenu; + dockMenu["id"] = DOCK_ACTION_DOCK; + dockMenu["name"] = isDocked() ? tr("Undock") : tr("Dock"); + array.append(dockMenu); + } if (hasWindow()) { QJsonObject foreceQuit; diff --git a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json index 68c13c23d..96caf3850 100644 --- a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json +++ b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json @@ -106,6 +106,17 @@ "description": "List of app id that should prefer window icon when window split is disabled", "permissions": "readwrite", "visibility": "private" + }, + "enableDockedApplications": { + "value": true, + "serial": 0, + "flags": [], + "name": "Enable Docked Applications", + "name[zh_CN]": "启用驻留任务栏应用", + "description": "Enable or disable docked applications on the taskbar. When disabled, docked applications that are not running are hidden and docking changes are rejected, while the saved docked application list is preserved.", + "description[zh_CN]": "启用或禁用任务栏驻留应用;关闭时隐藏未运行的驻留应用并禁止更改驻留状态,但保留已保存的驻留应用列表。", + "permissions": "readwrite", + "visibility": "private" } } diff --git a/panels/dock/taskmanager/desktopfileabstractparser.cpp b/panels/dock/taskmanager/desktopfileabstractparser.cpp index 5e34eb3d6..7a9d1ee3b 100644 --- a/panels/dock/taskmanager/desktopfileabstractparser.cpp +++ b/panels/dock/taskmanager/desktopfileabstractparser.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -139,6 +139,11 @@ bool DesktopfileAbstractParser::isDocked() void DesktopfileAbstractParser::setDocked(bool docked) { + if (!TaskManagerSettings::instance()->dockedApplicationsEnabled()) { + qDebug() << "Docked application changes are disabled by DConfig"; + return; + } + if (!isValied().first && docked) { qDebug() << isValied().second; return; diff --git a/panels/dock/taskmanager/desktopfileamparser.cpp b/panels/dock/taskmanager/desktopfileamparser.cpp index a0deeada1..7b714a727 100644 --- a/panels/dock/taskmanager/desktopfileamparser.cpp +++ b/panels/dock/taskmanager/desktopfileamparser.cpp @@ -7,6 +7,7 @@ #include "desktopfileamparser.h" #include "desktopfileabstractparser.h" #include "objectmanager1interface.h" +#include "taskmanagersettings.h" #include #include @@ -43,7 +44,8 @@ DesktopFileAMParser::DesktopFileAMParser(QString id, QObject* parent) connect(&desktopobjectManager, &ObjectManager::InterfacesRemoved, this, [this] (const QDBusObjectPath& path, const QStringList& interfaces) { Q_UNUSED(interfaces) if (m_applicationInterface->path() == path.path()) { - getAppItem()->setDocked(false); + TaskManagerSettings::instance()->removeDockedElement(QStringLiteral("desktop/%1").arg(this->id())); + Q_EMIT dockedChanged(); return; } }); diff --git a/panels/dock/taskmanager/dockglobalelementmodel.cpp b/panels/dock/taskmanager/dockglobalelementmodel.cpp index 12613402b..65a7125d7 100644 --- a/panels/dock/taskmanager/dockglobalelementmodel.cpp +++ b/panels/dock/taskmanager/dockglobalelementmodel.cpp @@ -30,6 +30,7 @@ DockGlobalElementModel::DockGlobalElementModel(QAbstractItemModel *appsModel, Do { connect(TaskManagerSettings::instance(), &TaskManagerSettings::dockedElementsChanged, this, &DockGlobalElementModel::loadDockedElements); connect(TaskManagerSettings::instance(), &TaskManagerSettings::windowSplitChanged, this, &DockGlobalElementModel::groupItemsByApp); + connect(TaskManagerSettings::instance(), &TaskManagerSettings::dockedApplicationsEnabledChanged, this, &DockGlobalElementModel::loadDockedElements); connect( m_appsModel, @@ -258,39 +259,41 @@ void DockGlobalElementModel::initDockedElements(bool unused) void DockGlobalElementModel::loadDockedElements() { QList> newDocked; - for (auto elementInfo : TaskManagerSettings::instance()->dockedElements()) { - auto pair = elementInfo.split('/'); - if (pair.size() != 2) - continue; + if (TaskManagerSettings::instance()->dockedApplicationsEnabled()) { + for (auto elementInfo : TaskManagerSettings::instance()->dockedElements()) { + auto pair = elementInfo.split('/'); + if (pair.size() != 2) + continue; - auto type = pair[0]; - auto id = pair[1]; + auto type = pair[0]; + auto id = pair[1]; - auto tmp = std::make_tuple(type, id); + auto tmp = std::make_tuple(type, id); - // check desktop is installed - QAbstractItemModel *model = nullptr; - int row = 0; - if (type == "desktop") { - model = m_appsModel; - auto res = m_appsModel->match(m_appsModel->index(0, 0), TaskManager::DesktopIdRole, id, 1, Qt::MatchExactly).value(0); - if (!res.isValid()) - continue; - row = res.row(); - } + // check desktop is installed + QAbstractItemModel *model = nullptr; + int row = 0; + if (type == "desktop") { + model = m_appsModel; + auto res = m_appsModel->match(m_appsModel->index(0, 0), TaskManager::DesktopIdRole, id, 1, Qt::MatchExactly).value(0); + if (!res.isValid()) + continue; + row = res.row(); + } - newDocked.append(tmp); - if (m_dockedElements.contains(tmp)) - continue; + newDocked.append(tmp); + if (m_dockedElements.contains(tmp)) + continue; - auto isRunning = std::any_of(m_data.constBegin(), m_data.constEnd(), [this, &id](const auto &data) { - return std::get<0>(data) == id; - }); + auto isRunning = std::any_of(m_data.constBegin(), m_data.constEnd(), [&id](const auto &data) { + return std::get<0>(data) == id; + }); - if (!isRunning) { - beginInsertRows(QModelIndex(), m_data.size(), m_data.size()); - m_data.append(std::make_tuple(id, model, row)); - endInsertRows(); + if (!isRunning) { + beginInsertRows(QModelIndex(), m_data.size(), m_data.size()); + m_data.append(std::make_tuple(id, model, row)); + endInsertRows(); + } } } @@ -342,8 +345,10 @@ QString DockGlobalElementModel::getMenus(const QModelIndex &index) const menusArray.append(action); } - bool isDocked = (model == nullptr) || m_dockedElements.contains(std::make_tuple("desktop", id)); - menusArray.append(QJsonObject{{"id", DOCK_ACTION_DOCK}, {"name", isDocked ? tr("Undock") : tr("Dock")}}); + if (TaskManagerSettings::instance()->dockedApplicationsEnabled()) { + bool isDocked = (model == nullptr) || m_dockedElements.contains(std::make_tuple("desktop", id)); + menusArray.append(QJsonObject{{"id", DOCK_ACTION_DOCK}, {"name", isDocked ? tr("Undock") : tr("Dock")}}); + } if (model == m_activeAppModel) { if (TaskManagerSettings::instance()->isAllowedForceQuit()) { diff --git a/panels/dock/taskmanager/globals.h b/panels/dock/taskmanager/globals.h index 74509a1ab..47ec6a9b2 100644 --- a/panels/dock/taskmanager/globals.h +++ b/panels/dock/taskmanager/globals.h @@ -27,6 +27,7 @@ static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES = static inline const QString TASKMANAGER_DOCKEDITEMS_KEY = "Docked_Items"; constexpr auto TASKMANAGER_DOCKEDELEMENTS_KEY = "dockedElements"; constexpr auto TASKMANAGER_WINDOW_ICON_WHITELIST_KEY = "windowIconWhitelist"; +constexpr auto TASKMANAGER_ENABLE_DOCKED_APPLICATIONS_KEY = "enableDockedApplications"; // model roleNames constexpr auto MODEL_WINID = "winId"; diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index dbbcaf4ed..bae8101ea 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -401,6 +401,7 @@ QString TaskManager::desktopIdToAppId(const QString& desktopId) bool TaskManager::requestDockByDesktopId(const QString& desktopID) { + if (!Settings->dockedApplicationsEnabled()) return false; if (desktopID.startsWith("internal/")) return false; QString appId = desktopIdToAppId(desktopID); // 检查应用是否已经在任务栏中,如果是则返回 false @@ -412,12 +413,16 @@ bool TaskManager::requestDockByDesktopId(const QString& desktopID) bool TaskManager::requestUndockByDesktopId(const QString& desktopID) { + if (!Settings->dockedApplicationsEnabled()) return false; if (desktopID.startsWith("internal/")) return false; return RequestUndock(desktopIdToAppId(desktopID)); } bool TaskManager::RequestDock(QString appID) { + if (!Settings->dockedApplicationsEnabled()) + return false; + auto desktopfileParser = DESKTOPFILEFACTORY::createById(appID, "amAPP"); auto res = desktopfileParser->isValied(); @@ -451,6 +456,9 @@ bool TaskManager::IsDocked(QString appID) bool TaskManager::RequestUndock(QString appID) { + if (!Settings->dockedApplicationsEnabled()) + return false; + auto desktopfileParser = DESKTOPFILEFACTORY::createById(appID, "amAPP"); auto res = desktopfileParser->isValied(); if (!res.first) { @@ -488,6 +496,9 @@ void TaskManager::activateWindow(uint32_t windowID) void TaskManager::saveDockElementsOrder(const QStringList &appIds) { + if (!Settings->dockedApplicationsEnabled()) + return; + const QStringList &dockedElements = TaskManagerSettings::instance()->dockedElements(); QStringList newDockedElements; for (const auto &appId : appIds) { diff --git a/panels/dock/taskmanager/taskmanagersettings.cpp b/panels/dock/taskmanager/taskmanagersettings.cpp index 52aa69689..4f660ddec 100644 --- a/panels/dock/taskmanager/taskmanagersettings.cpp +++ b/panels/dock/taskmanager/taskmanagersettings.cpp @@ -43,6 +43,7 @@ TaskManagerSettings* TaskManagerSettings::instance() TaskManagerSettings::TaskManagerSettings(QObject *parent) : QObject(parent) , m_taskManagerDconfig(DConfig::create(QStringLiteral("org.deepin.dde.shell"), QStringLiteral("org.deepin.ds.dock.taskmanager"), QString(), this)) + , m_dockedApplicationsEnabled(true) { connect(m_taskManagerDconfig, &DConfig::valueChanged, this, [this](const QString &key){ if (TASKMANAGER_ALLOWFOCEQUIT_KEY == key) { @@ -58,6 +59,12 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent) } else if (TASKMANAGER_DOCKEDELEMENTS_KEY == key) { m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList(); Q_EMIT dockedElementsChanged(); + } else if (TASKMANAGER_ENABLE_DOCKED_APPLICATIONS_KEY == key) { + const bool enabled = m_taskManagerDconfig->value(TASKMANAGER_ENABLE_DOCKED_APPLICATIONS_KEY, true).toBool(); + if (enabled == m_dockedApplicationsEnabled) + return; + m_dockedApplicationsEnabled = enabled; + Q_EMIT dockedApplicationsEnabledChanged(m_dockedApplicationsEnabled); } }); @@ -66,6 +73,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent) m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool(); m_cgroupsBasedGrouping = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_KEY, true).toBool(); m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList(); + m_dockedApplicationsEnabled = m_taskManagerDconfig->value(TASKMANAGER_ENABLE_DOCKED_APPLICATIONS_KEY, true).toBool(); m_cgroupsBasedGroupingSkipAppIds = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS, {"deepin-terminal"}).toStringList(); m_cgroupsBasedGroupingSkipCategories = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES, {"TerminalEmulator"}).toStringList(); m_windowIconWhitelist = m_taskManagerDconfig->value(TASKMANAGER_WINDOW_ICON_WHITELIST_KEY, {"com.tencent.wechat"}).toStringList(); @@ -130,6 +138,11 @@ bool TaskManagerSettings::isDocked(const QString &elementId) const return m_dockedElements.contains(elementId); } +bool TaskManagerSettings::dockedApplicationsEnabled() const +{ + return m_dockedApplicationsEnabled; +} + void TaskManagerSettings::migrateFromDockedItems() { if (m_taskManagerDconfig->isDefaultValue(TASKMANAGER_DOCKEDITEMS_KEY)) { @@ -186,6 +199,9 @@ void TaskManagerSettings::setDockedElements(const QStringList &elements) void TaskManagerSettings::toggleDockedElement(const QString &element) { + if (!m_dockedApplicationsEnabled) + return; + if (isDocked(element)) { removeDockedElement(element); } else { diff --git a/panels/dock/taskmanager/taskmanagersettings.h b/panels/dock/taskmanager/taskmanagersettings.h index 168995f5b..8ee4d0bef 100644 --- a/panels/dock/taskmanager/taskmanagersettings.h +++ b/panels/dock/taskmanager/taskmanagersettings.h @@ -43,6 +43,7 @@ class TaskManagerSettings : public QObject void removeDockedElement(const QString &element); QStringList dockedElements() const; bool isDocked(const QString &elementId) const; + bool dockedApplicationsEnabled() const; void logMergeAppModel(bool mergeAppModelOn); @@ -57,6 +58,7 @@ class TaskManagerSettings : public QObject void windowSplitChanged(); void dockedItemsChanged(); void dockedElementsChanged(); + void dockedApplicationsEnabledChanged(bool enabled); private: DConfig* m_taskManagerDconfig; @@ -65,6 +67,7 @@ class TaskManagerSettings : public QObject bool m_showAttentionAnimation; bool m_windowSplit; bool m_cgroupsBasedGrouping; + bool m_dockedApplicationsEnabled; QStringList m_dockedElements; QStringList m_windowIconWhitelist; QStringList m_cgroupsBasedGroupingSkipAppIds;