Update kde contribution

This commit is contained in:
Florian RICHER 2024-02-18 15:34:34 +01:00
parent deb8244597
commit 1377be120e

View file

@ -11,18 +11,17 @@ tags:
- linux
---
# Mes premières contributions à KDE
## Rapide rappel à propos de KDE
KDE est un projet qui a pour but de développer des logiciels open-source. Le projet comporte plusieurs éléments les plus connus.
- [KF5 ou KF6](https://develop.kde.org/products/frameworks/) est un ensemble de librairies utilisées pour le développement de l'ensemble des logiciels de KDE. Il est basé sur la librairie [QT](https://www.qt.io/).
> Exemple : Kirigami que l'on peut voir comme un "flutter".
> _Exemple_ : Kirigami que l'on peut voir comme un "flutter".
>
> Note:
> _Note:_
>
> KF5 => Basé sur QT5
>
> KF6 => Basé sur QT6
- [Plasma Shell](https://kde.org/fr/plasma-desktop/) est l'environnement de bureau développé pour Linux.
@ -30,17 +29,17 @@ KDE est un projet qui a pour but de développer des logiciels open-source. Le pr
## Ma configuration
Pour développer sur KDE, KDE fournis un utilitaire assez puissant `kdesrc-build`.
Il permet de configurer l'IDE, compiler, exécuter et la gestion des dépendances avec l'aide d'une seule ligne de commande.
Il permet de configurer l'IDE, compiler, exécuter et gérer les dépendances avec l'aide d'une seule ligne de commande.
Pour le configurer, il suffit de suivre la procédure sur ce lien [Configuration de l'environnement de développement](https://community.kde.org/Get_Involved/development/Set_up_a_development_environment).
Pour le configurer, il suffit de suivre la procédure sur ce [lien](https://community.kde.org/Get_Involved/development/Set_up_a_development_environment).
### Mes premières difficultés
Il faut savoir que quand j'ai commencé à vouloir contribuer au projet KDE. Le projet était en train de migrer de QT5 à QT6.
Donc, les configurations nécessaires pour compiler correctement la version 6 était nettement plus compliqué que maintenant.
Aujourd'hui, il suffit juste de suivre le lien ci-dessus et on peut direct travailler sur KDE 6.
Avant, on avait aucune documentation pour la migrer n'ont plus, il fallait fouiller sur Github ou sur les blogs pour réussir
Il n'y avait aucune documentation pour migrer la configuration fournie de base, il fallait fouiller sur Github ou sur les blogs pour réussir
à avoir la configuration.
Aujourd'hui, il suffit juste de suivre le lien ci-dessus et on peut directement travailler sur KDE 6.
Pour le développement sur KDE Plasma 6, j'ai dû faire quelques réajustements sur le fichier `~/.config/kdesrc-buildrc`.
@ -63,13 +62,13 @@ include ~/kde/src/kdesrc-build/data/build-include/kf6-kdepim.ksb
### Configurations utiles
1. Désactiver l'arrêt de la compilation lors d'une erreur de compilation.
#### Désactiver l'arrêt de la compilation lors d'une erreur de compilation.
En général, `kdesrc-build` s'adapte et retire tous les projets qui dépendent de la dépendance qui n'a pas réussi à compiler.
Le projet était encore en cours de développement donc les erreurs de compilations étaient très régulières.
J'ai tout simplement désactivé avec l'option `stop-on-failure false`.
2. Activer le support des LSP
#### Activer le support des LSP
C'est très pratique si on utilise VSCode ou même n'importe quel outil qui supporte les [LSP](https://microsoft.github.io/language-server-protocol/).
@ -78,14 +77,14 @@ Il suffit d'activer les options:
* `compile-commands-linking` => `true`
* `compile-commands-export` => `true`
3. Générer les projets VSCode
#### Générer les projets VSCode
Il va générer automatiquement les workspaces VSCode avec les extensions recommander et le paramètrage par défaut.
Ça permet de travailler dans de très bonne condition avec VSCode.
Il suffit de l'activer avec `generate-vscode-project-config true`
### Options utiles pour la commande kdesrc-build
#### Options utiles pour la commande kdesrc-build
* `-D` : Pour ne pas inclure les dépendances dans la compilation
> Exemple: kdesrc-build -D kate
@ -95,16 +94,17 @@ Il suffit de l'activer avec `generate-vscode-project-config true`
## Ma contribution
J'ai travaillé sur le support de la lampe torche pour l'environnement Plasma Mobile.
La fonctionnalité fonctionnait uniquement sur les [pinephones](https://pine64.org/devices/pinephone/) en utilisant le fichier en dure `/sys/devices/platform/led-controller/leds/white:flash/brightness`
J'ai contribué sur le support de la lampe torche pour l'environnement Plasma Mobile.
La lampe torche fonctionnait uniquement sur les [pinephones](https://pine64.org/devices/pinephone/) en utilisant le fichier en dure `/sys/devices/platform/led-controller/leds/white:flash/brightness`
([Source](https://invent.kde.org/plasma/plasma-mobile/-/blob/f970aa7acf2e9794ab4ed6b75e8f549bece83561/quicksettings/flashlight/flashlightutil.cpp#L17)).
J'ai réécris le module pour que ça fonctionne de manière générale sur tous les téléphones.
### Rappel sur le fonctionnement du noyau Linux autour des leds
Pour comprendre comment la fonctionnalité, un petit rappel s'impose autour du fonctionnement des leds avec le noyau Linux.
Dès qu'une led est détecté par le noyau, il va mettre à disposition plusieurs fichiers.
On les trouvent dans le dossier correspondant au driver et aussi l'emplacement physique sur le circuit.
Mais on peut aussi les trouver plus simplement dans `/sys/class/leds/`.
Dès qu'une led est détecté par le noyau, il va mettre à disposition plusieurs fichiers.
On les trouvent dans le dossier correspondant au driver et aussi à l'emplacement physique sur la carte mère ou sur le SOC.
Mais on peut aussi les trouver plus facilement dans le répertoire `/sys/class/leds/`.
> sys => Fichiers système
> class => Trier par class.
@ -119,23 +119,24 @@ On disposent de plusieurs fichiers importants :
### Explication du fonctionnement de mon code petit à petit
Tout d'abord, il faut savoir que j'utilise la libraire udev. Il est prévu que je migre vers la librairie [Solid](https://invent.kde.org/frameworks/solid).
Tout d'abord, il faut savoir que j'utilise la libraire Udev. Il est prévu que je migre vers la librairie [Solid](https://invent.kde.org/frameworks/solid) une fois le support des leds ajoutées.
Udev pour faire simple, c'est une librairie qui permet d'interagir avec les appareils assez directement sans intermédiaire.
La librairie permet de lister, filtrer, détecter si un appareil est connecté/déconnecté, ....
La librairie permet également de lister, filtrer, détecter si un appareil est connecté/déconnecté, ....
Pour commencer, je dois d'abord instancier Udev avec pour l'utiliser par la suite.
```cpp
struct udev *udev = udev_new();
```
Ensuite, je souhaite lister tous les périphériques qui m'intéressent donc ceux appartenant à la class `leds`.
Pour ça, il me suffit de créer un énumerateur qui me permettra de choisir tous mes filtres.
Ensuite, je liste tous les périphériques qui m'intéressent donc ceux appartenant à la class `leds`.
Pour ça, il me suffit de créer un énumerateur sur lequel on appliquera tous les filtres.
> On peut voir une class comme une catégorie d'appareils.
```cpp
struct udev_enumerate *enumerate = udev_enumerate_new(udev);
```
Je choisis de filtrer que ceux qui appartiennent à la class `leds`.
J'applique le filtre pour lister uniquement ceux qui appartiennent à la class `leds`.
```cpp
#define TORCH_SUBSYSTEM "leds"
@ -143,7 +144,7 @@ Je choisis de filtrer que ceux qui appartiennent à la class `leds`.
udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM);
```
Je filtre uniquement ceux qui ont dans le nom `flash` ou `torch`.
J'applique le filtre pour lister uniquement ceux qui ont dans le nom `flash` ou `torch`.
```cpp
udev_enumerate_add_match_sysname(enumerate, "*:torch");
@ -156,9 +157,8 @@ Puis je lance le scan avec mes filtres.
udev_enumerate_scan_devices(enumerate);
```
Au début, il faut savoir que je prenais le premier appareil avec le code ci-dessous mais certain téléphone ont une torche de couleur jaune et blanche.
Donc, certain utilisateur malheureusement ne pouvait pas utiliser la fonctionnalité.
Certain utilisateur malheureusement ne pouvait pas utiliser la fonctionnalité.
```cpp
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
@ -167,7 +167,7 @@ struct udev_list_entry *entry = udev_list_entry_get_next(devices);
[Source](https://invent.kde.org/plasma/plasma-mobile/-/blob/5c6a97caa52d549c0cb02b17fc65a3a7d729d237/quicksettings/flashlight/flashlightutil.cpp)
Donc, j'ai changé le code avec ce code ci-dessous qui permet d'itérer sur tous les appareils.
Donc, j'ai changé le code avec le code ci-dessous qui permet d'itérer sur tous les appareils.
```cpp
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
@ -203,8 +203,8 @@ const char *maxBrightness = udev_device_get_sysattr_value(device, "[NOM DU FICHI
Je lis d'abord le fichier 'color' et je regarde si la couleur est blanche sinon je continue.
Si je ne trouve pas de led de couleur blanche, je prends la dernière valeur récupérée.
Une fois pour appareil trouvé, il me reste plus qu'à récupérer les infos dont j'ai besoin.
Donc, la luminosité maximale `max_brightness` et la luminosité actuelle `brightness` pour correctement initialiser l'interface.
Une fois pour chaque appareil trouvé, il me reste plus qu'à récupérer les infos dont j'ai besoin.
Donc, la luminosité maximale `max_brightness` et la luminosité actuelle `brightness` pour correctement initialiser l'interface de Plasma Mobile.
Quand je souhaite changer la valeur, je dois d'abord convertir la valeur entière en chaîne de charactère.
@ -220,7 +220,7 @@ udev_device_set_sysattr_value(m_device, "brightness", nouvelle_valeur_en_char_*)
### Fichier final
Source : https://invent.kde.org/plasma/plasma-mobile/-/blob/d162f96a63600d5b45bb8294afdb84efd85833f9/quicksettings/flashlight/flashlightutil.cpp
[Source](https://invent.kde.org/plasma/plasma-mobile/-/blob/d162f96a63600d5b45bb8294afdb84efd85833f9/quicksettings/flashlight/flashlightutil.cpp)
```cpp
/*
* SPDX-FileCopyrightText: 2020 Han Young <hanyoung@protonmail.com>