Issue was raised when discussing the workaround in https://phabricator.kde.org/T10464 The relevant code is at: * https://github.com/KDE/kwin/blob/cfecb1e0770ca6c8fa879124e11b03081342b9ed/tabbox/tabboxhandler.cpp#L281 1. It first checks if a "plasma/look-and-feel/%1/contents/windowswitcher/WindowSwitcher.qml" file exists and uses that. 2. If not, it looks for a "kwin/tabbox/%1/contents/ui/main.qml" 3. Then it uses the hardcoded "informative" QML file "kwin/tabbox/informative/contents/ui/main.qml" as a fallback (I always wondered why it was using informative when I selected certain "look and feel" skins). So it seems we need a new function perform the QML loading stuff which returns a `QObject` or `nullptr`. Something like this: QObject *TabBoxHandlerPrivate::loadSwitcherItem(QString file) { if (file.isNull()) { m_qmlComponent->loadUrl(QUrl::fromLocalFile(file)); if (m_qmlComponent->isError()) { m_qmlComponent.reset(...) // ??? return nullptr; } else { QObject *object = m_qmlComponent->create(m_qmlContext.data()); return object } } } QObject *TabBoxHandlerPrivate::createSwitcherItem(bool desktopMode) { QString lookAndFeelFilepath = desktopMode ? ... : ... QString file = lookAndFeelFilepath; QObject *object = loadSwitcherItem(file); if (object != nullptr) { return object; } QString tabboxFilepath = ... QString file = tabboxFilepath; QObject *object = loadSwitcherItem(file); if (object != nullptr) { return object; } QString informativeTabboxFilepath = ... QString file = informativeTabboxFilepath; QObject *object = loadSwitcherItem(file); if (object != nullptr) { QStringList args; args << QStringLiteral("The Window Switcher failed to load, using Informative") KProcess::startDetached(QStringLiteral("kdialog"), args); return object; } else { QStringList args; args << QStringLiteral("The Window Switcher installation is broken, resources are missing.\nContact your distribution about this") KProcess::startDetached(QStringLiteral("kdialog"), args); return nullptr; } }
This means the kcm is wrong - I reworded the title accordingly. The informative theme is not part of KWin (any more) and not installed by default in most distributions. Using it as fallback is an obvious oversight.
The main reason I made this bug is for when a downloaded QML skin from the KDE Store is loaded but fails to load (eg: was written for KWin 4.x). However, you do raise a good point, I completely forgot "informative" is part of kdeplasma-addons. So it seems the hardcoded default needs to be... "org.kde.breath.desktop" so that it loads: /usr/share/plasma/look-and-feel/org.kde.breath.desktop/contents/windowswitcher/WindowSwitcher.qml However that still depends on the breeze package. KWin itself does not seem to ship with any "QML" tabbox skins that I can see. So does this mean it needs to somehow fallback to a C++ TabBox theme? Like the "kwin/effects/coverswitch" desktop effect? I'm not quite sure how it loads the C++ effects to be honest... Looking at the kcm code, it seems that the desktop effect itself has a "TabBox" config property. I take it that it will then take over the "Alt+Tab" and "Alt+Shift+Tab" shortcuts. * https://github.com/KDE/kwin/blob/cfecb1e0770ca6c8fa879124e11b03081342b9ed/kcmkwin/kwintabbox/main.cpp#L368 * https://github.com/KDE/kwin/blob/master/effects/coverswitch/coverswitch.kcfg#L35 * Falling back to a "kwin effect" skin sounds like a fairly complicated fallback, as you'd need to copy the kcm's save() code.
Well the fallback will have to be removed.
This got solved by including back the fallback theme into kwin repository https://invent.kde.org/plasma/kwin/-/commit/3ca1fc800d7f7d8b36a3ec5436f644439c6f0146