La GUI officielle est un serveur d'affichage userland multiprocessus :
kernel
framebuffer + input
IPC local + mémoire partagée
|
v
/bin/gui
desktop + compositeur + window manager
launcher + barre des tâches
|
v
libgui.a
|
+-- /bin/gui-demo
+-- futures applications ELF
/bin/gui est le seul processus autorisé à mapper le framebuffer et à lire
les événements matériels. Une application ne reçoit jamais de pointeur vers
la mémoire d'une autre application : elle dessine dans une surface ARGB
allouée par shm_create(), puis transmet la capacité SHM au desktop par IPC.
L'ancienne interface se trouve dans /bin/gui-test. Elle reste lançable
manuellement lorsqu'aucun serveur d'affichage n'est actif, mais elle n'est
plus l'interface officielle.
La construction conserve les utilitaires de src/userland/cmd/, dont le
shell avec autocompletion, dans /bin. make disk.img reconstruit ces
programmes et les deux interfaces graphiques avant de regenerer l'image.
make verify-gui-image verifie que /bin/gui contient bien le desktop
et non l'ancienne interface de test.
Chaque application graphique est un ELF userland normal, lancé avec
fork() puis execve(). Le desktop ne contient aucun code spécifique à une
application.
Les primitives kernel ajoutées restent génériques :
- services IPC nommés et connexions bidirectionnelles ;
- messages copiés, bornés à 2048 octets ;
- passage contrôlé d'un descripteur SHM ;
- objets SHM paginés et comptés par références ;
- descripteurs IPC/SHM fermés automatiquement lors de
execve(); - déconnexion automatique lors de la terminaison d'un processus ;
- propriété exclusive du framebuffer et de la file d'entrée.
Le desktop associe chaque fenêtre à la connexion IPC attribuée par le kernel. Un client ne peut donc pas revendiquer une fenêtre appartenant à une autre connexion. La mort d'un client ferme toutes ses fenêtres sans arrêter le desktop.
Le window manager gère :
- z-order et fenêtre active ;
- focus clavier et événements souris traduits en coordonnées clientes ;
- capture souris pendant un déplacement ou redimensionnement ;
- clipping de la surface dans la zone cliente ;
- barre de titre, bordure et boutons fermer/minimiser/maximiser ;
- états normal, minimisé, maximisé, split gauche et split droite ;
- restauration de la géométrie normale ;
- taskbar avec activation, minimisation et restauration ;
- plusieurs applications et fenêtres simultanées.
Glisser une fenêtre sur le bord gauche ou droit active le split screen. Le bouton de maximisation restaure également une fenêtre maximisée ou en split.
Le bouton Apps lit dynamiquement les manifestes de
/share/applications/*.desktop. Un manifeste minimal contient :
Name=GUI Demo
Exec=/bin/gui-demoExec doit être un chemin absolu sous /bin. Ajouter une application au hub
ne nécessite aucune modification de /bin/gui.
- Inclure
libgui/include/gui.h. - Compiler un ELF userland séparé et le lier avec
libgui/libgui.apuislibc/libc.a. - Installer l'ELF dans
/bin. - Installer un manifeste dans
/share/applications.
Exemple :
#include <gui.h>
int main(void) {
gui_window_t *window =
gui_create_window("Application", 480, 320, GUI_WINDOW_DEFAULT);
if (window == 0)
return 1;
gui_clear(window, 0xFFF4F7FA);
gui_present(window, 0);
for (;;) {
gui_event_t event;
if (gui_wait_event(window, &event, 100) < 0)
break;
if (event.type == GUI_EVENT_PAINT ||
event.type == GUI_EVENT_RESIZE) {
gui_clear(window, 0xFFF4F7FA);
gui_present(window, 0);
} else if (event.type == GUI_EVENT_CLOSE) {
gui_destroy_window(window);
return 0;
}
}
return 1;
}/bin/gui-demo constitue l'implémentation de référence : il reçoit paint,
resize, focus, clavier et souris, puis redessine sa propre surface.
- format de surface unique : ARGB 32 bits ;
- un écran et un serveur d'affichage ;
- compositeur logiciel avec redraw complet ;
- aucun effet animé ou accélération GPU ;
- manifestes volontairement simples (
NameetExec).
Ces limites ne changent pas le modèle applicatif : les futures applications restent des processus indépendants utilisant la même ABI.