You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
5.2 KiB
110 lines
5.2 KiB
/* |
|
SPDX-FileCopyrightText: 2021 Dan Leinir Turthra Jensen <admin@leinir.dk> |
|
|
|
SPDX-License-Identifier: LGPL-2.0-only |
|
*/ |
|
|
|
#include "cursorthemesettings.h" |
|
|
|
#include "../kcms-common_p.h" |
|
|
|
#include "xcursor/cursortheme.h" |
|
#include "xcursor/themeapplicator.h" |
|
#include "xcursor/thememodel.h" |
|
|
|
#include <KLocalizedString> |
|
|
|
#include <QApplication> |
|
#include <QCommandLineParser> |
|
#include <QDebug> |
|
#include <QFile> |
|
#include <QTimer> |
|
|
|
int main(int argc, char **argv) |
|
{ |
|
// This is a CLI application, but we require at least a QGuiApplication for things |
|
// in Plasma::Theme, so let's just roll with one of these |
|
QApplication app(argc, argv); |
|
QCoreApplication::setApplicationName(QStringLiteral("plasma-apply-cursortheme")); |
|
QCoreApplication::setApplicationVersion(QStringLiteral("1.0")); |
|
QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org")); |
|
KLocalizedString::setApplicationDomain("plasma-apply-cursortheme"); |
|
|
|
QCommandLineParser *parser = new QCommandLineParser; |
|
parser->addHelpOption(); |
|
parser->setApplicationDescription( |
|
i18n("This tool allows you to set the mouse cursor theme for the current Plasma session, without accidentally setting it to one that is either not " |
|
"available, or which is already set.")); |
|
parser->addPositionalArgument( |
|
QStringLiteral("cursortheme"), |
|
i18n("The name of the cursor theme you wish to set for your current Plasma session (passing a full path will only use the last part of the path)")); |
|
parser->addOption(QCommandLineOption(QStringLiteral("list-themes"), i18n("Show all the themes available on the system (and which is the current theme)"))); |
|
parser->process(app); |
|
|
|
int errorCode{0}; |
|
CursorThemeSettings *settings = new CursorThemeSettings(&app); |
|
QTextStream ts(stdout); |
|
CursorThemeModel *model = new CursorThemeModel(&app); |
|
if (!parser->positionalArguments().isEmpty()) { |
|
QString requestedTheme{parser->positionalArguments().first()}; |
|
const QString dirSplit{"/"}; |
|
if (requestedTheme.contains(dirSplit)) { |
|
QStringList splitTheme = requestedTheme.split(dirSplit, Qt::SkipEmptyParts); |
|
// Cursor themes installed through KNewStuff will commonly be given an installed files entry |
|
// which has the main directory name and an asterix to say the cursors are all in that directory, |
|
// and since one of the main purposes of this tool is to allow adopting things from a kns dialog, |
|
// we handle that little weirdness here. |
|
splitTheme.removeAll(QStringLiteral("*")); |
|
requestedTheme = splitTheme.last(); |
|
} |
|
|
|
if (settings->cursorTheme() == requestedTheme) { |
|
ts << i18n("The requested theme \"%1\" is already set as the theme for the current Plasma session.", requestedTheme) << Qt::endl; |
|
// This is not an error condition, no reason to set an error code |
|
} else { |
|
auto results = model->findIndex(requestedTheme); |
|
QModelIndex selected = model->index(results.row(), 0); |
|
const CursorTheme *theme = selected.isValid() ? model->theme(selected) : nullptr; |
|
|
|
if (theme) { |
|
settings->setCursorTheme(theme->name()); |
|
if (settings->save() && applyTheme(theme, theme->defaultCursorSize())) { |
|
notifyKcmChange(GlobalChangeType::CursorChanged); |
|
ts << i18n("Successfully applied the mouse cursor theme %1 to your current Plasma session", theme->title()) << Qt::endl; |
|
} else { |
|
ts << i18n("You have to restart the Plasma session for your newly applied mouse cursor theme to display correctly.") << Qt::endl; |
|
// A bit of an odd one, more a warning than an error, but this means we can forward it |
|
errorCode = -1; |
|
} |
|
} else { |
|
QStringList availableThemes; |
|
for (int i = 0; i < model->rowCount(); ++i) { |
|
const CursorTheme *theme = model->theme(model->index(i, 0)); |
|
availableThemes << theme->name(); |
|
} |
|
ts << i18n("Could not find theme \"%1\". The theme should be one of the following options: %2", |
|
requestedTheme, |
|
availableThemes.join(QLatin1String{", "})) |
|
<< Qt::endl; |
|
errorCode = -1; |
|
} |
|
} |
|
} else if (parser->isSet(QStringLiteral("list-themes"))) { |
|
ts << i18n("You have the following mouse cursor themes on your system:") << Qt::endl; |
|
for (int i = 0; i < model->rowCount(); ++i) { |
|
const CursorTheme *theme = model->theme(model->index(i, 0)); |
|
if (settings->cursorTheme() == theme->name()) { |
|
ts << QString(" * %1 (%2 - current theme for this Plasma session)").arg(theme->title()).arg(theme->name()) << Qt::endl; |
|
} else { |
|
ts << QString(" * %1 (%2)").arg(theme->title()).arg(theme->name()) << Qt::endl; |
|
} |
|
} |
|
} else { |
|
parser->showHelp(); |
|
} |
|
QTimer::singleShot(0, &app, [&app, &errorCode]() { |
|
app.exit(errorCode); |
|
}); |
|
|
|
return app.exec(); |
|
}
|
|
|