Advance Wayland and KDE package bring-up
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# KI18N Translation Domain for this library
|
||||
add_definitions(-DTRANSLATION_DOMAIN=\"kcm_kwin_scripts\")
|
||||
|
||||
kcmutils_add_qml_kcm(kcm_kwin_scripts INSTALL_NAMESPACE plasma/kcms/systemsettings)
|
||||
|
||||
target_sources(kcm_kwin_scripts PRIVATE
|
||||
module.cpp
|
||||
kwinscriptsdata.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(kcm_kwin_scripts PRIVATE
|
||||
Qt::DBus
|
||||
|
||||
KF6::I18n
|
||||
KF6::KCMUtilsCore
|
||||
KF6::KCMUtils
|
||||
KF6::Package
|
||||
KF6::KCMUtilsQuick
|
||||
)
|
||||
|
||||
install(FILES kwinscripts.knsrc DESTINATION ${KDE_INSTALL_KNSRCDIR})
|
||||
@@ -0,0 +1,4 @@
|
||||
#!bin/sh
|
||||
$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` >> rc.cpp
|
||||
$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h -o -name \*.qml` -o $podir/kcm_kwin_scripts.pot
|
||||
rm -f rc.cpp
|
||||
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"KPlugin": {
|
||||
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=systemsettings&component=kcm_kwinscripts",
|
||||
"Description": "Manage KWin scripts",
|
||||
"Description[ar]": "أدر سكربتات كوين",
|
||||
"Description[az]": "Kwin skriptlərini idarə edin",
|
||||
"Description[be]": "Кіраванне скрыптамі KWin",
|
||||
"Description[bg]": "Управление на скриптове на KWin",
|
||||
"Description[ca@valencia]": "Gestiona els scripts de KWin",
|
||||
"Description[ca]": "Gestiona els scripts del KWin",
|
||||
"Description[cs]": "Spravovat skripty KWinu",
|
||||
"Description[da]": "Adminstrér KWin-scripts",
|
||||
"Description[de]": "KWin-Skripte verwalten",
|
||||
"Description[en_GB]": "Manage KWin scripts",
|
||||
"Description[eo]": "Administri KWin-skriptoj",
|
||||
"Description[es]": "Gestión de guiones de KWin",
|
||||
"Description[et]": "KWini skriptide haldamine",
|
||||
"Description[eu]": "Kudeatu KWin gidoiak",
|
||||
"Description[fi]": "Hallitse KWin-skriptejä",
|
||||
"Description[fr]": "Gérer les scripts pour KWin",
|
||||
"Description[gl]": "Xestiona os guións de KWin.",
|
||||
"Description[he]": "ניהול סקריפטים של KWin",
|
||||
"Description[hu]": "KWin parancsfájlok kezelése",
|
||||
"Description[ia]": "Gere scriptos de KWin",
|
||||
"Description[id]": "Kelola skrip KWin",
|
||||
"Description[is]": "Umsjón með KWin-skriftum",
|
||||
"Description[it]": "Gestisci gli script di KWin",
|
||||
"Description[ja]": "Kwin スクリプトを管理",
|
||||
"Description[ka]": "KWin-ის სკრიპტების მართვა",
|
||||
"Description[ko]": "KWin 스크립트 관리",
|
||||
"Description[lt]": "Tvarkyti KWin scenarijus",
|
||||
"Description[lv]": "Pārvaldīt „KWin“ skriptus",
|
||||
"Description[nb]": "Håndter KWin-skript",
|
||||
"Description[nl]": "KWin-scripts beheren",
|
||||
"Description[nn]": "Handsam KWin-skript",
|
||||
"Description[pl]": "Zarządzanie skryptami KWin",
|
||||
"Description[pt]": "Gerir os programas do KWin",
|
||||
"Description[pt_BR]": "Gerencia os scripts do KWin",
|
||||
"Description[ro]": "Gestionare scripturi KWin",
|
||||
"Description[ru]": "Управление сценариями KWin",
|
||||
"Description[sa]": "KWin स्क्रिप्ट् प्रबन्धयन्तु",
|
||||
"Description[sk]": "Spravovať KWin skripty",
|
||||
"Description[sl]": "Upravljajte skripte KWin",
|
||||
"Description[sv]": "Hantera Kwin-skript",
|
||||
"Description[ta]": "கேவின்னுக்கான சிறுநிரல்களை நிர்வகியுங்கள்",
|
||||
"Description[tr]": "KWin Betiklerini Yönet",
|
||||
"Description[uk]": "Керування скриптами KWin",
|
||||
"Description[vi]": "Quản lí các kịch bản KWin",
|
||||
"Description[x-test]": "xxManage KWin scriptsxx",
|
||||
"Description[zh_CN]": "管理 KWin 脚本",
|
||||
"Description[zh_TW]": "管理 KWin 文稿",
|
||||
"Icon": "preferences-system-windows-actions",
|
||||
"Name": "KWin Scripts",
|
||||
"Name[ar]": "سكربتات كوين",
|
||||
"Name[az]": "Kwin skriptləri",
|
||||
"Name[be]": "Скрыпты KWin",
|
||||
"Name[bg]": "Скриптове на KWin",
|
||||
"Name[ca@valencia]": "Scripts de KWin",
|
||||
"Name[ca]": "Scripts del KWin",
|
||||
"Name[cs]": "Skripty KWinu",
|
||||
"Name[da]": "KWin-scripts",
|
||||
"Name[de]": "KWin-Skripte",
|
||||
"Name[en_GB]": "KWin Scripts",
|
||||
"Name[eo]": "KWin-Skriptoj",
|
||||
"Name[es]": "Guiones de KWin",
|
||||
"Name[et]": "KWini skriptid",
|
||||
"Name[eu]": "KWin gidoiak",
|
||||
"Name[fi]": "KWin-skriptit",
|
||||
"Name[fr]": "Scripts pour KWin",
|
||||
"Name[gl]": "Guións de KWin",
|
||||
"Name[he]": "סקריפטים של KWin",
|
||||
"Name[hu]": "KWin parancsfájlok",
|
||||
"Name[ia]": "Script de KWin",
|
||||
"Name[id]": "Skrip KWin",
|
||||
"Name[is]": "KWin-skriftur",
|
||||
"Name[it]": "Script di KWin",
|
||||
"Name[ja]": "KWin スクリプト",
|
||||
"Name[ka]": "KWin-ის სკრიპტები",
|
||||
"Name[ko]": "KWin 스크립트",
|
||||
"Name[lt]": "KWin scenarijai",
|
||||
"Name[lv]": "„KWin“ skripti",
|
||||
"Name[nb]": "KWin-skript",
|
||||
"Name[nl]": "KWin-scripts",
|
||||
"Name[nn]": "KWin-skript",
|
||||
"Name[pl]": "Skrypty KWin",
|
||||
"Name[pt]": "Programas do KWin",
|
||||
"Name[pt_BR]": "Scripts do KWin",
|
||||
"Name[ro]": "Scripturi KWin",
|
||||
"Name[ru]": "Сценарии KWin",
|
||||
"Name[sa]": "KWin स्क्रिप्ट्",
|
||||
"Name[sk]": "KWin skripty",
|
||||
"Name[sl]": "Skripti KWin",
|
||||
"Name[sv]": "Kwin-skript",
|
||||
"Name[ta]": "கேவின் சிறுநிரல்கள்",
|
||||
"Name[tr]": "KWin Betikleri",
|
||||
"Name[uk]": "Скрипти KWin",
|
||||
"Name[vi]": "Kịch bản KWin",
|
||||
"Name[x-test]": "xxKWin Scriptsxx",
|
||||
"Name[zh_CN]": "KWin 脚本",
|
||||
"Name[zh_TW]": "KWin 文稿"
|
||||
},
|
||||
"X-KDE-Keywords": "kwin script,plugins,window manager",
|
||||
"X-KDE-Keywords[ar]": "كوين البرنامج النصي,والإضافات,ومدير النافذة",
|
||||
"X-KDE-Keywords[bg]": "kwin скрипт,плъгини,мениджър на прозорци",
|
||||
"X-KDE-Keywords[ca@valencia]": "script de kwin,connectors,gestor de finestres",
|
||||
"X-KDE-Keywords[ca]": "script de kwin,connectors,gestor de finestres",
|
||||
"X-KDE-Keywords[cs]": "skript kwinu,moduly,správce oken",
|
||||
"X-KDE-Keywords[de]": "KWin-Skript,Module,Fensterverwaltung",
|
||||
"X-KDE-Keywords[en_GB]": "kwin script,plugins,window manager",
|
||||
"X-KDE-Keywords[es]": "guion de kwin,complementos,gestor de ventanas,administrador de ventanas",
|
||||
"X-KDE-Keywords[eu]": "kwin gidoia,pluginak,leiho kudeatzailea",
|
||||
"X-KDE-Keywords[fi]": "kwin-scripti,liitännäinen,liitännäiset,ikkunaohjelma,ikkunahallinta",
|
||||
"X-KDE-Keywords[fr]": "script pour KWin, modules externes, gestionnaire de fenêtres",
|
||||
"X-KDE-Keywords[gl]": "kwin script,script de kwin,guión de kwin,plugins,complementos,extensións,window manager,xestor de xanelas,xestor de ventás,xestor de fiestras",
|
||||
"X-KDE-Keywords[he]": "סקריפט kwin,תוספים,מנהל חלונות",
|
||||
"X-KDE-Keywords[hu]": "kwin parancsfájlok,bővítmények,ablakkezelő",
|
||||
"X-KDE-Keywords[ia]": "script, plugins, gerente de fenestra de kwin",
|
||||
"X-KDE-Keywords[is]": "kwin-skrifta,viðbætur,gluggastjóri",
|
||||
"X-KDE-Keywords[it]": "script di kwin,estensioni,gestore delle finestre",
|
||||
"X-KDE-Keywords[ka]": "kwin script,plugins,window manager,დამატებები,ფანჯრების მართვა,kwin-ის სკრიპტი",
|
||||
"X-KDE-Keywords[ko]": "kwin 스크립트,플러그인,창 관리자",
|
||||
"X-KDE-Keywords[lt]": "kwin scenarijus,kwin scenarijai,įskiepiai,iskiepiai,langų tvarkytuvė,langu tvarkytuve",
|
||||
"X-KDE-Keywords[lv]": "kwin skripts,spraudņi,logu pārvaldnieks",
|
||||
"X-KDE-Keywords[nb]": "kwin-skript,tillegg,programtillegg,vindusbehandler",
|
||||
"X-KDE-Keywords[nl]": "kwin-script,plug-ins,vensterbeheerder",
|
||||
"X-KDE-Keywords[nn]": "kwin-skript,tillegg,programtillegg,vindaugshandsamar",
|
||||
"X-KDE-Keywords[pl]": "skrypt kwin,wtyczki,zarządzanie oknami",
|
||||
"X-KDE-Keywords[pt_BR]": "kwin script,plugins,gerenciador de janelas",
|
||||
"X-KDE-Keywords[ru]": "kwin script,plugins,window manager,сценарий,модули,диспетчер окон",
|
||||
"X-KDE-Keywords[sa]": "kwin स्क्रिप्ट,प्लगिन्,विण्डो प्रबन्धक",
|
||||
"X-KDE-Keywords[sl]": "skript kwin,vtičniki,upravljalnik okna",
|
||||
"X-KDE-Keywords[sv]": "kwin-skript,insticksprogram,fönsterhanterare",
|
||||
"X-KDE-Keywords[tr]": "kwin betiği,eklentiler,pencere yöneticisi",
|
||||
"X-KDE-Keywords[uk]": "kwin script,plugins,window manager,скрипт квін,додатки,керування,вікна",
|
||||
"X-KDE-Keywords[x-test]": "xxkwin scriptxx,xxpluginsxx,xxwindow managerxx",
|
||||
"X-KDE-Keywords[zh_CN]": "kwin script,plugins,window manager,jiaoben,chajian,chuangkouguanliqi,kwin 脚本,插件,窗口管理器",
|
||||
"X-KDE-Keywords[zh_TW]": "kwin 文稿,kwin 指令稿,插件,外掛程式,視窗管理員",
|
||||
"X-KDE-System-Settings-Parent-Category": "windowmanagement",
|
||||
"X-KDE-Weight": 50
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
[KNewStuff3]
|
||||
Name=Window Manager Scripts
|
||||
Name[ar]=سكربتات مدير النوافذ
|
||||
Name[az]=Pəncərə Meneceri skriptləri
|
||||
Name[be]=Скрыпты кіраўніка акон
|
||||
Name[bg]=Скриптове на мениджър на прозорци
|
||||
Name[ca]=Scripts del gestor de finestres
|
||||
Name[ca@valencia]=Scripts del gestor de finestres
|
||||
Name[cs]=Skripty správce oken
|
||||
Name[da]=Vindueshåndteringsscripts
|
||||
Name[de]=Fensterverwaltungs-Skripte
|
||||
Name[el]=Σενάρια διαχειριστή παραθύρων
|
||||
Name[en_GB]=Window Manager Scripts
|
||||
Name[eo]=Fenestraj Administraj Skriptoj
|
||||
Name[es]=Guiones del gestor de ventanas
|
||||
Name[et]=Aknahalduri skriptid
|
||||
Name[eu]=Leiho kudeatzailearen gidoiak
|
||||
Name[fi]=Ikkunointiohjelman skriptit
|
||||
Name[fr]=Scripts du gestionnaire de fenêtres
|
||||
Name[gl]=Guións do xestor de xanelas
|
||||
Name[he]=סקריפטים של מנהל חלונות
|
||||
Name[hu]=Ablakkezelő szkriptek
|
||||
Name[ia]=Gerente de scripts de fenestra
|
||||
Name[id]=Skrip Pengelola Jendela
|
||||
Name[is]=Gluggastjóraskriftur
|
||||
Name[it]=Script del gestore delle finestre
|
||||
Name[ja]=ウィンドウマネージャスクリプト
|
||||
Name[ka]=ფანჯრების მმართველის სკრიპტები
|
||||
Name[ko]=창 관리자 스크립트
|
||||
Name[lt]=Langų tvarkytuvės scenarijai
|
||||
Name[lv]=Logu pārvaldnieka skripti
|
||||
Name[nb]=Skript for vindusbehandler
|
||||
Name[nl]=Scripts van vensterbeheerder
|
||||
Name[nn]=Skript for vindaugshandsamar
|
||||
Name[pa]=ਵਿੰਡੋ ਮੈਨੇਜਰ ਸਕ੍ਰਿਪਟਾਂ
|
||||
Name[pl]=Skrypty zarządzania oknami
|
||||
Name[pt]=Programas do Gestor de Janelas
|
||||
Name[pt_BR]=Scripts do gerenciador de janelas
|
||||
Name[ro]=Scripturi pentru gestionar de ferestre
|
||||
Name[ru]=Сценарии для диспетчера окон KWin
|
||||
Name[sa]=विण्डो प्रबन्धक स्क्रिप्ट्
|
||||
Name[sk]=Skripty správcu okien
|
||||
Name[sl]=Skripti upravljalnika oken
|
||||
Name[sr]=Скрипте менаџера прозора
|
||||
Name[sr@ijekavian]=Скрипте менаџера прозора
|
||||
Name[sr@ijekavianlatin]=Skripte menadžera prozora
|
||||
Name[sr@latin]=Skripte menadžera prozora
|
||||
Name[sv]=Fönsterhanteringsskript
|
||||
Name[ta]=சாளர நிர்வாக சிறுநிரல்கள்
|
||||
Name[tr]=Pencere Yöneticisi Betikleri
|
||||
Name[uk]=Скрипти засобу керування вікнами
|
||||
Name[vi]=Các kịch bản trình quản lí cửa sổ
|
||||
Name[x-test]=xxWindow Manager Scriptsxx
|
||||
Name[zh_CN]=窗口管理器脚本
|
||||
Name[zh_TW]=視窗管理員指令稿
|
||||
|
||||
ProvidersUrl=https://autoconfig.kde.org/ocs/providers.xml
|
||||
ContentWarning=Executables
|
||||
Categories=Kwin Scripts Plasma 6
|
||||
StandardResource=tmp
|
||||
Uncompress=kpackage
|
||||
KPackageStructure=KWin/Script
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "kwinscriptsdata.h"
|
||||
|
||||
#include <KConfigGroup>
|
||||
#include <KPackage/Package>
|
||||
#include <KPackage/PackageLoader>
|
||||
#include <KPackage/PackageStructure>
|
||||
#include <KPluginFactory>
|
||||
|
||||
KWinScriptsData::KWinScriptsData(QObject *parent)
|
||||
: KCModuleData(parent)
|
||||
, m_kwinConfig(KSharedConfig::openConfig("kwinrc"))
|
||||
{
|
||||
}
|
||||
|
||||
QList<KPluginMetaData> KWinScriptsData::pluginMetaDataList() const
|
||||
{
|
||||
const QString scriptFolder = QStringLiteral("kwin/scripts/");
|
||||
return KPackage::PackageLoader::self()->findPackages(QStringLiteral("KWin/Script"), scriptFolder);
|
||||
}
|
||||
|
||||
bool KWinScriptsData::isDefaults() const
|
||||
{
|
||||
QList<KPluginMetaData> plugins = pluginMetaDataList();
|
||||
KConfigGroup cfgGroup(m_kwinConfig, QStringLiteral("Plugins"));
|
||||
for (auto &plugin : plugins) {
|
||||
if (cfgGroup.readEntry(plugin.pluginId() + QLatin1String("Enabled"), plugin.isEnabledByDefault()) != plugin.isEnabledByDefault()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#include "moc_kwinscriptsdata.cpp"
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QList>
|
||||
#include <QObject>
|
||||
|
||||
#include <KCModuleData>
|
||||
#include <KPluginMetaData>
|
||||
#include <KSharedConfig>
|
||||
|
||||
class KWinScriptsData : public KCModuleData
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
KWinScriptsData(QObject *parent);
|
||||
|
||||
bool isDefaults() const override;
|
||||
|
||||
QList<KPluginMetaData> pluginMetaDataList() const;
|
||||
|
||||
private:
|
||||
KSharedConfigPtr m_kwinConfig;
|
||||
};
|
||||
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2011 Tamas Krutki <ktamasw@gmail.com>
|
||||
SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#include "module.h"
|
||||
|
||||
#include <QDBusConnection>
|
||||
#include <QDBusMessage>
|
||||
#include <QDBusPendingCall>
|
||||
#include <QFileDialog>
|
||||
#include <QStringList>
|
||||
|
||||
#include <KCMultiDialog>
|
||||
#include <KConfigGroup>
|
||||
#include <KLocalizedString>
|
||||
#include <KPackage/Package>
|
||||
#include <KPackage/PackageJob>
|
||||
#include <KPackage/PackageLoader>
|
||||
#include <KSharedConfig>
|
||||
|
||||
#include "kwinscriptsdata.h"
|
||||
|
||||
Module::Module(QObject *parent, const KPluginMetaData &data)
|
||||
: KQuickConfigModule(parent, data)
|
||||
, m_kwinScriptsData(new KWinScriptsData(this))
|
||||
, m_model(new KPluginModel(this))
|
||||
{
|
||||
// Hide the help button, because there is no help
|
||||
setButtons(Apply | Default);
|
||||
connect(m_model, &KPluginModel::isSaveNeededChanged, this, [this]() {
|
||||
setNeedsSave(m_model->isSaveNeeded() || !m_pendingDeletions.isEmpty());
|
||||
});
|
||||
connect(m_model, &KPluginModel::defaulted, this, [this](bool defaulted) {
|
||||
setRepresentsDefaults(defaulted);
|
||||
});
|
||||
m_model->setConfig(KSharedConfig::openConfig("kwinrc")->group(QStringLiteral("Plugins")));
|
||||
}
|
||||
|
||||
void Module::onGHNSEntriesChanged()
|
||||
{
|
||||
m_model->clear();
|
||||
m_model->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
|
||||
}
|
||||
|
||||
void Module::importScript()
|
||||
{
|
||||
QFileDialog *dialog = new QFileDialog;
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
dialog->setFileMode(QFileDialog::ExistingFile);
|
||||
dialog->setWindowTitle(i18n("Import KWin Script"));
|
||||
dialog->setNameFilter(i18n("KWin Script (*.kwinscript)"));
|
||||
|
||||
connect(dialog, &QFileDialog::accepted, this, [this, dialog] {
|
||||
using namespace KPackage;
|
||||
|
||||
if (dialog->selectedFiles().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto job = PackageJob::update(QStringLiteral("KWin/Script"), dialog->selectedFiles().first());
|
||||
connect(job, &KJob::result, this, [job, this]() {
|
||||
if (job->error() != KJob::NoError) {
|
||||
setErrorMessage(i18nc("Placeholder is error message returned from the install service", "Cannot import selected script.\n%1", job->errorString()));
|
||||
return;
|
||||
}
|
||||
|
||||
m_infoMessage = i18nc("Placeholder is name of the script that was imported", "The script \"%1\" was successfully imported.", job->package().metadata().name());
|
||||
m_errorMessage.clear();
|
||||
Q_EMIT messageChanged();
|
||||
|
||||
m_model->clear();
|
||||
m_model->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
|
||||
|
||||
setNeedsSave(false);
|
||||
});
|
||||
});
|
||||
|
||||
dialog->open();
|
||||
}
|
||||
|
||||
void Module::configure(const KPluginMetaData &data)
|
||||
{
|
||||
auto dialog = new KCMultiDialog();
|
||||
dialog->addModule(data, QVariantList{data.pluginId(), QStringLiteral("KWin/Script")});
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
dialog->show();
|
||||
}
|
||||
|
||||
void Module::togglePendingDeletion(const KPluginMetaData &data)
|
||||
{
|
||||
if (m_pendingDeletions.contains(data)) {
|
||||
m_pendingDeletions.removeOne(data);
|
||||
} else {
|
||||
m_pendingDeletions.append(data);
|
||||
}
|
||||
setNeedsSave(m_model->isSaveNeeded() || !m_pendingDeletions.isEmpty());
|
||||
Q_EMIT pendingDeletionsChanged();
|
||||
}
|
||||
|
||||
void Module::defaults()
|
||||
{
|
||||
m_model->defaults();
|
||||
m_pendingDeletions.clear();
|
||||
Q_EMIT pendingDeletionsChanged();
|
||||
|
||||
setNeedsSave(m_model->isSaveNeeded());
|
||||
}
|
||||
|
||||
void Module::load()
|
||||
{
|
||||
m_model->clear();
|
||||
m_model->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
|
||||
m_pendingDeletions.clear();
|
||||
Q_EMIT pendingDeletionsChanged();
|
||||
|
||||
setNeedsSave(false);
|
||||
}
|
||||
|
||||
void Module::save()
|
||||
{
|
||||
using namespace KPackage;
|
||||
for (const KPluginMetaData &info : std::as_const(m_pendingDeletions)) {
|
||||
// We can get the package root from the entry path
|
||||
QDir root = QFileInfo(info.fileName()).dir();
|
||||
root.cdUp();
|
||||
KJob *uninstallJob = PackageJob::uninstall(QStringLiteral("KWin/Script"), info.pluginId(), root.absolutePath());
|
||||
connect(uninstallJob, &KJob::result, this, [this, uninstallJob]() {
|
||||
if (!uninstallJob->errorString().isEmpty()) {
|
||||
setErrorMessage(i18n("Error when uninstalling KWin Script: %1", uninstallJob->errorString()));
|
||||
} else {
|
||||
load(); // Make sure to reload the KCM to deleted entries to disappear
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
m_infoMessage.clear();
|
||||
Q_EMIT messageChanged();
|
||||
m_pendingDeletions.clear();
|
||||
Q_EMIT pendingDeletionsChanged();
|
||||
|
||||
m_model->save();
|
||||
QDBusMessage message = QDBusMessage::createMethodCall("org.kde.KWin", "/Scripting", "org.kde.kwin.Scripting", "start");
|
||||
QDBusConnection::sessionBus().asyncCall(message);
|
||||
|
||||
setNeedsSave(false);
|
||||
}
|
||||
|
||||
K_PLUGIN_FACTORY_WITH_JSON(KcmKWinScriptsFactory, "kcm_kwin_scripts.json",
|
||||
registerPlugin<Module>();
|
||||
registerPlugin<KWinScriptsData>();)
|
||||
|
||||
#include "module.moc"
|
||||
|
||||
#include "moc_module.cpp"
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2011 Tamas Krutki <ktamasw@gmail.com>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <KCModule>
|
||||
#include <KPackage/Package>
|
||||
#include <KPluginMetaData>
|
||||
#include <KPluginModel>
|
||||
#include <KQuickConfigModule>
|
||||
#include <QFileInfo>
|
||||
|
||||
class KJob;
|
||||
class KWinScriptsData;
|
||||
|
||||
class Module : public KQuickConfigModule
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(QAbstractItemModel *model READ model CONSTANT)
|
||||
Q_PROPERTY(QList<KPluginMetaData> pendingDeletions READ pendingDeletions NOTIFY pendingDeletionsChanged)
|
||||
Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY messageChanged)
|
||||
Q_PROPERTY(QString infoMessage READ infoMessage NOTIFY messageChanged)
|
||||
public:
|
||||
explicit Module(QObject *parent, const KPluginMetaData &data);
|
||||
|
||||
void load() override;
|
||||
void save() override;
|
||||
void defaults() override;
|
||||
|
||||
QAbstractItemModel *model() const
|
||||
{
|
||||
return m_model;
|
||||
}
|
||||
|
||||
Q_INVOKABLE void togglePendingDeletion(const KPluginMetaData &data);
|
||||
Q_INVOKABLE bool canDeleteEntry(const KPluginMetaData &data)
|
||||
{
|
||||
return QFileInfo(data.fileName()).isWritable();
|
||||
}
|
||||
|
||||
QList<KPluginMetaData> pendingDeletions()
|
||||
{
|
||||
return m_pendingDeletions;
|
||||
}
|
||||
|
||||
QString errorMessage() const
|
||||
{
|
||||
return m_errorMessage;
|
||||
}
|
||||
QString infoMessage() const
|
||||
{
|
||||
return m_infoMessage;
|
||||
}
|
||||
void setErrorMessage(const QString &message)
|
||||
{
|
||||
m_infoMessage.clear();
|
||||
m_errorMessage = message;
|
||||
Q_EMIT messageChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the import script button is clicked.
|
||||
*/
|
||||
Q_INVOKABLE void importScript();
|
||||
Q_INVOKABLE void onGHNSEntriesChanged();
|
||||
|
||||
Q_INVOKABLE void configure(const KPluginMetaData &data);
|
||||
|
||||
Q_SIGNALS:
|
||||
void messageChanged();
|
||||
void pendingDeletionsChanged();
|
||||
|
||||
private:
|
||||
KWinScriptsData *m_kwinScriptsData;
|
||||
QList<KPluginMetaData> m_pendingDeletions;
|
||||
KPluginModel *m_model;
|
||||
QString m_errorMessage;
|
||||
QString m_infoMessage;
|
||||
};
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2013 Antonis Tsiapaliokas <kok3rs@gmail.com>
|
||||
SPDX-FileCopyrightText: 2019 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
|
||||
import org.kde.config
|
||||
import org.kde.kirigami 2 as Kirigami
|
||||
import org.kde.newstuff as NewStuff
|
||||
import org.kde.kcmutils as KCMUtils
|
||||
|
||||
KCMUtils.ScrollViewKCM {
|
||||
implicitWidth: Kirigami.Units.gridUnit * 22
|
||||
implicitHeight: Kirigami.Units.gridUnit * 20
|
||||
|
||||
actions: [
|
||||
Kirigami.Action {
|
||||
icon.name: "document-import"
|
||||
text: i18n("Install from File…")
|
||||
onTriggered: kcm.importScript()
|
||||
},
|
||||
NewStuff.Action {
|
||||
text: i18nc("@action:button get new KWin scripts", "Get New…")
|
||||
visible: KAuthorized.authorize(KAuthorized.GHNS)
|
||||
configFile: "kwinscripts.knsrc"
|
||||
onEntryEvent: (entry, event) => {
|
||||
if (event === NewStuff.Engine.StatusChangedEvent) {
|
||||
kcm.onGHNSEntriesChanged()
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
header: ColumnLayout {
|
||||
spacing: Kirigami.Units.smallSpacing
|
||||
|
||||
Kirigami.InlineMessage {
|
||||
Layout.fillWidth: true
|
||||
visible: kcm.errorMessage || kcm.infoMessage
|
||||
type: kcm.errorMessage ? Kirigami.MessageType.Error : Kirigami.MessageType.Information
|
||||
text: kcm.errorMessage || kcm.infoMessage
|
||||
}
|
||||
|
||||
Kirigami.SearchField {
|
||||
Layout.fillWidth: true
|
||||
id: searchField
|
||||
}
|
||||
}
|
||||
|
||||
view: KCMUtils.PluginSelector {
|
||||
id: selector
|
||||
sourceModel: kcm.model
|
||||
query: searchField.text
|
||||
|
||||
delegate: KCMUtils.PluginDelegate {
|
||||
onConfigTriggered: kcm.configure(model.config)
|
||||
additionalActions: [
|
||||
Kirigami.Action {
|
||||
enabled: kcm.canDeleteEntry(model.metaData)
|
||||
icon.name: kcm.pendingDeletions.indexOf(model.metaData) === -1 ? "delete" : "edit-undo"
|
||||
text: i18nc("@info:tooltip", "Delete…")
|
||||
displayHint: Kirigami.DisplayHint.IconOnly
|
||||
|
||||
onTriggered: kcm.togglePendingDeletion(model.metaData)
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user