Enable plasma-keyboard consumption without GPLv3?

Hey @espidev , @apol , @sitter and other interested parties and developers of plasma-keyboard I may have forgotten to list here explicitly.

I was under the naive assumption, that plasma-keyboard is licensed in a similar fashion to kwin, meaning it could be used in contexts that are allergic to GPLv3 (medical devices in our case). I am a big fan of the GPL, but my hands are tied by legal here. We would like to use plasma-keyboard, and I would like to contribute to it some more myself to enable the features we need for our use-case. But GPLv3 is sadly a no-go for our use-case and thus we would not be able to use plasma-keyboard.

Thus this question: would it be possible to relicense some files to enable usage in a GPlv2 context? Here is a list of files that are currently encumbered:

src/dbus/org.sigxcpu.Feedback.Haptic.xml:- SPDX-License-Identifier: GPL-3.0-or-latersrc/dbus/org.sigxcpu.Feedback.xml:- SPDX-License-Identifier: GPL-3.0-or-latersrc/layouts/ar_AR/digits.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ar_AR/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ar_AR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ar_AR/numbers.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ar_AR/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/bg_BG/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/bg_BG/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/cs_CZ/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/da_DK/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/de_DE/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/el_GR/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/el_GR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/es_ES/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/es_ES/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/es_ES/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/es_MX/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/es_MX/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/es_MX/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/et_EE/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fa_FA/digits.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fa_FA/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fa_FA/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fa_FA/numbers.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fa_FA/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fallback/dialpad.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fallback/digits.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fallback/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fallback/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fallback/numbers.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fallback/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fi_FI/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fr_CA/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/fr_FR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/he_IL/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/he_IL/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/he_IL/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/hi_IN/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/hi_IN/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/hr_HR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/hu_HU/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/it_IT/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ja_JP/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ja_JP/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ja_JP/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ko_KR/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ko_KR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ko_KR/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/lv_LV/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/nb_NO/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/pl_PL/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/pt_BR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/pt_PT/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ro_RO/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ru_RU/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/ru_RU/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/sk_SK/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/sl_SI/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/sq_AL/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/sr_SP/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/sr_SP/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/sv_SE/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/th_TH/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/th_TH/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/th_TH/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/tr_TR/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/uk_UA/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/uk_UA/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/vi_VN/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/vi_VN/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/zh_CN/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/zh_CN/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/zh_CN/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/zh_TW/handwriting.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/zh_TW/main.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/layouts/zh_TW/symbols.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/org.kde.plasma.keyboard.metainfo.xml:  <project_license>GPL-3</project_license>src/qmlplugin/BreezePopup.qml:// SPDX-License-Identifier: GPL-3.0-onlysrc/sounds/keyboard_tick2_quiet.wav.license:SPDX-License-Identifier: GPL-3.0-onlysrc/styles/breeze/style.qml:// SPDX-License-Identifier: GPL-3.0-only

Quite a few others are dual-licensed:

kcm/CMakeLists.txt:# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
kcm/plasmakeyboardkcm.cpp:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
kcm/plasmakeyboardkcm.h:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
kcm/ui/LocaleSelectorListView.qml:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
kcm/ui/LocaleSelectorSidebar.qml:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
kcm/ui/main.qml:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
kcm/ui/main_handset.qml:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
kcm/ui/main_mediacenter.qml:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/inputlisteneritem.cpp:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/inputlisteneritem.h:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/inputmethod.cpp:    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/inputmethod_p.h:    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/inputpanelwindow.cpp:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/inputpanelwindow.h:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/inputplugin.cpp:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/inputplugin.h:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/main.cpp:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/org.kde.plasma.keyboard.desktop:# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/plasmakeyboardsettings.kcfg: - SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/plasmakeyboardsettings.kcfgc:# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/qml/main.qml:    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
src/qmlplugin/BreezeConstants.qml:// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/qmlplugin/BreezeKeyPanel.qml:// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/resources.qrc: - SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/sounds/keyboard_tick2_quiet.wav.license:SPDX-License-Identifier: GPL-3.0-only
src/vibration.cpp:// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/vibration.h:// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
src/vibrationevent.h:// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL

Could we apply this throughout plasma-keyboard? Generally, it would be awesome if plasma-keyboard could stay similarly licensed to kwin, to enable a fully operational kwin in more deployment scenarios.

Happy to hear your thoughts on this!

I don’t think anything there that is doesn’t allow for GPLv2 is under my name, but if it was I’m fine with relicencing.

Most of src/layouts comes from QtVK upstream. Your client will probably have these licenced, you can find ways to have the ones from upstream get used. @espidev did leave an environment variable to do so. It will need testing.

This leaves us with:

src/sounds/keyboard_tick2_quiet.wav
src/styles/breeze/style.qml

I guess we can see why these need to be GPLv3, they can probably be made GPLv2+.

AFAIU, GPLv2+ should be acceptable (at least it was on my past job where they had a similar limitation).

1 Like

Yes exactly, GPLv2+ would be perfect for us too. Can you or @espidev give me a hint wrt the env var to use the upstream QtVK files?

The .wav file we can probably patch out in yocto, but ideally a differently licensed sound file could be obtained.

The breeze style.qml though I’m unsure about - eventually we want to provide our own style anyhow, so maybe we could override this short-term by forking the repo and replacing the style with our custom one. But ideally that would not be required right away. Happy to hear your thoughts on that matter. And many thanks for taking this request into consideration! Much appreciated.

tbf, I’d expect the breeze style to be good enough for any generic uses, so yes it would be good if we can ship it in good conditions.

On the layouts, see the layouts paragraph on the readme:

Hey, sorry for the delay. The breeze style was based on the qt-virtualkeyboard one, which is either commercial or GPLv3 (though we just took it as v3): qtvirtualkeyboard/src/styles/builtin/default/style.qml at dev · qt/qtvirtualkeyboard · GitHub

The keyboard sound was taken from ubuntu touch who licensed it as GPLv3 I think? I forget exactly where this file was hosted.

BreezePopup.qml was a mistake, I meant to have it as lgpl 2.1: Use consistent license for BreezePopup (!63) · Merge requests · Plasma / Plasma Keyboard · GitLab

can you then re-instantiate the license header for the files taken from commercial Qt? i.e. to make it clear that those could still be used under that license?

generally, is there a reason src/layouts was forked from upstream? can you not use the files from there directly? an environment variable to not use them would not be sufficient, as the GPLv3 code would still get packaged and deployed, thereby encumbering the device. But I could hopefully come up with a compile flag to not deploy those files at all, which may help.

I can add the commercial Qt license to that header. Technically I could also just add it back to the layouts files too I think.

The reason why src/layouts was forked is because of the intention to eventually add more types of keys and extend key behavior (ex. show/hide language, hide keyboard button, start/ctrl modifier). We also have some tweaks for our own use cases, such as the alternative number keys on the top row of the English keyboard.

I would welcome a patch for adding a compile flag upstream as well.

If you could re-add the license headers, that would be much appreciated from our PoV.

I’ll also figure out whether we can make the env var a compile flag, and whether that would be sufficient for us from a legal PoV.

Cheers, much appreciated!

1 Like