[wayland] Add a --list-backends command line arg for listing available backends
Distributions do package each backend plugin in a dedicated package, which means just because KWin got compiled with a specific backend, doesn't mean it is also available at runtime. In order to better support this reality this change introduces a list-backends command line option. Each of the plugins got the json metadata extended by the KPlugin syntax, so that we have a name and description to print. As we already locate all plugins anyway, the additional findPlugins for the selected backend is changed to search the list of all plugin meta data.
This commit is contained in:
parent
8ffca66d94
commit
fc0272f3c4
6 changed files with 51 additions and 15 deletions
|
@ -1,3 +1,8 @@
|
|||
{
|
||||
"KPlugin": {
|
||||
"Id": "KWinWaylandDrmBackend",
|
||||
"Name": "drm",
|
||||
"Description": "Render through drm node."
|
||||
},
|
||||
"input": false
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
{
|
||||
"KPlugin": {
|
||||
"Id": "KWinWaylandFbdevBackend",
|
||||
"Name": "framebuffer",
|
||||
"Description": "Render to framebuffer."
|
||||
},
|
||||
"input": false
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
{
|
||||
"KPlugin": {
|
||||
"Id": "KWinWaylandHwcomposerBackend",
|
||||
"Name": "hwcomposer",
|
||||
"Description": "Render through hwcomposer through libhybris."
|
||||
},
|
||||
"input": true
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
{
|
||||
"KPlugin": {
|
||||
"Id": "KWinWaylandWaylandBackend",
|
||||
"Name": "wayland",
|
||||
"Description": "Render to a nested window on running Wayland compositor."
|
||||
},
|
||||
"input": true
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
{
|
||||
"KPlugin": {
|
||||
"Id": "KWinWaylandX11Backend",
|
||||
"Name": "x11",
|
||||
"Description": "Render to a nested window on X11 windowing system."
|
||||
},
|
||||
"input": true
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#endif // HAVE_UNISTD_H
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
namespace KWin
|
||||
{
|
||||
|
@ -382,6 +383,8 @@ int main(int argc, char * argv[])
|
|||
|
||||
KWin::Application::createAboutData();
|
||||
|
||||
const auto availablePlugins = KPluginLoader::findPlugins(QStringLiteral("org.kde.kwin.waylandbackends"));
|
||||
|
||||
QCommandLineOption xwaylandOption(QStringLiteral("xwayland"),
|
||||
i18n("Start a rootless Xwayland server."));
|
||||
QCommandLineOption waylandSocketOption(QStringList{QStringLiteral("s"), QStringLiteral("socket")},
|
||||
|
@ -440,6 +443,10 @@ int main(int argc, char * argv[])
|
|||
QStringLiteral("path/to/imserver"));
|
||||
parser.addOption(inputMethodOption);
|
||||
|
||||
QCommandLineOption listBackendsOption(QStringLiteral("list-backends"),
|
||||
i18n("List all available backends and quit."));
|
||||
parser.addOption(listBackendsOption);
|
||||
|
||||
parser.addPositionalArgument(QStringLiteral("applications"),
|
||||
i18n("Applications to start once Wayland and Xwayland server are started"),
|
||||
QStringLiteral("[/path/to/application...]"));
|
||||
|
@ -447,6 +454,13 @@ int main(int argc, char * argv[])
|
|||
parser.process(a);
|
||||
a.processCommandLine(&parser);
|
||||
|
||||
if (parser.isSet(listBackendsOption)) {
|
||||
for (const auto &plugin: availablePlugins) {
|
||||
std::cout << std::setw(40) << std::left << qPrintable(plugin.name()) << qPrintable(plugin.description()) << std::endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if HAVE_INPUT
|
||||
KWin::Application::setUseLibinput(parser.isSet(libinputOption));
|
||||
#endif
|
||||
|
@ -516,12 +530,12 @@ int main(int argc, char * argv[])
|
|||
pluginName = KWin::automaticBackendSelection();
|
||||
}
|
||||
|
||||
const auto pluginCandidates = KPluginLoader::findPlugins(QStringLiteral("org.kde.kwin.waylandbackends"),
|
||||
auto pluginIt = std::find_if(availablePlugins.begin(), availablePlugins.end(),
|
||||
[&pluginName] (const KPluginMetaData &plugin) {
|
||||
return plugin.pluginId() == pluginName;
|
||||
}
|
||||
);
|
||||
if (pluginCandidates.isEmpty()) {
|
||||
if (pluginIt == availablePlugins.end()) {
|
||||
std::cerr << "FATAL ERROR: could not find a backend" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
@ -530,11 +544,10 @@ int main(int argc, char * argv[])
|
|||
KWin::WaylandServer *server = KWin::WaylandServer::create(&a);
|
||||
server->init(parser.value(waylandSocketOption).toUtf8());
|
||||
|
||||
for (const auto &candidate: pluginCandidates) {
|
||||
if (qobject_cast<KWin::AbstractBackend*>(candidate.instantiate())) {
|
||||
if (qobject_cast<KWin::AbstractBackend*>((*pluginIt).instantiate())) {
|
||||
#if HAVE_INPUT
|
||||
// check whether it needs libinput
|
||||
const QJsonObject &metaData = candidate.rawData();
|
||||
const QJsonObject &metaData = (*pluginIt).rawData();
|
||||
auto it = metaData.find(QStringLiteral("input"));
|
||||
if (it != metaData.constEnd()) {
|
||||
if ((*it).isBool()) {
|
||||
|
@ -545,8 +558,6 @@ int main(int argc, char * argv[])
|
|||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!server->backend()) {
|
||||
std::cerr << "FATAL ERROR: could not instantiate a backend" << std::endl;
|
||||
|
|
Loading…
Reference in a new issue